Dimensione pods com base em sinais reais de tráfego — e não apenas na cpu — conectando as métricas de Ingress do Simple Log Service (SLS) ao dimensionamento automático horizontal de pods (HPA) do Kubernetes por meio da External Metrics api. Este guia apresenta um exemplo completo: implante uma aplicação Nginx, exponha-a por meio de um Ingress e, em seguida, configure o HPA para dimensionar com base em consultas por segundo (QPS) e na latência do percentil 99,99.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster ACK com o kubectl configurado
Um controlador de Ingress com a coleta de logs do SLS ative (ative por padrão ao crie um cluster)
Permissões para instale charts do Helm e crie recursos do HPA
Como funciona
O componente ack-alibaba-cloud-metrics-adapter faz a ponte entre os service de monitoramento da Alibaba Cloud e a External Metrics api do Kubernetes. Após a instalação, o HPA pode consultar métricas de Ingress do SLS — como sls_ingress_qps e sls_ingress_latency_p9999 — e ajustar a contagem de réplicas do seu Deployment de acordo.
Etapa 1: instale o ack-alibaba-cloud-metrics-adapter
O componente ack-alibaba-cloud-metrics-adapter permite que o Kubernetes obtenha dados de monitoramento dos service da Alibaba Cloud — incluindo ECS, SLB e RDS — por meio da External Metrics api.
Este componente não oferece suporte a atualize no local. Para atualize, desinstale primeiro a versão atual e, em seguida, instale a versão mais recente. Durante a desinstalação e a reinstalação, os HPAs relacionados pausam o dimensionamento porque a obtenção de dados de monitoramento é interrompida.
Faça logon no Container Service Management Console. No painel de navegação, clique em Clusters.
clique em nome do seu cluster. No painel de navegação à esquerda, escolha Applications > Helm.
Na página Helm, clique em Create. Conclua a configuração de Basic Information, selecione ack-alibaba-cloud-metrics-adapter e clique em Next.
Na página Parameter Settings, selecione uma Chart Version e clique em OK.
Etapa 3: crie um Ingress
No painel de navegação à esquerda da página de gerencie do cluster, escolha Network > Ingress. Na página Ingress, clique em Create Ingress.
Preencha os campos obrigatórios e clique em OK. O console redireciona você para a página Ingress.
Na coluna Name, clique em nome do Ingress e visualize suas regras de roteamento. Para mais detalhes, consulte gerencie Ingress.
Etapa 4: configure o HPA
O HPA oferece suporte a duas métricas de Ingress do SLS com semânticas de dimensionamento diferentes:
|
Métrica |
Tipo de destino |
Comportamento de dimensionamento |
|
|
|
O QPS é dividido pela contagem atual de pods antes da comparação |
|
|
|
O valor bruto de latência é comparado diretamente |
-
crie o arquivo
ingress-hpa.yamlcom o seguinte conteúdo:Parâmetro
Obrigatório
Descrição
sls.ingress.routeSim
Formato:
<namespace>-<svc>-<port>. Exemplo:default-nginx-80sls.logstoreSim
O Logstore no Simple Log Service. Padrão:
nginx-ingresssls.projectSim
O Project no Simple Log Service. Padrão:
k8s-log-<cluster-id>sls.internal.endpointNão
Define se o acesso ao SLS será pela rede interna. Padrão:
true. defina comofalsepara usar a rede pública.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "<your-sls-project>" # Default: k8s-log-<cluster-id> sls.logstore: "nginx-ingress" # Default SLS Logstore for Nginx Ingress logs sls.ingress.route: "default-nginx-80" # Format: <namespace>-<svc>-<port> target: type: AverageValue averageValue: 10 # Scale up when average QPS per pod exceeds 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: sls.project: "<your-sls-project>" sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" # sls.internal.endpoint: "true" # true = internal network (default); false = public network target: type: Value value: 10 # Scale up when 99.99th-percentile latency exceeds 10 msA tabela a seguir descreve os parâmetros usados na configuração do HPA.
-
Aplique a configuração:
kubectl apply -f ingress-hpa.yaml
verifique o dimensionamento
execute um teste de carga de 5 minutos no seu domínio do Ingress para acionar o scale-up:
# Send 10 concurrent requests for 300 seconds
ab -t 300 -c 10 <domain-name-configured-for-the-ingress>
Acompanhe o status do HPA em tempo real:
kubectl get hpa ingress-hpa --watch
Saída esperada quando o scale-up é bem-sucedido (REPLICAS atinge MAXPODS):
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49s
Quando o tráfego cai abaixo do limiar, REPLICAS retorna ao valor mínimo.
Solução de problemas
Comece a solução de problemas execute kubectl describe hpa ingress-hpa e verifique o campo Conditions. Use as colunas Type e Status para identificar o problema e, em seguida, siga as etapas abaixo.
A coluna target mostra unknown
-
execute
kubectl describe hpa <hpa-name>e verifique o campoConditions:Se
AbleToScaleforFalse: confirme se o Deployment está íntegro.Se
ScalingActiveforFalse: prossiga para a próxima etapa.
-
execute o seguinte comando para verifique se a External Metrics api está disponível:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"Se a resposta for
Error from server (NotFound), verifique o status de inicialização doalibaba-cloud-metrics-adapter. Se o adaptador estiver executando normalmente e as métricas do HPA forem relacionadas ao Ingress, implante primeiro o componente SLS. Para mais detalhes, consulte Collect and analyze Nginx Ingress access logs. -
verifique o formato de
sls.ingress.route. O valor deve ser<namespace>-<svc>-<port>, onde:namespace: o namespace onde o Ingress residesvc: o nome do Service associado ao Ingressport: o nome da porta desse Service
Falha ao fazer pull da imagem do ack-alibaba-cloud-metrics-adapter (versão 1.3.7)
Ao atualize para a versão 1.3.7, você pode ver:
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
Isso acontece porque o componente não oferece suporte a atualize diretas. Para resolver isso:
Faça backup da configuração atual do componente.
Desinstale a versão antiga.
instale a versão mais recente usando a configuração de backup.
Perguntas frequentes
Como consulto sls_ingress_qps a partir da linha de comando?
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress"
Substitua {{SLS_Project}} pelo nome do seu Project do SLS. Se você não defina um nome personalizado ao crie o cluster, o padrão é k8s-log-{{ClusterId}}.
Uma resposta bem-sucedida retorna um ExternalMetricValueList com o QPS atual no campo value. Se você receber um erro ParameterInvalid, a métrica não tem dados — isso geralmente significa que o ALB Ingress não está configurado, mas sls_alb_ingress_qps foi consultado em vez de sls_ingress_qps.
Quais métricas o HPA suporta?
Para a lista completa, consulte Alibaba Cloud HPA Metrics. Métricas comuns de Ingress do SLS:
|
Métrica |
Descrição |
Parâmetro obrigatório |
|
|
QPS para a rota de Ingress especificada |
|
|
|
QPS para a rota do ALB Ingress |
|
|
|
Latência média para todas as requisições |
|
|
|
Latência no percentil 50 |
|
|
|
Latência no percentil 95 |
|
|
|
Latência no percentil 99 |
|
|
|
Latência no percentil 99,99 |
|
|
|
Largura de banda de entrada para o Ingress |
|
Como adapto o HPA após personalizar o formato de log do Nginx Ingress?
A coleta de logs do SLS depende da definição de recurso personalizado (CRD) AliyunLogConfig implantada quando o SLS é ative pela primeira vez. Esse CRD é ajustado para o formato de log padrão do ACK Ingress Controller. Se você modificou o formato de log de acesso do Ingress Controller, atualize a seção processor_regex na configuração do CRD para corresponder ao seu formato personalizado. Para mais detalhes, consulte Collect container logs using a DaemonSet and a CRD.
Se o SLS estava ative quando você crie o cluster e você precisa de métricas de Ingress para o HPA, ative ou configure o SLS primeiro. Para mais detalhes, consulte Collect and analyze Nginx Ingress access logs.