Scale OpenFaaS functions to zero replicas after a period of inactivity
Clone or download
rdimitrov and alexellis Refactor the usage of .PHONY targets
Signed-off-by: Radoslav Dimitrov <>
Latest commit f6423e4 Dec 24, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Add PR template from OpenFaas cloud Aug 28, 2018
docs Add diagram Jul 11, 2018
.DEREK.yml Add Derek support Aug 28, 2018
.travis.yml Add file which points to the faas contrib guide Aug 28, 2018
Dockerfile Bump Alpine to 3.8 Oct 1, 2018
Dockerfile.arm64 Use golang-alpine for building the ARM64 image Jan 16, 2019
Dockerfile.armhf Bump Alpine to 3.8 Oct 1, 2018
Gopkg.lock Initial sync of local version Jul 10, 2018
Gopkg.toml Initial sync of local version Jul 10, 2018
LICENSE Update LICENSE Aug 28, 2018
Makefile Refactor the usage of .PHONY targets Jan 16, 2019 secret_mount_path env variable Dec 4, 2018
docker-compose.yml Bump docker image version to 0.1.9 Nov 18, 2018
faas-idler-dep.yml Bump docker image version to 0.1.9 Nov 18, 2018


[Build Status]

Scale OpenFaaS functions to zero replicas after a period of inactivity

Premise: functions (Deployments) can be scaled to 0/0 replicas from 1/1 or N/N replicas when they are not receiving traffic. Traffic is observed from Prometheus metrics collected in the OpenFaaS API Gateway.

Scaling to zero requires an "un-idler" or a blocking HTTP proxy which can reverse the process when incoming requests attempt to access a given function. This is done through the OpenFaaS API Gateway through which every incoming call passes - see Add feature: scale from zero to 1 replicas #685.

faas-idler is implemented as a controller which polls Prometheus metrics on a regular basis and tries to reconcile a desired condition - i.e. zero replicas -> scale down API call.


The build requires Docker and builds a local Docker image.

TAG=0.1.9 make build
TAG=0.1.9 make push


Quick start


docker stack deploy func -c docker-compose.yml


kubectl apply -f faas-idler-dep.yml

Now decorate some functions with the label: true and watch the idler scale them to zero. You should also change the -dry-run flag to false. For example:

faas-cli store deploy figlet --label ""


  • Environmental variables:

On Kubernetes the gateway_url needs to contain the suffix of the namespace you picked at deploy time. This is usually .openfaas and is pre-configured with a default.

Try using the ClusterIP/Cluster Service instead and port 8080.

env_var description
gateway_url The URL for the API gateway i.e. http://gateway:8080 or http://gateway.openfaas:8080 for Kubernetes
prometheus_host host for Prometheus
prometheus_port port for Prometheus
inactivity_duration i.e. 10m (Golang duration)
reconcile_interval i.e. 30s (default value)
secret_mount_path default /var/secrets/, path from which basic-auth-user and basic-auth-password files are read
write_debug default false, set to true to enable verbose logging for debugging / troubleshooting
  • Command-line args

-dry-run - don't send scaling event

How it works:

gateway_function_invocation_total is measured for activity over duration i.e. 1h of inactivity (or no HTTP requests)


You can view the logs to show reconciliation in action.

kubectl logs -n openfaas -f deploy/faas-idler