Azure Kubernetes Metric Adapter
NOTE: This project is no longer actively maintained and some of the information might be outdated. Please checkout KEDA. The scenarios described below have been ported to that project.
TLDR; The Azure Kubernetes Metric Adapter is a experimental component that enables you to scale your application deployment pods running on any Kubernetes cluster using the Horizontal Pod Autoscaler (HPA) with External Metrics from Azure Resources (such as Service Bus Queues) and Custom Metrics stored in Application Insights.
Checkout a video showing how scaling works with the adapter, deploy the adapter or learn by going through the walkthrough.
I currently work for an awesome team at Microsoft called CSE (Commercial Software Engineering), where we work with customers to help them solve their challenging problems. One of the goals of my specific team inside CSE is to identify repeatable patterns our customers face. It is a challenging, but rewarding role where I get to work on some of the most interesting and cutting edge technology. Check out this awesome video that talks about how my team operates.
While working with customers at a recent engagement, I recognized a repeating pattern with in the monitoring solutions we were implementing on Azure Kubernetes Service (AKS) with customers. We had 5 customers in the same room and 3 of them wanted to scale on custom metrics being generated by their applications. And so the Azure Kubernetes Metric Adapter was created.
Why do we need the Azure Kubernetes Metric Adapter
One of the customers was using Prometheus and so we started to look at the Kubernetes Prometheus metric adapter, which solves the problem of scaling on custom metrics when you are using Prometheus in your cluster. The Prometheus adapter using the custom metrics api to scale instead of heapster. You can learn more about the direction Kubernetes is moving with custom metrics here.
Two of the other customers were not using Prometheus, instead they using Azure services such as Azure Monitor, Log Analytics and Application Insights. At the engagement, one of the customers started to implement their own custom scaling solution. This seemed a bit repetitive as the other customer where not going to be reuse there solution. And so Azure Kubernetes Metric Adapter was created.
What is the Azure Kubernetes Metric Adapter
The Azure Kubernetes Metric Adapter enables you to scale your application deployment pods running on AKS (or any Kubernetes cluster) using the Horizontal Pod Autoscaler (HPA) with External Metrics from Azure Resources (such as Service Bus Queues) and Custom Metrics stored in Application Insights.
That is a bit of a mouth full so let’s take a look at wha the solution looks like when deployed onto your cluster:
The Azure Metric Adapter is deployed onto you cluster and wired up the Horizontal Pod Autoscaler (HPA). The HPA checks in periodically with the Adapter to get the custom metric defined by you. The adapter in turn calls to an Azure endpoint to retrieve the metric and give it back to the HPA. The HPA then evaluates the value and compares it to the target value you have configured for a given deployment. Based on an algorithm the HPA will either leave you deployment alone, scale up the pods or scale them down.
As you can see you there is no custom code needed to scale with custom or external metrics when using the Adapter. You deploy the Adapter, configure an HPA and the rest of the scaling is taken care of by Kubernetes.
When can you use it?
It is available now as an experiment (alpha state - don’t run in production). You should try it out on your development and test environments and give feed back on what works, what doesn’t on github issues, and any features you want to see.
How can you use it?
There are two main scenarios that have been addressed first and you can see a step by step walk through for each, though you can scale on any Application Insights metric or Azure Monitor Metric.
- Scaling using Queue count from Azure Service Bus
- Scaling using Request Per Second from Application Insights
If you prefer to see it in action checkout this video:
Deploying
First you deploy it to your cluster (requires some authorization setup on you cluster)
kubectl apply -f https://raw.githubusercontent.com/Azure/azure-k8s-metrics-adapter/master/deploy/adapter.yaml
Next you create an HPA and define a few values. An example would be:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: consumer-scaler
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: consumer-scaler
minReplicas: 1
maxReplicas: 10
metrics:
- type: External
external:
metricName: queuemessages
metricSelector:
matchLabels:
metricName: Messages
resourceGroup: sb-external-example
resourceName: sb-external-ns
resourceProviderNamespace: Microsoft.Servicebus
resourceType: namespaces
aggregation: Total
filter: EntityName_eq_externalq
targetValue: 30
And deploy the HPA and watch your deployment scale:
kubectl apply -f hpa.yaml
kubectl get hpa consumer-scaler -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
consumer-scaler Deployment/consumer 0/30 1 10 1 1h
consumer-scaler Deployment/consumer 27278/30 1 10 1 1h
consumer-scaler Deployment/consumer 26988/30 1 10 4 1h
consumer-scaler Deployment/consumer 26988/30 1 10 4 1h consumer-scaler Deployment/consumer 26702/30 1 10 4 1h
consumer-scaler Deployment/consumer 26702/30 1 10 4 1h
consumer-scaler Deployment/consumer 25808/30 1 10 4 1h
consumer-scaler Deployment/consumer 25808/30 1 10 4 1h consumer-scaler Deployment/consumer 24784/30 1 10 8 1h consumer-scaler Deployment/consumer 24784/30 1 10 8 1h
consumer-scaler Deployment/consumer 23775/30 1 10 8 1h
consumer-scaler Deployment/consumer 22065/30 1 10 8 1h
consumer-scaler Deployment/consumer 22065/30 1 10 8 1h
consumer-scaler Deployment/consumer 20059/30 1 10 8 1h
consumer-scaler Deployment/consumer 20059/30 1 10 10 1h
And your that’s it to enable auto scaling on External Metric. Checkout the samples for more examples.
Wrapping up
Hope you enjoy the Metric Adapter and can use it to scale your deployments automatically so you can have more time to sip coffee, tea, or just read books. Please be sure to report any bugs, features, challenges you might have with it.
And if you really like it tweet about it, star the repo, and drop a thank you in the issues.
Comments