Share via


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

  1. 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
    
  2. 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
    
  3. Cree un recurso de ExternalMetric con el nombre appgw-request-count-metric. Este recurso indica al adaptador de métricas que exponga métrica AvgRequestCountPerHealthyHost para recurso myApplicationGateway en el grupo de recursos myResourceGroup. Puede usar el campo filter 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