Azure Functions on Kubernetes with KEDA
The Azure Functions runtime provides flexibility in hosting where and how you want. KEDA (Kubernetes-based Event Driven Autoscaling) pairs seamlessly with the Azure Functions runtime and tooling to provide event driven scale in Kubernetes.
How Kubernetes-based functions work
The Azure Functions service is made up of two key components: a runtime and a scale controller. The Functions runtime runs and executes your code. The runtime includes logic on how to trigger, log, and manage function executions. The Azure Functions runtime can run anywhere. The other component is a scale controller. The scale controller monitors the rate of events that are targeting your function, and proactively scales the number of instances running your app. To learn more, see Azure Functions scale and hosting.
Kubernetes-based Functions provides the Functions runtime in a Docker container with event-driven scaling through KEDA. KEDA can scale in to 0 instances (when no events are occurring) and out to n instances. It does this by exposing custom metrics for the Kubernetes autoscaler (Horizontal Pod Autoscaler). Using Functions containers with KEDA makes it possible to replicate serverless function capabilities in any Kubernetes cluster. These functions can also be deployed using Azure Kubernetes Services (AKS) virtual nodes feature for serverless infrastructure.
Managing KEDA and functions in Kubernetes
To run Functions on your Kubernetes cluster, you must install the KEDA component. You can install this component using Azure Functions Core Tools.
Installing with Helm
There are various ways to install KEDA in any Kubernetes cluster including Helm. Deployment options are documented on the KEDA site.
Deploying a function app to Kubernetes
You can deploy any function app to a Kubernetes cluster running KEDA. Since your functions run in a Docker container, your project needs a
Dockerfile. If it doesn't already have one, you can add a Dockerfile by running the following command at the root of your Functions project:
The Core Tools automatically create the Dockerfile for Azure Functions written in .NET, Node, Python, or PowerShell. For function apps written in Java, the Dockerfile must be created manually. Use the Azure Functions image list to find the correct image to base the Azure Function.
func init --docker-only
To build an image and deploy your functions to Kubernetes, run the following command:
The Core Tools will leverage the docker CLI to build and publish the image. Be sure to have docker installed already and connected to your account with
func kubernetes deploy --name <name-of-function-deployment> --registry <container-registry-username>
<name-of-function-deployment>with the name of your function app.
The deploy command executes a series of actions:
- The Dockerfile created earlier is used to build a local image for the function app.
- The local image is tagged and pushed to the container registry where the user is logged in.
- A manifest is created and applied to the cluster that defines a Kubernetes
Secrets, which includes environment variables imported from your
Deploying a function app from a private registry
The above flow works for private registries as well. If you are pulling your container image from a private registry, include the
--pull-secret flag that references the Kubernetes secret holding the private registry credentials when running
func kubernetes deploy.
Removing a function app from Kubernetes
After deploying you can remove a function by removing the associated
kubectl delete deploy <name-of-function-deployment> kubectl delete ScaledObject <name-of-function-deployment> kubectl delete secret <name-of-function-deployment>
Uninstalling KEDA from Kubernetes
Steps to uninstall KEDA are documented on the KEDA site.
Supported triggers in KEDA
KEDA has support for the following Azure Function triggers:
HTTP Trigger support
You can use Azure Functions that expose HTTP triggers, but KEDA doesn't directly manage them. You can leverage the KEDA prometheus trigger to scale HTTP Azure Functions from 1 to n instances.
For more information, see the following resources: