Compartilhar via


Escale automaticamente seus pods do AKS usando métricas do Gateway de Aplicativo do Azure

À medida que o tráfego de entrada aumenta, ele se torna crucial para escalar verticalmente seus aplicativos com base na demanda.

Esse artigo explica como você pode usar a métrica AvgRequestCountPerHealthyHost no Gateway de Aplicativo do Azure para dimensionar pods do Azure Kubernetes Service (AKS) para um aplicativo. A métrica AvgRequestCountPerHealthyHost mede a média de solicitações enviadas para uma combinação específica de um pool de backend e uma configuração HTTP de backend.

Use os dois componentes a seguir:

  • Adaptador de métricas do Azure Kubernetes: use este componente para expor métricas do Application Gateway por meio do servidor de métricas. É um projeto de código aberto no Azure, semelhante ao Gateway de Aplicativo do Azure Controlador de entrada.
  • Horizontal Pod Autoscaler: use esse componente para aplicar métricas do Gateway de Aplicativo do Azure e direcionar uma implantação para escala.

Observação

O Adaptador de Métricas do Kubernetes do Azure não é mais mantido. O KEDA (Dimensionamento Automático Controlado por Eventos) do Kubernetes é uma alternativa.

Dica

Considere o Gateway de Aplicativo do Azure para contêineres para sua solução de entrada no Kubernetes. Para obter mais informações, veja Dimensionamento e disponibilidade do Gateway de Aplicativo do Azure para contêineres.

Configurar o Adaptador de Métricas do Azure Kubernetes

  1. Crie uma entidade de serviço do Microsoft Entra e atribua a ela Monitoring Reader acesso sobre o grupo de recursos da implantação do Gateway de Aplicativo do Azure:

    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. Implante o Adaptador de Métricas do Azure Kubernetes usando a entidade de serviço do Microsoft Entra que você criou 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. Crie um ExternalMetric recurso com o nome appgw-request-count-metric. Esse recurso instrui o adaptador de métrica a expor a AvgRequestCountPerHealthyHost métrica para o myApplicationGateway recurso no myResourceGroup grupo de recursos. Você pode usar o campo filter para direcionar um pool de backend específico e uma configuração HTTP de backend na implantação do Gateway de Aplicativo do Azure.

    apiVersion: azure.com/v1alpha2
    kind: ExternalMetric
    metadata:
    name: appgw-request-count-metric
    spec:
        type: azuremonitor
        azure:
            resourceGroup: myResourceGroup # replace with your Application Gateway deployment's resource group name
            resourceName: myApplicationGateway # replace with your Application Gateway deployment's name
            resourceProviderNamespace: Microsoft.Network
            resourceType: applicationGateways
        metric:
            metricName: AvgRequestCountPerHealthyHost
            aggregation: Average
            filter: BackendSettingsPool eq '<backend-pool-name>~<backend-http-setting-name>' # optional
    

Agora você pode fazer uma solicitação ao servidor de métricas para ver se a nova métrica está sendo exposta:

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",
#       },
#     ],
# }

Use a nova métrica para ampliar a implantação

Depois de expor appgw-request-count-metric por meio do servidor de métricas, você estará pronto para usar o Horizontal Pod Autoscaler para dimensionar sua implantação de destino.

O exemplo a seguir tem como alvo uma implantação de amostra denominada aspnet. Você aumenta os pods quando cada pod appgw-request-count-metric é 200 criado, até um máximo de 10 pods.

Substitua o nome da implantação de destino e aplique a seguinte configuração de dimensionamento automático:

apiVersion: autoscaling/v2
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

Teste sua configuração usando uma ferramenta de teste de carga como o ApacheBench:

ab -n10000 http://<application-gateway-ip-address>/