Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Configure horizontal pod autoscaling with Prometheus metrics

Última atualização: Sep 12, 2026

O HPA oferece suporte nativo a CPU e memória, mas esses recursos podem não atender a cenários mais complexos. Este tópico explica como converter Custom Metrics e External Metrics do Managed Service for Prometheus em métricas compatíveis com o HPA para configurar um dimensionamento automático mais flexível de scale-out e scale-in.

Como funciona

O fluxo de dados percorre três camadas:

  1. O Prometheus Service coleta métricas das suas cargas de trabalho e da infraestrutura.

  2. O ack-alibaba-cloud-metrics-adapter lê as métricas do Prometheus, transforma-as com base em regras configuráveis e as expõe por meio da Kubernetes Custom Metrics API (custom.metrics.k8s.io) ou da External Metrics API (external.metrics.k8s.io).

  3. O HPA consulta o adapter periodicamente e ajusta a contagem de réplicas da carga de trabalho alvo.

Dois tipos de métricas estão disponíveis:

  • Custom Metric: métrica associada a um objeto do Kubernetes, como um pod. Ideal para dimensionamento por pod (por exemplo, conjunto de memória em uso ou taxa de requisições).

  • External Metric: métrica não vinculada a um objeto específico do Kubernetes. Recomendada para dimensionamento global, como o total de consultas por segundo (QPS) em todos os pods.

Sempre que possível, prefira Custom Metrics a External Metrics. A Custom Metrics API é mais fácil de restringir pelos administradores, enquanto a External Metrics API pode expor qualquer métrica do Prometheus.

Pré-requisitos

Para implantar o ack-alibaba-cloud-metrics-adapter, faça logon no console do ACK e acesse Marketplace > Marketplace .

Etapa 1: Obter dados de monitoramento do Prometheus

Opção A: Usar métricas nativas do ACK

O Prometheus Service vem instalado por padrão no ACK e coleta diversas métricas, incluindo:

  • Métricas de contêiner do cAdvisor

  • Métricas de infraestrutura do Node Exporter

  • Métricas do GPU Exporter

  • Quaisquer métricas adicionais conectadas ao Prometheus Service

Para visualizar todas as métricas conectadas:

  1. Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Prometheus Monitoring.

  3. No canto superior direito, clique em Alert Settings . Se o link não aparecer, atualize o Managed Service for Prometheus para a versão mais recente. Consulte Prerequisites.

  4. No console do Prometheus Service, clique em Settings no painel de navegação à esquerda para visualizar todas as métricas conectadas.

Opção B: Expor métricas personalizadas de um pod

Se sua aplicação expuser métricas no formato Prometheus, utilize um ServiceMonitor para coletá-las. Este exemplo implanta uma aplicação de amostra que expõe http_requests_total e configura a coleta.

Implantar a aplicação de exemplo

  1. Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.

  3. Na página Deployments, clique em Create from YAML. Na página Create from YAML, defina Sample Template como Custom, cole o YAML abaixo e clique em Create.

    Detalhes do YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/autoscale-demo:v0.1.2-dfbc5fd-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      ports:
        - port: 8080
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: sample-app
      type: ClusterIP

Adicionar um ServiceMonitor

  1. Faça logon no console do Application Real-Time Monitoring Service (ARMS).

  2. No painel de navegação à esquerda, clique em Integration Management. Na página Integration Management, na aba Integrated Environments, selecione sua Region e clique no ambiente correspondente ao seu cluster.

  3. Na página do ambiente de contêiner, clique na aba Metric Scraping . No painel de navegação à esquerda, clique em Service Monitor e, em seguida, clique em Create . No painel Add ServiceMonitor Configuration, clique em YAML, cole o YAML abaixo e siga as instruções na tela para criar o ServiceMonitor.

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      annotations:
        arms.prometheus.io/discovery: 'true'
      name: sample-app
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        port: http
        path: /metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          app: sample-app

Verificar o status do monitoramento

  1. Clique na aba Self-Monitoring. Na aba Targets, confirme se default/sample-app/0(1/1 up) está sendo exibido. Isso confirma que o Prometheus está coletando dados da aplicação.

  2. No painel do Prometheus, consulte http_requests_total para confirmar o fluxo de dados.

Etapa 2: Configurar o ack-alibaba-cloud-metrics-adapter

O adapter converte métricas do Prometheus em métricas legíveis pelo HPA do Kubernetes por meio de quatro operações por regra: descoberta, associação, nomenclatura e consulta. As seções a seguir constroem uma regra completa de forma incremental.

