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:
O Prometheus Service coleta métricas das suas cargas de trabalho e da infraestrutura.
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).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
Componente de monitoramento do Prometheus implantado. Consulte Connect to and configure Prometheus Service.
Add-on ack-alibaba-cloud-metrics-adapter implantado. Consulte Install ack-alibaba-cloud-metrics-adapter.
Add-on ack-arms-prometheus atualizado para a versão mais recente. Para atualizar, acesse Components and Add-ons no console do ACK. Consulte Component updates and release notes.
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:
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Prometheus Monitoring.
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.
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
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.
-
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.
Adicionar um ServiceMonitor
Faça logon no console do Application Real-Time Monitoring Service (ARMS).
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.
-
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
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.No painel do Prometheus, consulte
http_requests_totalpara 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
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do seu cluster. No painel de navegação à esquerda, clique em Applications > Helm.
Localize ack-alibaba-cloud-metrics-adapter e clique em Update na coluna Actions.
-
No painel Update Release, atualize o YAML com sua configuração e clique em OK.
A tabela a seguir lista os principais campos do adapter. Para a referência completa, consulte Adapter configuration reference.
|
Campo |
Descrição |
|
|
Regras de conversão de métricas. Modifique conforme os exemplos acima. |
|
|
URL de requisição do Prometheus. Consulte Get the Prometheus data request URL. |
|
|
Cabeçalho de autenticação. Prometheus V1 (com autenticação por token ativada): use |
|
|
Defina como |
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.
-
Crie o arquivo
hpa.yamlcom o conteúdo a seguir.Métricas do tipo
Podssuportam apenas alvosAverageValue. O HPA divide o valor total da métrica entre todos os pods e o compara comaverageValuepara 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. -
Aplique o HPA.
kubectl apply -f hpa.yaml -
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).
ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Verifique o status do HPA.
kubectl get hpa sample-app-memory-highSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app-memory-high Deployment/sample-app 40886272/1024 1 10 1 22sA coluna
TARGETSexibeatual/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.
-
Crie o arquivo
hpa.yamlcom o conteúdo a seguir.Métricas do tipo
Externalsuportam alvosValueeAverageValue.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. -
Aplique o HPA.
kubectl apply -f hpa.yaml -
Execute um teste de estresse (igual ao da aba Custom Metrics, usando o
<EXTERNAL-IP>do Servicesample-app).ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Verifique o status do HPA.
kubectl get hpa sample-appSaí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 |
|
|
Nome da métrica do Prometheus proveniente de |
|
|
Seletores de rótulo da requisição do HPA, por exemplo |
|
|
Rótulo de recurso do Kubernetes usado para agrupar resultados, por exemplo |
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 emmetricsQuerysão injetados via<<.LabelMatchers>>no momento da consulta e não herdam filtros deseriesQuery.
Obter a URL de requisição de dados do Prometheus
Prometheus Service da Alibaba Cloud
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Prometheus Monitoring.
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.
-
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.

-
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.

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.
-
Gere uma string codificada em Base64.
Concatene seu AccessKey ID e AccessKey secret como
AccessKey:AccessSecrete codifique em Base64:echo -n 'accessKey:secretKey' | base64 -
Configure o componente.
Insira a string gerada no formato
Basic <encoded string>no campoAuthorizationdeprometheusHeader.... 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.
-
Implante o ack-prometheus-operator.
Faça logon no console do ACK. No painel de navegação à esquerda, escolha Marketplace > Marketplace.
Pesquise por ack-prometheus-operator, clique no cartão correspondente e depois em Deploy.
Selecione o Cluster e o Namespace, defina o Release Name e clique em Next. Ajuste os Parameters conforme necessário e clique em OK.
-
Verifique a implantação.
Exponha a API do Prometheus por meio de um Service. Este exemplo usa o Service
ack-prometheus-operator-prometheus.Em um navegador, acesse
ServiceIP:9090. Para acesso público, exponha o Service por meio de uma instância do SLB.No console do Prometheus, clique em Status > Targets para visualizar todos os jobs de coleta.
Se todos os jobs exibirem um State como UP, a coleta está funcionando corretamente. 
Anote o nome do Service e o namespace na coluna Labels. Neste exemplo, o Service é
ack-prometheus-operator-prometheusno namespacemonitoring.
-
Defina a URL do Prometheus no adapter. Para acesso interno:
AlibabaCloudMetricsAdapter: prometheus: enabled: true url: http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090Para 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
Para dimensionar com base em métricas externas, como taxa de requisições HTTP ou QPS do Ingress, consulte Horizontal pod autoscaling based on Alibaba Cloud component metrics.
Para dimensionar várias aplicações usando métricas de tráfego do Nginx Ingress, consulte Horizontally scale multiple applications based on Nginx Ingress traffic metrics.