Skip to content

Scale OpenFaaS functions to zero replicas after a period of inactivity

License

Notifications You must be signed in to change notification settings

ionutz89/faas-idler

This branch is up to date with viveksyngh/faas-idler:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

760f279 · Nov 16, 2020

History

62 Commits
Aug 28, 2018
Jul 11, 2018
Jan 25, 2020
Nov 16, 2020
Aug 28, 2018
Dec 4, 2018
Aug 28, 2018
Aug 28, 2018
Oct 11, 2020
Oct 11, 2020
Oct 11, 2020
Oct 11, 2020
Nov 16, 2020
Nov 16, 2020
Aug 28, 2018
Nov 16, 2020
Jul 9, 2019
Apr 16, 2020
Apr 16, 2020
Nov 16, 2020
Nov 16, 2020
Nov 16, 2020
Nov 16, 2020

Repository files navigation

faas-idler

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.

Building

The build requires Docker and builds a local Docker image.

TAG=0.2.0 make build
TAG=0.2.0 make push

Usage

Quick start

Swarm:

docker stack deploy func -c docker-compose.yml

Kubernetes

The faas-idler is installed as part of the helm chart, make sure that you pass the argument "--set faasIdler.dryRun=false" if you want the idler to go live and make changes to the API.

Activating a function for scale to zero

Now decorate some functions with the label: com.openfaas.scale.zero: "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 "com.openfaas.scale.zero=true"

Or if using the openfaas-operator and CRD:

...
spec:
  labels:
    com.openfaas.scale.zero: "true"
...

Configuration

  • 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. 15m (Golang duration)
reconcile_interval i.e. 1m (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)

Logs

You can view the logs to show reconciliation in action.

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

About

Scale OpenFaaS functions to zero replicas after a period of inactivity

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 90.5%
  • Makefile 5.6%
  • Dockerfile 3.9%