Atualizar a configuração do adapter

  1. Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do seu cluster. No painel de navegação à esquerda, clique em Applications > Helm.

  3. Localize ack-alibaba-cloud-metrics-adapter e clique em Update na coluna Actions.

  4. No painel Update Release, atualize o YAML com sua configuração e clique em OK.

    Detalhes do YAML

    AlibabaCloudMetricsAdapter:
    ......
      prometheus:
        enabled: true    # Enable the Prometheus adapter.
        # Prometheus Service data request URL. See "Get the Prometheus data request URL" below.
        url: https://cn-beijing.arms.aliyuncs.com:9443/api/v1/prometheus/xxxx/xxxx/xxxx/cn-beijing
        # Prometheus V1 with token authentication enabled:
        prometheusHeader:
        - Authorization: {Token}
        # Prometheus V2 without password-free access (uncomment and replace the V1 block above):
        # prometheusHeader:
        # - Authorization: Basic <base64Encode(<accessKey:secretKey>)>
        metricsRelistInterval: 1m  # Interval for refreshing the metric list. Keep the default.
        logLevel: 5                # Debug log level. Keep the default.
        adapter:
          rules:
            default: false  # Do not expose predefined metrics by default.
            custom:
            # Example: convert container_memory_working_set_bytes to container_memory_working_set_bytes_per_second
            - seriesQuery: 'container_memory_working_set_bytes{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              name:
                matches: "^(.*)_bytes"
                as: "${1}_bytes_per_second"
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
            # Example: convert container_cpu_usage_seconds_total to container_cpu_usage_core_per_second
            - seriesQuery: 'container_cpu_usage_seconds_total{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              name:
                matches: "^(.*)_seconds_total"
                as: "${1}_core_per_second"
              metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'
            # Example: convert http_requests_total to http_requests_per_second
            - seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: {resource: "namespace"}
                  pod: {resource: "pod"}
              name:
                matches: "^(.*)_total"
                as: "${1}_per_second"
              metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
    ......

A tabela a seguir lista os principais campos do adapter. Para a referência completa, consulte Adapter configuration reference.

Campo

Descrição

AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom

Regras de conversão de métricas. Modifique conforme os exemplos acima.

alibabaCloudMetricsAdapter.prometheus.url

URL de requisição do Prometheus. Consulte Get the Prometheus data request URL.

AlibabaCloudMetricsAdapter.prometheus.prometheusHeader[].Authorization

Cabeçalho de autenticação. Prometheus V1 (com autenticação por token ativada): use {Token}. Prometheus V2 (sem acesso livre de senha ativado): use Basic <base64-encoded accessKey:secretKey>.

AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default

Defina como false para evitar a exposição de métricas predefinidas do Prometheus ao HPA.

Verificar se o adapter está funcionando

Execute estes comandos para confirmar se o adapter está expondo métricas por meio da API de agregação do Kubernetes.

Verificar Custom Metrics:

# List all available Custom Metrics
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .

# Query container_memory_working_set_bytes_per_second for pods in kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second" | jq .

# Query container_cpu_usage_core_per_second for pods in kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second" | jq .

Uma resposta bem-sucedida será semelhante a:

{
  "kind": "MetricValueList",
  "apiVersion": "custom.metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_cpu_usage_core_per_second"
  },
  "items": [
    {
      "describedObject": {
        "kind": "Pod",
        "namespace": "kube-system",
        "name": "ack-cost-exporter-7f44d55c66-cgtz7",
        "apiVersion": "/v1"
      },
      "metricName": "container_cpu_usage_core_per_second",
      "timestamp": "2025-12-30T03:30:21Z",
      "value": "4m",
      "selector": null
    }
  ]
}

Essa resposta confirma que o adapter descobriu e associou a métrica ao pod correto. O array items lista uma entrada por pod. O campo value utiliza o sufixo m (miliunidades), portanto 4m significa 0,004 núcleos de CPU por segundo.

Verificar External Metrics:

# List all available External Metrics
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .

# Query http_requests_per_second in the default namespace
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/http_requests_per_second" | jq .

Uma resposta bem-sucedida será semelhante a:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "http_requests_per_second",
      "metricLabels": {},
      "timestamp": "2025-12-30T03:29:40Z",
      "value": "328m"
    }
  ]
}

Diferentemente das Custom Metrics, a resposta de External Metrics contém um único valor agregado (não por pod), pois a métrica não está vinculada a um objeto específico do Kubernetes.

Etapa 3: Implantar o HPA

O adapter expõe tanto Custom Metrics quanto External Metrics. Escolha o tipo adequado à sua estratégia de dimensionamento.

