Escalado automático de los pods de AKS mediante métricas de Application Gateway (beta)
A medida que aumenta el tráfico entrante, es fundamental escalar verticalmente las aplicaciones en función de la demanda.
En el siguiente tutorial, se explica cómo puede usar la métrica AvgRequestCountPerHealthyHost
de Application Gateway para escalar verticalmente la aplicación. AvgRequestCountPerHealthyHost
mide el promedio de solicitudes enviadas a un grupo de back-end específico y la combinación de configuración HTTP de back-end.
Use los dos componentes siguientes:
Azure Kubernetes Metric Adapter
: se usa el adaptador de métricas para exponer las métricas de Application Gateway a través del servidor de métricas. El adaptador de métricas de Azure Kubernetes es un proyecto de código abierto en Azure, similar al controlador de entrada de Application Gateway.Horizontal Pod Autoscaler
: usamos HPA para usar métricas de Application Gateway y establecer como destino una implementación para el escalado.
Nota:
El adaptador de métricas de Azure Kubernetes ya no se mantiene. El escalado automático controlado por eventos (KEDA) de Kubernetes es una alternativa.
Consulte también Puerta de enlace de aplicaciones para contenedores.
Configuración del adaptador de métricas de Azure Kubernetes
En primer lugar, cree una entidad de servicio de Microsoft Entra y asígnela
Monitoring Reader
acceso a través del grupo de recursos de Application Gateway.applicationGatewayGroupName="<application-gateway-group-id>" applicationGatewayGroupId=$(az group show -g $applicationGatewayGroupName -o tsv --query "id") az ad sp create-for-rbac -n "azure-k8s-metric-adapter-sp" --role "Monitoring Reader" --scopes applicationGatewayGroupId
Ahora, implemente el
Azure Kubernetes Metric Adapter
mediante la entidad de servicio de Microsoft Entra creada anteriormente.kubectl create namespace custom-metrics # use values from service principal created previously to create secret kubectl create secret generic azure-k8s-metrics-adapter -n custom-metrics \ --from-literal=azure-tenant-id=<tenantid> \ --from-literal=azure-client-id=<clientid> \ --from-literal=azure-client-secret=<secret> kubectl apply -f kubectl apply -f https://raw.githubusercontent.com/Azure/azure-k8s-metrics-adapter/master/deploy/adapter.yaml -n custom-metrics
Cree un recurso de
ExternalMetric
con el nombreappgw-request-count-metric
. Este recurso indica al adaptador de métricas que exponga métricaAvgRequestCountPerHealthyHost
para recursomyApplicationGateway
en el grupo de recursosmyResourceGroup
. Puede usar el campofilter
para establecer como destino un grupo de back-end específico y la configuración HTTP de back-end en Application Gateway.apiVersion: azure.com/v1alpha2 kind: ExternalMetric metadata: name: appgw-request-count-metric spec: type: azuremonitor azure: resourceGroup: myResourceGroup # replace with your application gateway's resource group name resourceName: myApplicationGateway # replace with your application gateway's name resourceProviderNamespace: Microsoft.Network resourceType: applicationGateways metric: metricName: AvgRequestCountPerHealthyHost aggregation: Average filter: BackendSettingsPool eq '<backend-pool-name>~<backend-http-setting-name>' # optional
Ahora puede hacer una solicitud al servidor de métricas para ver si la nueva métrica se está exponiendo:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/appgw-request-count-metric"
# Sample Output
# {
# "kind": "ExternalMetricValueList",
# "apiVersion": "external.metrics.k8s.io/v1beta1",
# "metadata":
# {
# "selfLink": "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/appgw-request-count-metric",
# },
# "items":
# [
# {
# "metricName": "appgw-request-count-metric",
# "metricLabels": null,
# "timestamp": "2019-11-05T00:18:51Z",
# "value": "30",
# },
# ],
# }
Uso de la nueva métrica para escalar verticalmente la implementación
Una vez que podamos exponer appgw-request-count-metric
a través del servidor de métricas, estamos listos para usar Horizontal Pod Autoscaler
para escalar verticalmente la implementación de destino.
En el ejemplo siguiente, tenemos como destino una implementación de ejemplo aspnet
. Escalamos verticalmente Pods cuando appgw-request-count-metric
> 200 por Pod hasta un máximo de 10
Pods.
Reemplace el nombre de la implementación de destino y aplique la siguiente configuración de escalado automático:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: deployment-scaler
spec:
scaleTargetRef:
apiVersion: networking.k8s.io/v1
kind: Deployment
name: aspnet # replace with your deployment's name
minReplicas: 1
maxReplicas: 10
metrics:
- type: External
external:
metricName: appgw-request-count-metric
targetAverageValue: 200
Pruebe la configuración mediante una herramienta de prueba de carga como apache bench:
ab -n10000 http://<applicaiton-gateway-ip-address>/
Pasos siguientes
- Solución de problemas comunes del controlador de entrada: solucione cualquier problema con el controlador de entrada.