Quando a escala automática de pods horizontal não funciona como esperado no Google Kubernetes Engine (GKE), as suas cargas de trabalho podem não ser dimensionadas corretamente. Este problema pode impedir que as aplicações processem a carga, o que pode causar problemas de desempenho ou interrupções. Pode ver que os pods não aumentam apesar da elevada utilização da CPU, os valores das métricas
são apresentados como <unknown>
no estado do HorizontalPodAutoscaler ou as operações de
dimensionamento não ocorrem.
Use esta página para diagnosticar e resolver problemas comuns com o escalamento automático de pods horizontal, desde configurações incorretas iniciais nos objetos HorizontalPodAutoscaler a falhas mais complexas no pipeline de métricas. Seguindo estes passos de resolução de problemas, pode ajudar a garantir que as suas aplicações são dimensionadas de forma eficiente e fiável com base na procura, usando eficazmente o recurso de escala automática horizontal de pods.
Estas informações são importantes para os programadores de aplicações que configuram objetos HorizontalPodAutoscaler e precisam de garantir que as respetivas aplicações são dimensionadas corretamente. Também ajuda os administradores e os operadores da plataforma a resolver problemas com o pipeline de métricas ou a configuração do cluster que afetam todas as cargas de trabalho com escalabilidade automática. Para mais informações sobre as funções comuns e as tarefas de exemplo a que fazemos referência no conteúdo, consulte o artigo Funções e tarefas comuns de utilizadores do GKE. Google Cloud
Se já teve sintomas ou viu uma mensagem de erro, use a tabela seguinte para encontrar as orientações certas:
Sintoma | Possível resolução |
---|---|
Sem redimensionamento, mas as condições do HorizontalPodAutoscaler são True |
Resolva problemas de um HorizontalPodAutoscaler saudável, mas que não responde |
É apresentada uma mensagem de erro específica nos eventos HorizontalPodAutoscaler | Resolva problemas comuns do redimensionador automático horizontal de pods |
Métrica <unknown> |
Resolva problemas de métricas personalizadas e externas |
Não está a reduzir recursos | Resolva problemas de falhas na redução da escala do redimensionador automático horizontal de pods |
Antes de começar
- Certifique-se de que usa objetos HorizontalPodAutoscaler com cargas de trabalho escaláveis, como implementações e StatefulSets. Não pode usar o escalamento automático horizontal de pods com cargas de trabalho que não podem ser escaladas, por exemplo, DaemonSets.
-
Para receber as autorizações de que precisa para resolver problemas de escala automática de pods horizontal no GKE, que inclui a inspeção de objetos HorizontalPodAutoscaler e a visualização de registos de clusters, peça ao seu administrador para lhe conceder as seguintes funções de IAM no seu projeto:
-
Inspecione recursos do GKE:
Visualizador do GKE (
roles/container.viewer
) -
Ver registos de clusters:
Visualizador de registos (
roles/logging.viewer
)
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
-
Inspecione recursos do GKE:
Visualizador do GKE (
Configure a ferramenta de linhas de comando
kubectl
para comunicar com o seu cluster do GKE:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_ID
Substitua o seguinte:
CLUSTER_NAME
: o nome do cluster.LOCATION
: a região ou a zona do Compute Engine (por exemplo,us-central1
ouus-central1-a
) para o cluster.PROJECT_ID
: o ID do seu Google Cloud projeto.
Valide o estado e a configuração do redimensionador automático horizontal de pods
Comece a resolução de problemas inspecionando o estado e a configuração do objeto HorizontalPodAutoscaler. Esta verificação inicial ajuda a identificar e resolver configurações incorretas básicas, que são uma causa principal comum de problemas de escalabilidade.
Descreva o HorizontalPodAutoscaler
Para ver os cálculos em tempo real do HorizontalPodAutoscaler e as decisões de escalonamento recentes, use o comando kubectl describe hpa
. Este comando fornece um resumo do objeto HorizontalPodAutoscaler e um registo Events
que é útil para diagnosticar problemas:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Substitua o seguinte:
HPA_NAME
: o nome do seu objeto HorizontalPodAutoscaler.NAMESPACE_NAME
: o espaço de nomes do seu objeto HorizontalPodAutoscaler.
O resultado é semelhante ao seguinte:
Name: php-apache-hpa
Reference: Deployment/php-apache
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 1% (1m) / 50%
Min replicas: 1
Max replicas: 10
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HorizontalPodAutoscaler was able to successfully calculate a replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 39m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization...
Normal SuccessfulRescale 26m horizontal-pod-autoscaler New size: 1; reason: cpu resource utilization...
No resultado, as três secções seguintes ajudam a diagnosticar o problema:
Metrics
: esta secção apresenta os valores das métricas atuais em comparação com os respetivos objetivos. Verifique aqui se o HorizontalPodAutoscaler está a receber dados. Um valor de métrica<unknown>
indica que o HorizontalPodAutoscaler não obteve a métrica ou que o pipeline de métricas está danificado.Conditions
: esta verificação de estado de alto nível mostra se o HorizontalPodAutoscaler consegue obter métricas (AbleToScale
) e fazer cálculos de escalabilidade (ScalingActive
). Um estadoFalse
em qualquer uma destas condições indica uma falha.Events
: esta secção regista ações de escalonamento recentes, avisos e erros do controlador HorizontalPodAutoscaler. Geralmente, é o primeiro local onde pode encontrar mensagens de erro ou motivos específicos, comoFailedGetScale
ouFailedGetResourceMetric
, que ajudam a descobrir a origem do problema.
Verifique o estado do HorizontalPodAutoscaler nas implementações
Para verificar o estado dos objetos HorizontalPodAutoscaler usados com as suas implementações, use a Google Cloud consola:
Na Google Cloud consola, aceda à página Workloads.
Clique no nome da implementação.
Aceda ao separador Detalhes e encontre a secção Ajuste automático.
Reveja o valor na linha Estado:
- Uma marca de verificação verde significa que o HorizontalPodAutoscaler está configurado e pode ler as respetivas métricas.
- Um triângulo âmbar significa que o HorizontalPodAutoscaler está configurado, mas está a ter problemas em ler as respetivas métricas. Este é um problema comum com métricas personalizadas ou externas. Para resolver este problema, diagnostique o motivo pelo qual as métricas não estão disponíveis. Para mais informações, consulte a secção Resolva problemas com métricas personalizadas e externas.
Para outros tipos de carga de trabalho, como StatefulSets, ou para mais detalhes, verifique o manifesto do objeto HorizontalPodAutoscaler.
Verifique o manifesto do HorizontalPodAutoscaler
O manifesto YAML do seu objeto HorizontalPodAutoscaler permite-lhe ver informações sobre a respetiva configuração e estado atual.
Para ver o manifesto YAML, selecione uma das seguintes opções:
Consola
Na Google Cloud consola, aceda à página Explorador de objetos.
Na lista Tipos de objetos, selecione a caixa de verificação HorizontalPodAutoscaler e clique em OK.
Navegue para o grupo de APIs autoscaling e, de seguida, clique na seta para expandir HorizontalPodAutoscaler.
Clique no nome do objeto HorizontalPodAutoscaler que quer inspecionar.
Reveja a secção YAML, que apresenta a configuração completa do objeto HorizontalPodAutoscaler.
kubectl
Execute o seguinte comando:
kubectl get hpa HPA_NAME -n NAMESPACE_NAME -o yaml
Substitua o seguinte:
HPA_NAME
: o nome do seu objeto HorizontalPodAutoscaler.NAMESPACE_NAME
: o espaço de nomes do seu objeto HorizontalPodAutoscaler.
Depois de obter o manifesto, procure estas secções principais:
spec
(a sua configuração):scaleTargetRef
: a carga de trabalho (como uma implementação) que o HorizontalPodAutoscaler deve dimensionar.minReplicas
emaxReplicas
: as definições de réplica mínimas e máximas.metrics
: as métricas que configurou para o escalamento (por exemplo, utilização da CPU ou métricas personalizadas).
status
(o estado em direto do HorizontalPodAutoscaler):currentMetrics
: os valores das métricas mais recentes que o HorizontalPodAutoscaler observou.currentReplicas
edesiredReplicas
: o número atual de pods e o número para o qual o HorizontalPodAutoscaler quer dimensionar.conditions
: a secção mais valiosa para a resolução de problemas. Esta secção mostra o estado do HorizontalPodAutoscaler:AbleToScale
: indica se o HorizontalPodAutoscaler consegue encontrar o respetivo destino e métricas.ScalingActive
: mostra se o HorizontalPodAutoscaler tem autorização para calcular e realizar o dimensionamento.ScalingLimited
: mostra se o HorizontalPodAutoscaler quer dimensionar, mas está limitado pelas definições deminReplicas
oumaxReplicas
.
Use funcionalidades de registo avançadas
Para obter estatísticas mais detalhadas sobre o seu objeto HorizontalPodAutoscaler, use os seguintes tipos de registos:
Veja eventos do redimensionador automático horizontal de pods no Cloud Logging: use um filtro de registos para encontrar todos os eventos do redimensionador automático horizontal de pods para um cluster específico. Por exemplo:
Na Google Cloud consola, aceda à página Explorador de registos.
No painel de consultas, introduza a seguinte consulta:
resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="LOCATION" logName="projects/PROJECT_ID/logs/events" jsonPayload.involvedObject.kind="HorizontalPodAutoscaler"`
Substitua o seguinte:
CLUSTER_NAME
: o nome do cluster ao qual o HorizontalPodAutoscaler pertence.LOCATION
: a região ou a zona do Compute Engine (por exemplo,us-central1
ouus-central1-a
) para o cluster.PROJECT_ID
: o ID do seu projeto.
Clique em Executar consulta e reveja o resultado.
Ver eventos do Horizontal Pod Autoscaler: estes registos fornecem registos estruturados e legíveis por humanos que explicam como o HorizontalPodAutoscaler calcula uma recomendação, oferecendo estatísticas detalhadas sobre o respetivo processo de tomada de decisões.
Resolva problemas de um HorizontalPodAutoscaler em bom estado de funcionamento, mas que não responde
Esta secção ajuda a diagnosticar o motivo pelo qual o HorizontalPodAutoscaler pode não estar a acionar ações de escalabilidade, mesmo quando parece estar em bom estado e não comunica erros no respetivo estado ou eventos.
Sintomas:
O HorizontalPodAutoscaler parece estar em bom estado, as respetivas condições comunicam True
e não apresenta erros nos respetivos eventos. No entanto, continua a não realizar ações de escalabilidade.
Causa:
Vários fatores podem causar este comportamento esperado:
- Limites de réplicas: o número atual de réplicas já atingiu o limite definido pelo campo
minReplicas
oumaxReplicas
na configuração do HorizontalPodAutoscaler. - Intervalo de tolerância: o Kubernetes usa um intervalo de tolerância predefinido de 10% para evitar o escalamento em pequenas flutuações das métricas. O ajuste de escala só ocorre se a relação entre a métrica atual e a métrica de destino estiver fora do intervalo de 0,9 a 1,1. Por exemplo, se o alvo for 85% de CPU e a utilização atual for de 93%, a proporção é de aproximadamente 1,094 (93/85≈1,094). Uma vez que este valor é inferior a 1,1, a escala automática horizontal de pods não aumenta a escala.
- Pods não preparados: o redimensionador automático horizontal de pods inclui apenas pods com um estado
Ready
nos respetivos cálculos de escalabilidade. Os pods que estão bloqueados com o estadoPending
ou que não estão a tornar-seReady
(devido a falhas nas verificações de estado ou problemas de recursos) são ignorados e podem impedir o dimensionamento. - Atraso do período de sincronização: o controlador HorizontalPodAutoscaler verifica as métricas periodicamente. É normal um atraso de 15 a 30 segundos entre uma métrica que ultrapassa o limite e o início de uma ação de escalamento.
- Latência de novas métricas: quando um HorizontalPodAutoscaler usa uma nova métrica personalizada pela primeira vez, pode ver uma latência única de vários minutos. Este atraso ocorre porque o sistema de monitorização (como o Cloud Monitoring) tem de criar a nova série cronológica quando o primeiro ponto de dados é escrito.
- Cálculo de várias métricas: quando configura várias métricas, o Horizontal Pod Autoscaler calcula o número de réplicas necessário para cada métrica de forma independente e, em seguida, escolhe o valor calculado mais elevado como o número final de réplicas. Devido a este comportamento, a sua carga de trabalho é dimensionada para satisfazer as exigências da métrica com as necessidades mais elevadas. Por exemplo, se as métricas de CPU calcularem uma necessidade de 9 réplicas, mas uma métrica de pedidos por segundo calcular uma necessidade de 15, o redimensionador automático horizontal de pods dimensiona a implementação para 15 réplicas.
Resolução:
Experimente as seguintes soluções:
- Limites de réplicas: verifique os valores
minReplicas
emaxReplicas
no manifesto HorizontalPodAutoscaler ou no resultado do comandokubectl describe
. Ajuste estes limites se estiverem a impedir o dimensionamento necessário. - Intervalo de tolerância: se for necessário o ajuste de escala dentro da tolerância predefinida, configure um valor de tolerância diferente. Caso contrário, aguarde que a métrica se mova para fora da proporção de 0,9 a 1,1.
- Pods não preparados: investigue por que motivo os pods estão
Pending
ou não estãoReady
e resolva os problemas subjacentes (por exemplo, restrições de recursos, falhas nas sondagens de prontidão). Para ver sugestões de resolução de problemas, consulte o artigo Depurar pods na documentação do Kubernetes. - Atraso no período de sincronização e latência de novas métricas: estas latências são normais. Aguarde que o período de sincronização seja concluído ou que a nova série cronológica da métrica personalizada seja criada.
- Cálculo de várias métricas: este é o comportamento pretendido. Se o aumento da escala estiver a ocorrer com base numa métrica (como pedidos por segundo), está a substituir corretamente o cálculo inferior de outra métrica (como a CPU).
Resolva problemas relacionados com erros comuns do redimensionador automático horizontal de pods
As secções seguintes fornecem soluções para mensagens de erro específicas e motivos de eventos que pode encontrar ao inspecionar o estado do HorizontalPodAutoscaler. Normalmente, encontra estas mensagens na secção Events
da saída do comando kubectl describe hpa
.
Resolva problemas de erros de configuração do redimensionador automático horizontal de pods
Uma configuração incorreta no manifesto HorizontalPodAutoscaler, como um campo com erro de digitação ou configurações em conflito, causa os erros nesta secção.
Erro: métricas inválidas
Pode ver este erro quando a configuração de uma métrica num HorizontalPodAutoscaler está sintaticamente incorreta ou inconsistente.
Sintomas:
Se o HorizontalPodAutoscaler não conseguir calcular as réplicas necessárias devido a um problema de configuração, a respetiva secção Events
mostra o motivo FailedComputeMetricsReplicas
com uma mensagem semelhante à seguinte:
invalid metrics (1 invalid out of 1)
Causa:
Normalmente, este erro significa que existe uma discrepância entre a métrica type
e o
target
que definiu no manifesto HorizontalPodAutoscaler. Por exemplo,
pode ter especificado um type
de Utilization
, mas fornecido um valor alvo
de averageValue
em vez de averageUtilization
.
Resolução:
Corrija o manifesto HorizontalPodAutoscaler para que o valor do campo target
se alinhe com a métrica type
:
- Se
type
forUtilization
, o valor no campotarget
tem de seraverageUtilization
. - Se
type
forAverageValue
, o valor no campotarget
tem de seraverageValue
.
Erro: vários serviços a selecionar o mesmo destino
Pode ver este erro quando usa o escalamento automático baseado no tráfego que tem uma configuração de serviço incorreta para o HorizontalPodAutoscaler.
Sintomas:
Repara no seguinte erro:
multiple services selecting the same target of HPA_NAME: SERVICE_NAME
Esta saída inclui os seguintes valores:
HPA_NAME
: o nome do HorizontalPodAutoscaler.SERVICE_NAME
: o nome de um serviço.
Causa:
A escala automática baseada no tráfego está configurada, mas mais do que um serviço do Kubernetes está a segmentar o campo scaleTargetRef
do HorizontalPodAutoscaler. O ajuste de escala automático baseado no tráfego só suporta uma relação individual entre o serviço e a carga de trabalho com ajuste de escala automático.
Resolução:
Para corrigir este problema, certifique-se de que apenas o seletor de etiquetas de um serviço corresponde aos pods da sua carga de trabalho:
Encontre as etiquetas de Pod da sua carga de trabalho:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'
Substitua o seguinte:
HPA_TARGET_DEPLOYMENT
: o nome da implementação que o HorizontalPodAutoscaler está a segmentar.NAMESPACE
: o espaço de nomes da implementação.
O resultado é semelhante ao seguinte:
{"app":"my-app", "env":"prod"}
Encontre todos os serviços que correspondem a essas etiquetas revendo o campo
spec.selector
para todos os serviços no espaço de nomes.kubectl get services -n NAMESPACE -o yaml
Identifique todos os serviços cujo seletor corresponda às etiquetas do passo anterior. Por exemplo,
{"app": "my-app"}
e{"app": "my-app", "env": "prod"}
corresponderiam às etiquetas de Pod de exemplo.Resolva o conflito escolhendo uma das seguintes opções:
- Torne o seletor do serviço pretendido único adicionando uma nova etiqueta única ao campo
spec.template.metadata.labels
da sua implementação. Em seguida, atualize o campospec.selector
do serviço destinado para incluir esta nova etiqueta. - Torne outros seletores de serviços mais restritivos alterando o campo
spec.selector
de todos os outros serviços em conflito para que sejam mais restritivos e deixem de corresponder aos pods da sua carga de trabalho.
- Torne o seletor do serviço pretendido único adicionando uma nova etiqueta única ao campo
Aplique as alterações:
kubectl apply -f MANIFEST_NAME
Substitua
MANIFEST_NAME
pelo nome do ficheiro YAML que contém o manifesto do serviço ou da implementação atualizado.
Erro: a etiqueta não é permitida
Sintomas:
Repara no seguinte erro:
unable to fetch metrics from external metrics API: googleapi: Error 400: Metric label: 'LABEL_NAME' is not allowed
Neste resultado, LABEL_NAME
é o nome da etiqueta incorreta.
Causa:
O manifesto HorizontalPodAutoscaler especifica uma chave de etiqueta inválida na secção metric.selector.matchLabels
e o Cloud Monitoring não reconhece nem permite esta chave para a métrica.
Resolução:
Para resolver este problema, faça o seguinte:
- Identifique o nome da etiqueta não permitida na mensagem de erro.
- Remova ou corrija esta chave de etiqueta na secção
metric.selector.matchLabels
do manifesto HorizontalPodAutoscaler. - Encontre uma chave de etiqueta válida e filtrável consultando a documentação do Cloud Monitoring para essa métrica.
Problema: vários HorizontalPodAutoscalers a segmentar a mesma carga de trabalho
A configuração de vários objetos HorizontalPodAutoscaler para gerir a mesma carga de trabalho provoca um comportamento de escalabilidade imprevisível e em conflito.
Sintomas:
Não existe um Condition
ou um Reason
específico no estado de um HorizontalPodAutoscaler que indique diretamente este conflito. Em alternativa, pode observar os seguintes sintomas:
- A contagem de réplicas da carga de trabalho pode variar inesperadamente.
- As decisões de escalabilidade podem não parecer corresponder às métricas definidas num único HorizontalPodAutoscaler.
- Quando vê eventos, pode ver eventos alternados ou contraditórios
SuccessfulRescale
de diferentes objetos HorizontalPodAutoscaler.
Causa:
Este problema ocorre porque mais do que um objeto HorizontalPodAutoscaler no mesmo espaço de nomes especifica exatamente a mesma carga de trabalho no campo spec.scaleTargetRef
. Cada HorizontalPodAutoscaler calcula independentemente o número de réplicas e tenta dimensionar a carga de trabalho com base no seu próprio conjunto de métricas e alvos. O Kubernetes não bloqueia esta configuração, mas
leva a ajustes de escalabilidade irregulares porque os HorizontalPodAutoscalers
competem entre si.
Resolução:
Para evitar conflitos, defina todas as métricas de escalonamento num único objeto HorizontalPodAutoscaler. Cada HorizontalPodAutoscaler calcula as necessidades de escalonamento a partir do seu próprio campo spec.metrics
, pelo que a união dos mesmos permite que o objeto HorizontalPodAutoscaler escolhido considere todos os fatores, como a CPU e os pedidos por segundo, em conjunto:
Para identificar os HorizontalPodAutoscalers que têm como alvo a mesma carga de trabalho, obtenha o manifesto YAML para cada objeto HorizontalPodAutoscaler. Preste especial atenção ao campo
spec.scaleTargetRef
na saída.kubectl get hpa -n NAMESPACE_NAME -o yaml
Substitua
NAMESPACE_NAME
pelo espaço de nomes do seu objeto HorizontalPodAutoscaler.Procure instâncias em que diferentes recursos HorizontalPodAutoscaler tenham os mesmos valores para
apiVersion
,kind
ename
no respetivo camposcaleTargetRef
.Consolidar métricas num único objeto HorizontalPodAutoscaler:
- Escolha um objeto HorizontalPodAutoscaler para manter. Este HorizontalPodAutoscaler é o que vai modificar.
- Examine a secção
spec.metrics
no manifesto de cada um dos outros objetos HorizontalPodAutoscaler que segmentam a mesma carga de trabalho. - Copie as definições de métricas que quer manter das
spec.metrics
secções dos objetos HorizontalPodAutoscaler duplicados. - Cole estas definições de métricas copiadas na matriz
spec.metrics
do HorizontalPodAutoscaler que decidiu manter.
Aplique as alterações:
kubectl apply -f MANIFEST_NAME
Substitua
MANIFEST_NAME
pelo nome do manifesto HorizontalPodAutoscaler que decidiu manter.Elimine os outros objetos HorizontalPodAutoscaler que estavam a segmentar a mesma carga de trabalho:
kubectl delete hpa DUPLICATE_MANIFEST_NAME -n NAMESPACE_NAME
Substitua
DUPLICATE_MANIFEST_NAME
pelo nome do objeto HorizontalPodAutoscaler redundante que quer eliminar.
Resolva problemas de erros de carga de trabalho e de destino
Os erros nesta secção são causados pela implementação, pelo StatefulSet ou pelos pods que estão a ser dimensionados, e não pelo próprio objeto HorizontalPodAutoscaler.
Erro: não é possível obter a escala atual do destino
Pode ver este erro quando o HorizontalPodAutoscaler não consegue localizar ou aceder à carga de trabalho que deve dimensionar.
Sintomas:
A secção Events
tem uma condição de FailedGetScale
com uma mensagem
semelhante à seguinte:
the HorizontalPodAutoscaler controller was unable to get the target's current scale: WORKLOAD_TYPE.apps "TARGET_WORKLOAD" not found
Esta saída inclui os seguintes valores:
WORKLOAD_TYPE
: o tipo de carga de trabalho, comoDeployment
ouStatefulSet
.TARGET_WORKLOAD
: o nome da carga de trabalho.
Causa:
O controlador HorizontalPodAutoscaler não consegue encontrar a carga de trabalho (como uma implementação ou um StatefulSet) que está configurado para gerir. Este problema é causado por um problema no campo scaleTargetRef
no manifesto do HorizontalPodAutoscaler. O recurso especificado pode não existir,
pode ter sido eliminado ou pode ter um erro ortográfico.
Resolução:
Experimente as seguintes soluções:
- Verifique o campo
scaleTargetRef
do manifesto do HorizontalPodAutoscaler: certifique-se de que o valor dename
,kind
eapiVersion
no camposcaleTargetRef
corresponde exatamente aos metadados correspondentes da sua carga de trabalho de destino. Se o nome da carga de trabalho estiver incorreto, atualize o camposcaleTargetRef
do HorizontalPodAutoscaler para indicar o nome correto. - Confirme que a carga de trabalho existe: certifique-se de que a carga de trabalho de destino existe no mesmo espaço de nomes que o HorizontalPodAutoscaler. Pode verificar esta situação
com um comando como
kubectl get deployment DEPLOYMENT_NAME
. Se eliminou intencionalmente a carga de trabalho, elimine o objeto HorizontalPodAutoscaler correspondente para limpar o cluster. Se precisar de recriar a carga de trabalho, o HorizontalPodAutoscaler encontra-a automaticamente assim que estiver disponível, e o erro é resolvido. - Verifique se o HorizontalPodAutoscaler e a carga de trabalho estão no mesmo
espaço de nomes: o HorizontalPodAutoscaler e a respetiva carga de trabalho de destino têm de estar no
mesmo espaço de nomes. Se se esquecer de especificar um espaço de nomes ao criar um objeto com comandos
kubectl
, o Kubernetes coloca o objeto no espaço de nomesdefault
. Este comportamento pode causar uma incompatibilidade se o seu HorizontalPodAutoscaler estiver no espaço de nomesdefault
enquanto a sua carga de trabalho estiver noutro espaço de nomes, ou vice-versa. Verifique o espaço de nomes de ambos os objetos e certifique-se de que correspondem.
Depois de o HorizontalPodAutoscaler localizar com êxito o respetivo destino, a condição
AbleToScale
passa a True
e a mensagem muda para: the
HorizontalPodAutoscaler controller was able to get the target's current scale
.
Erro: não é possível calcular a contagem de réplicas
Pode ver este erro quando o HorizontalPodAutoscaler precisa de calcular o escalonamento com base na utilização de recursos, mas não tem as informações de base necessárias dos pods.
Sintomas:
A condição ScalingActive
é False
com um valor de Reason
de
FailedGetResourceMetric
. Normalmente, também é apresentada uma mensagem semelhante à seguinte:
the HorizontalPodAutoscaler was unable to compute the replica count
Causa:
O Horizontal Pod Autoscaler tem de calcular a utilização de recursos como uma percentagem para dimensionar a carga de trabalho, mas não consegue fazer este cálculo porque falta pelo menos um contentor na especificação do pod com uma definição resources.requests
para o recurso correspondente (cpu
ou memory
).
Resolução:
Para resolver este problema, atualize o manifesto do Pod na sua implementação, StatefulSet ou outro controlador para incluir um campo resources.requests
para o recurso (cpu
ou memory
) que o HorizontalPodAutoscaler está a tentar dimensionar para todos os contentores no Pod. Por exemplo:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
...
resources:
requests:
cpu: "100m"
memory: "128Mi"
Erro: não é possível obter métricas do agrupamento de anúncios para o agrupamento de anúncios
Pode ver este erro quando existe um problema ao obter as métricas necessárias para que um HorizontalPodAutoscaler tome decisões de escalabilidade. Está frequentemente relacionado com as definições de recursos de agrupamentos.
Sintomas:
Observa uma mensagem persistente semelhante à seguinte:
unable to fetch pod metrics for pod
É normal ver esta mensagem temporariamente quando o servidor de métricas é iniciado.
Causa:
Para dimensionar com base na percentagem de utilização de recursos (como cpu
ou memory
),
todos os contentores nos pods segmentados pelo objeto HorizontalPodAutoscaler
têm de ter o campo resources.requests
definido para esse recurso específico.
Caso contrário, o HorizontalPodAutoscaler não pode fazer os cálculos necessários e não toma nenhuma ação relacionada com essa métrica.
Resolução:
Se estas mensagens de erro persistirem e notar que os pods não estão a ser dimensionados para a sua carga de trabalho, certifique-se de que especificou pedidos de recursos para cada contentor na sua carga de trabalho.
Resolva problemas de erros de disponibilidade de dados e da API Metrics
As secções seguintes ajudam a resolver erros que ocorrem quando o HorizontalPodAutoscaler tenta obter dados de uma API de métricas. Estes problemas podem variar desde falhas de comunicação internas do cluster, em que a API de métricas está indisponível, a consultas inválidas que o fornecedor de métricas rejeita (vistas frequentemente como erros HTTP ao nível 400
).
Erro: não foram encontradas versões de métricas disponíveis conhecidas
Sintomas:
Repara no seguinte erro:
unable to fetch metrics from custom metrics API: no known available metric versions found
Causa:
Este erro indica uma falha de comunicação no cluster e não um problema com a origem das métricas (como o Cloud Monitoring). As causas comuns incluem o seguinte:
- O servidor da API Kubernetes está temporariamente indisponível (por exemplo, durante uma atualização do cluster ou uma reparação do plano de controlo).
- Os pods do adaptador de métricas (por exemplo,
custom-metrics-stackdriver-adapter
) não estão em bom estado, não estão em execução ou não estão registados corretamente no servidor da API.
Resolução:
Este problema é frequentemente temporário. Se o problema persistir, experimente as seguintes soluções:
Verifique o estado do plano de controlo do Kubernetes:
Na Google Cloud consola, veja o estado e o estado de funcionamento do cluster.
Aceda à página Clusters do Kubernetes.
Verifique as colunas Estado e Notificações do seu cluster.
Clique em
Notificações para procurar operações em curso, como atualizações ou reparações. O servidor da API pode estar brevemente indisponível durante estes horários.
Reveja os registos de auditoria do Cloud para verificar se existem erros relacionados com os componentes do plano de controlo. Para informações sobre como ver estes registos, consulte as informações de registo de auditoria do GKE.
Verifique o estado e os registos dos pods do adaptador de métricas: certifique-se de que os pods do adaptador de métricas estão no estado
Running
e não têm reinícios recentes:kubectl get pods -n custom-metrics,kube-system -o wide
Se o estado de um Pod for diferente de
Running
ou tiver uma contagem de reinícios elevada, investigue o Pod para encontrar a causa principal. Para ver sugestões de resolução de problemas, consulte Depurar pods na documentação do Kubernetes.Confirme se as APIs de métricas estão registadas e disponíveis:
kubectl get apiservice | grep metrics.k8s.io
Se as APIs de métricas estiverem em bom estado, o resultado é semelhante ao seguinte:
NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.metrics.k8s.io kube-system/metrics-server True 18d
Se a coluna
AVAILABLE
tiver um valor deFalse
, a colunaMessage
no manifesto completo do APIService pode fornecer mais detalhes.Pode ver o manifesto completo com o seguinte comando:
kubectl get apiservice API_SERVICE_NAME -o yaml
Substitua
API_SERVICE_NAME
pelo nome do objeto APIService, comov1beta1.custom.metrics.k8s.io
.
Erro: a consulta não devolve nenhuma série cronológica
Sintomas:
Repara no seguinte erro:
unable to fetch metrics from custom or external metrics API: googleapi: Error
400: The supplied filter [...] query will not return any time series
Causa:
A consulta enviada ao Cloud Monitoring era válida, mas não devolveu dados. Isto significa que não existem pontos de dados que correspondam ao seu filtro (o que é diferente de encontrar uma métrica com um valor de 0
). O motivo mais provável para este problema é que a aplicação ou a carga de trabalho responsável pela geração da métrica personalizada não estava a escrever dados no Cloud Monitoring durante o período em que os erros foram comunicados.
Resolução:
Experimente as seguintes soluções:
- Validar configuração: certifique-se de que os nomes e as etiquetas das métricas no objeto HorizontalPodAutoscaler correspondem precisamente aos emitidos pela aplicação.
- Verifique as autorizações: confirme se a aplicação está configurada corretamente com as autorizações e os pontos finais da API necessários para publicar métricas no Cloud Monitoring.
- Confirme a atividade da aplicação: verifique se a aplicação responsável pela métrica estava operacional e a tentar enviar dados para o Cloud Monitoring durante o período em que ocorreram os avisos do Horizontal Pod Autoscaler.
- Investigue a existência de erros: verifique se existem erros explícitos nos registos da aplicação no mesmo período relacionados com a emissão de métricas, como falhas de ligação, credenciais inválidas ou problemas de formatação.
Resolva problemas com métricas personalizadas e externas
Quando o HorizontalPodAutoscaler se baseia em métricas de origens que não sejam a CPU ou a memória predefinidas, podem ocorrer problemas no pipeline de métricas personalizadas ou externas. Esta pipeline consiste no controlador HorizontalPodAutoscaler, no servidor da API de métricas do Kubernetes, no adaptador de métricas e na origem de métricas (por exemplo, Cloud Monitoring ou Prometheus), conforme mostrado no diagrama seguinte:
Esta secção detalha como depurar este pipeline, desde o adaptador de métricas à origem de métricas.
Sintomas:
Os sintomas mais comuns de um problema no pipeline de métricas são os seguintes:
- O valor da métrica é apresentado como
<unknown>
. - Os eventos HorizontalPodAutoscaler mostram erros como
FailedGetExternalMetric
ouFailedGetCustomMetric
.
Causa:
Existe um problema no pipeline de métricas personalizadas ou externas.
Resolução:
Siga estes passos para ajudar a depurar o pipeline:
Verifique se o adaptador de métricas está registado e disponível: o adaptador de métricas tem de se registar no servidor da API Kubernetes principal para publicar métricas. Esta ação é a forma mais direta de verificar se o adaptador está em execução e se o servidor da API consegue aceder ao mesmo:
kubectl get apiservice | grep -E 'NAME|metrics.k8s.io'
No resultado, deve ver as entradas
v1beta1.custom.metrics.k8s.io
ouv1beta1.external.metrics.k8s.io
e um valor deTrue
na colunaAvailable
. Por exemplo:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18d
Se o valor na coluna
Available
forFalse
ou estiver em falta, é provável que o seu adaptador tenha falhado ou esteja configurado incorretamente. Verifique os registos do pod do adaptador no espaço de nomeskube-system
oucustom-metrics
para ver se existem erros relacionados com autorizações, conetividade de rede à origem da métrica ou mensagens que indicam que não foi possível encontrar a métrica.Se o valor for
True
, avance para o passo seguinte.
Consultar diretamente a API de métricas: se o adaptador estiver disponível, ignore o HorizontalPodAutoscaler e peça a métrica diretamente à API Kubernetes. Este comando testa todo o pipeline, desde o servidor da API ao adaptador de métricas até à origem de dados.
Para consultar métricas externas, execute o seguinte comando:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/METRIC_NAME" | jq .
Para consultar métricas de pods personalizadas, execute o seguinte comando:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/pods/*/METRIC_NAME" | jq .
Substitua o seguinte:
NAMESPACE_NAME
: o espaço de nomes onde os seus pods estão a ser executados.METRIC_NAME
: o nome da métrica personalizada ou externa que está a tentar consultar. Por exemplo,requests_per_second
ouqueue_depth
.
Analise o resultado do comando: o resultado dos comandos anteriores indica-lhe onde está o problema. Escolha o cenário que corresponde ao seu resultado:
- Resposta JSON bem-sucedida com um valor: o pipeline de métricas está a funcionar corretamente. O problema é provavelmente um problema de configuração no manifesto do HorizontalPodAutoscaler. Verifique se existem erros ortográficos no nome da métrica ou
matchLabels
incorretos. Error: Error from server (Service Unavailable)
: este erro indica normalmente um problema de conetividade de rede, que é frequentemente um problema de firewall em clusters que usam isolamento de rede.Identifique o serviço do adaptador de métricas. Normalmente, encontra-se no espaço de nomes
custom-metrics
oukube-system
:kubectl get service -n custom-metrics,kube-system | grep -E 'adapter|metrics'
Encontre a porta que o adaptador está a escutar:
kubectl get service ADAPTER_SERVICE -n ADAPTER_NAMESPACE -o yaml
Substitua o seguinte:
ADAPTER_SERVICE
: o nome do serviço Kubernetes associado ao adaptador de métricas que implementou. Este serviço é o serviço que encontrou no passo anterior. Este serviço expõe a funcionalidade do adaptador a outras partes do cluster, incluindo o servidor da API Kubernetes.ADAPTER_NAMESPACE
: o espaço de nomes onde reside o serviço do adaptador (por exemplo,custom-metrics
oukube-system
).
Encontre as regras de firewall de entrada para o plano de controlo do cluster:
gcloud compute firewall-rules list \ --filter="name~gke-CLUSTER_NAME-[0-9a-z]*-master"
Substitua
CLUSTER_NAME
pelo nome do seu cluster.Adicione o
targetPort
do adaptador à regra:Descreva a regra atual para ver as portas permitidas existentes:
gcloud compute firewall-rules describe FIREWALL_RULE_NAME
Substitua
FIREWALL_RULE_NAME
pelo nome da regra de firewall que rege o tráfego de rede para o plano de controlo do cluster Kubernetes.Atualize a regra para adicionar a porta do adaptador à lista:
gcloud compute firewall-rules update FIREWALL_RULE_NAME \ --allow tcp:443,tcp:10250,tcp:ADAPTER_PORT
Substitua
ADAPTER_PORT
pela porta de rede que o adaptador de métricas está a ouvir.
Certifique-se de que as políticas de rede do Kubernetes não estão a bloquear o tráfego para os pods do adaptador de métricas:
kubectl get networkpolicy -n custom-metrics,kube-system
Reveja todas as políticas para garantir que permitem o tráfego de entrada do plano de controlo ou do servidor da API para o
ADAPTER_SERVICE
noADAPTER_PORT
.
Uma lista vazia
[]
: este resultado significa que o adaptador está em execução, mas não consegue obter a métrica específica, o que indica um problema com a configuração do adaptador ou a própria origem da métrica.Problemas com o pod do adaptador: inspecione os registos do pod do adaptador de métricas ou dos pods para ver se existem erros relacionados com chamadas da API, autenticação ou obtenção de métricas. Para inspecionar os registos, faça o seguinte:
Encontre o nome do pod do adaptador:
kubectl get pods -n ADAPTER_NAMESPACE
Ver os respetivos registos:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACE
Substitua o seguinte:
ADAPTER_POD_NAME
: o nome do agrupamento do adaptador que identificou no passo anterior.ADAPTER_NAMESPACE
: o espaço de nomes onde o pod do adaptador reside (por exemplo,custom-metrics
oukube-system
).
Não existem dados na origem: a métrica pode não existir no sistema de origem. Use uma ferramenta de monitorização, como o Explorador de métricas, para confirmar que a métrica existe e tem o nome e as etiquetas corretos.
- Resposta JSON bem-sucedida com um valor: o pipeline de métricas está a funcionar corretamente. O problema é provavelmente um problema de configuração no manifesto do HorizontalPodAutoscaler. Verifique se existem erros ortográficos no nome da métrica ou
Resolva problemas de falha na redução da escala do redimensionador automático horizontal de pods
Esta secção ajuda a compreender por que motivo um HorizontalPodAutoscaler pode não estar a reduzir a escala da sua carga de trabalho conforme esperado.
Sintomas:
O HorizontalPodAutoscaler dimensiona com êxito a carga de trabalho, mas não a reduz, mesmo quando as métricas, como a utilização da CPU, são baixas.
Causa:
Este comportamento destina-se a evitar o aumento e a diminuição rápidos ou a diminuição com base em informações incompletas. Os dois motivos principais são os seguintes:
- Usar várias métricas: o redimensionador automático de pods horizontal é dimensionado com base na métrica que requer o maior número de réplicas. Se tiver várias métricas, a carga de trabalho não é reduzida, a menos que todas as métricas indiquem que são necessárias menos réplicas. Uma métrica que exige um número elevado de réplicas impede a redução da escala, mesmo que outras sejam baixas.
- Métricas indisponíveis: se alguma métrica ficar indisponível (apresentada frequentemente como
<unknown>
), o Horizontal Pod Autoscaler recusa-se conservadoramente a reduzir a escala da carga de trabalho. Não é possível determinar se a métrica está em falta porque o uso é realmente zero ou porque o pipeline de métricas está danificado. Este problema é comum com métricas personalizadas baseadas em taxas (por exemplo,messages_per_second
), que podem parar de comunicar dados quando não existe atividade, o que faz com que o Horizontal Pod Autoscaler veja a métrica como indisponível e interrompa as operações de redução da escala. - Atraso na redução da política de escalabilidade: o campo
behavior
do HorizontalPodAutoscaler permite-lhe configurar políticas de escalabilidade. A política predefinida para a redução inclui um período de estabilização de 300 segundos (cinco minutos). Durante este período, o HorizontalPodAutoscaler não reduz a quantidade de réplicas, mesmo quando os valores das métricas tiverem ficado abaixo do limite de destino. Esta janela impede flutuações rápidas, mas pode tornar a redução mais lenta do que o esperado.
Resolução:
Experimente as seguintes soluções:
Para várias métricas e métricas indisponíveis, diagnostique a métrica que está a causar problemas:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Na saída, procure na secção
Metrics
qualquer métrica com o estado<unknown>
e na secçãoEvents
avisos comoFailedGetCustomMetric
ouFailedGetExternalMetric
. Para uma depuração detalhada do pipeline, consulte a secção Resolva problemas de métricas personalizadas e externas.Para métricas indisponíveis, se uma métrica ficar indisponível durante períodos de tráfego baixo (comum com métricas baseadas em taxas), experimente uma das seguintes soluções:
- Use métricas baseadas em indicadores em vez de métricas baseadas em taxas, sempre que possível. Uma métrica de indicador, como o número total de mensagens numa fila (por exemplo,
subscription
ounum_undelivered_messages
), comunica consistentemente um valor, mesmo que esse valor seja0
, o que permite ao Horizontal Pod Autoscaler tomar decisões de escalabilidade de forma fiável. - Certifique-se de que a origem da métrica comunica valores zero. Se controlar a métrica personalizada, configure-a para publicar um
0
durante os períodos de inatividade, em vez de não enviar dados.
- Use métricas baseadas em indicadores em vez de métricas baseadas em taxas, sempre que possível. Uma métrica de indicador, como o número total de mensagens numa fila (por exemplo,
Para atrasos na redução da escala da política de escalabilidade, se o período de estabilização predefinido de cinco minutos para reduções da escala for demasiado longo, personalize-o. Inspeccione a secção
spec.behavior.scaleDown
do manifesto HorizontalPodAutoscaler. Pode diminuir ostabilizationWindowSeconds
para permitir que o ajuste de escala automático seja feito mais rapidamente após a diminuição das métricas. Para mais informações sobre a configuração destas políticas, consulte as Políticas de dimensionamento na documentação do Kubernetes.
O que se segue?
Se não conseguir encontrar uma solução para o seu problema na documentação, consulte a secção Obtenha apoio técnico para receber mais ajuda, incluindo aconselhamento sobre os seguintes tópicos:
- Abrindo um registo de apoio técnico através do contacto com o Cloud Customer Care.
- Receber apoio técnico da comunidade fazendo perguntas no StackOverflow e usando a etiqueta
google-kubernetes-engine
para pesquisar problemas semelhantes. Também pode juntar-se ao#kubernetes-engine
canal do Slack para receber mais apoio técnico da comunidade. - Abrir erros ou pedidos de funcionalidades através do rastreador de problemas público.