Custom Metrics

Utilize Custom Metrics para dimensionar com base em medições individuais por pod.

  1. Crie o arquivo hpa.yaml com o conteúdo a seguir.

    Métricas do tipo Pods suportam apenas alvos AverageValue . O HPA divide o valor total da métrica entre todos os pods e o compara com averageValue para decidir se deve dimensionar.
    kind: HorizontalPodAutoscaler
    apiVersion: autoscaling/v2
    metadata:
      name: sample-app-memory-high
    spec:
      scaleTargetRef:           # The workload HPA controls.
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: container_memory_working_set_bytes_per_second
          target:
            type: AverageValue
            averageValue: 1024000m  # Target: 1 KB/s average per pod.
                                    # The unit is bytes/s. Kubernetes uses 'm' for milli-units:
                                    # 1024000m = 1024 bytes = 1 KB.
  2. Aplique o HPA.

    kubectl apply -f hpa.yaml
  3. Execute um teste de estresse para acionar o dimensionamento. Primeiro, exponha o Service sample-app por meio de uma instância do Server Load Balancer (SLB).

    Instruções para <EXTERNAL-IP>

    1. Na página Clusters do ACK, clique no nome do seu cluster. No painel de navegação à esquerda, escolha Network > Services.

    2. No namespace default, localize o Service sample-app. Clique em Update na coluna Actions e altere o Service Type para LoadBalancer. Consulte LoadBalancer.

    3. Aguarde até que um endereço IP externo apareça na coluna External IP.

    ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/
  4. Verifique o status do HPA.

    kubectl get hpa sample-app-memory-high

    Saída esperada:

    NAME                     REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    sample-app-memory-high   Deployment/sample-app   40886272/1024   1         10        1          22s

    A coluna TARGETS exibe atual/desejado. Quando o valor atual ultrapassa o limiar, o HPA adiciona pods.

External Metrics

Use External Metrics para dimensionar com base em uma medição global, não vinculada a pods individuais.

  1. Crie o arquivo hpa.yaml com o conteúdo a seguir.

    Métricas do tipo External suportam alvos Value e AverageValue .
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-app
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: http_requests_per_second
              selector:
                matchLabels:
                  job: "sample-app"
            target:
              type: AverageValue
              averageValue: 500m  # Target: 0.5 requests/s average per pod.
  2. Aplique o HPA.

    kubectl apply -f hpa.yaml
  3. Execute um teste de estresse (igual ao da aba Custom Metrics, usando o <EXTERNAL-IP> do Service sample-app).

    ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/
  4. Verifique o status do HPA.

    kubectl get hpa sample-app

    Saída esperada:

    NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    sample-app   Deployment/sample-app   33m/500m   1         10        1          7m

Referência de configuração do adapter

O adapter converte uma métrica do Prometheus em uma métrica compatível com o HPA por meio de quatro campos: seriesQuery, resources, name e metricsQuery. As seções abaixo constroem uma regra completa que converte http_requests_total em http_requests_per_second.

Variáveis de modelo em metricsQuery

O campo metricsQuery é um modelo Go, não PromQL simples. O adapter o preenche com valores da requisição do HPA antes de consultar o Prometheus. Os delimitadores são << e >> (e não {{ e }}) para evitar conflitos com a sintaxe PromQL.

Variável

Preenchida com

<<.Series>>

Nome da métrica do Prometheus proveniente de seriesQuery, por exemplo http_requests_total

<<.LabelMatchers>>

Seletores de rótulo da requisição do HPA, por exemplo namespace="default",pod="sample-app-xxx"

<<.GroupBy>>

Rótulo de recurso do Kubernetes usado para agrupar resultados, por exemplo pod

Descoberta

seriesQuery especifica qual métrica do Prometheus converter e aceita qualquer seletor PromQL válido, incluindo filtros de rótulo.

- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'

Os filtros de rótulo namespace!="" e pod!="" restringem a métrica a pods que possuem ambos os rótulos definidos, requisito necessário para a associação de recursos na próxima etapa.

Para refinar as séries correspondentes, adicione um bloco seriesFilters:

- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
  seriesFilters:
    - isNot: "^container_.*_seconds_total"

seriesFilters aceita dois operadores:

  • is:<regex>: mantém apenas as séries cujo nome corresponde à expressão regular.

  • isNot:<regex>: exclui as séries cujo nome corresponde à expressão regular.

Associação

resources.overrides mapeia nomes de rótulos do Prometheus para recursos da API do Kubernetes. Isso indica ao adapter qual rótulo corresponder quando o HPA solicitar uma métrica para um pod ou namespace específico.

- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}

As chaves (namespace, pod) são os nomes dos rótulos do Prometheus. Os valores ("namespace", "pod") são tipos de recursos da API do Kubernetes, conforme listado por kubectl api-resources -o wide. Cada chave deve existir como um rótulo nos seus dados do Prometheus.

Nomenclatura

name converte o nome da métrica do Prometheus no nome da métrica do HPA usando uma expressão regular. O nome original da métrica do Prometheus permanece inalterado.

- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  name:
    matches: "^(.*)_total"
    as: "${1}_per_second"

matches é uma expressão regular que captura parte do nome da métrica do Prometheus. as define o nome da métrica do HPA, usando ${1} para referenciar o primeiro grupo de captura. Neste caso, http_requests_total torna-se http_requests_per_second.

Para External Metrics, converta letras maiúsculas no nome da métrica do Prometheus para minúsculas no nome da métrica do HPA.

Para listar todos os nomes de métricas do HPA disponíveis:

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

Consulta

metricsQuery define a expressão PromQL que o adapter envia ao Prometheus após substituir as variáveis de modelo.

- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  name:
    matches: "^(.*)_total"
    as: "${1}_per_second"
  metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
Os seletores de rótulo em metricsQuery são injetados via <<.LabelMatchers>> no momento da consulta e não herdam filtros de seriesQuery .

Obter a URL de requisição de dados do Prometheus

Prometheus Service da Alibaba Cloud

  1. Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Prometheus Monitoring.

  3. No canto superior direito, clique em Alert Settings . Se o link não aparecer, atualize o ack-arms-prometheus para a versão mais recente. Consulte Prerequisites.

  4. No console do Prometheus Service, clique em Settings > Settings para localizar o HTTP API Address (Grafana Read URL) . Utilize o endereço de Internal Network quando disponível; caso contrário, use o endereço de Internet.

    3.png

  5. Configure a autenticação para sua versão do Prometheus.

    • Prometheus V1 (autenticação por token desativada por padrão): se ativada, copie o token do console do Prometheus e configure o adapter.

      image

      prometheus:
        prometheusHeader:
        - Authorization: {Token}
    • Prometheus V2 (autenticação por AccessKey ativada por padrão): se o acesso livre de senha não estiver ativado, codifique seu AccessKey ID e AccessKey secret em Base64.

      1. Gere uma string codificada em Base64.

        Concatene seu AccessKey ID e AccessKey secret como AccessKey:AccessSecret e codifique em Base64:

        echo -n 'accessKey:secretKey' | base64
      2. Configure o componente.

        Insira a string gerada no formato Basic <encoded string> no campo Authorization de prometheusHeader.

        ...
            prometheus:
              prometheusHeader:
              - Authorization: Basic YWxxxxeQ==
        ...

Prometheus open source

Para Prometheus autogerenciado, exponha sua API por meio de um Service do Kubernetes e defina a URL do Service na configuração do adapter.

Este exemplo utiliza o chart Helm ack-prometheus-operator do ACK Marketplace. Consulte Open source Prometheus monitoring.

  1. Implante o ack-prometheus-operator.

    1. Faça logon no console do ACK. No painel de navegação à esquerda, escolha Marketplace > Marketplace.

    2. Pesquise por ack-prometheus-operator, clique no cartão correspondente e depois em Deploy.

    3. Selecione o Cluster e o Namespace, defina o Release Name e clique em Next. Ajuste os Parameters conforme necessário e clique em OK.

  2. Verifique a implantação.

    1. Exponha a API do Prometheus por meio de um Service. Este exemplo usa o Service ack-prometheus-operator-prometheus.

    2. Em um navegador, acesse ServiceIP:9090. Para acesso público, exponha o Service por meio de uma instância do SLB.

    3. No console do Prometheus, clique em Status > Targets para visualizar todos os jobs de coleta. image.png Se todos os jobs exibirem um State como UP, a coleta está funcionando corretamente. image.png

    4. Anote o nome do Service e o namespace na coluna Labels. Neste exemplo, o Service é ack-prometheus-operator-prometheus no namespace monitoring.

  3. Defina a URL do Prometheus no adapter. Para acesso interno:

    AlibabaCloudMetricsAdapter:
      prometheus:
        enabled: true
        url: http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090

    Para acesso público:

    AlibabaCloudMetricsAdapter:
      prometheus:
        enabled: true
        url: http://your_domain.com:9090   # Replace with your public IP address or domain.

Para adicionar uma fonte de dados do Prometheus, consulte Add a Prometheus data source in Grafana.

Próximas etapas