Este documento ajuda a resolver problemas em que as cargas de trabalho do GKE não são programadas em nós definidos por uma ComputeClass personalizada ou quando o escalonador automático de cluster não provisiona os tipos de máquina esperados.
Este documento é destinado a desenvolvedores de aplicativos e administradores e operadores de plataforma que usam ComputeClasses personalizadas para gerenciar a programação de cargas de trabalho e a criação automática de pool de nós no GKE. Para mais informações sobre os papéis comuns e as tarefas de exemplo referenciados no conteúdo do Cloud de Confiance by S3NS , consulte Tarefas e papéis de usuário comuns do GKE.
Principais conceitos
Para ajudar na solução de problemas, conheça os seguintes componentes e mecanismos do GKE:
ComputeClass personalizada: um recurso específico do GKE que permite definir uma lista priorizada de configurações de nós para escalonamento automático. Para mais informações, consulte Sobre as ComputeClasses personalizadas.
Escalonador automático de clusters: o componente que adiciona ou remove nós automaticamente no cluster com base na demanda da carga de trabalho. Para mais informações, consulte Sobre o escalonamento automático de clusters do GKE.
Criação automática de pools de nós: o escalonador automático de cluster do GKE cria e gerencia pools de nós automaticamente com base nos requisitos da carga de trabalho. Para mais informações, consulte Sobre a criação automática de pools de nós.
Lógica de substituição: o mecanismo em que o escalonador automático de clusters tenta provisionar nós que correspondem primeiro à regra de prioridade mais alta. Para mais informações, consulte Escolher as prioridades de computação substitutas.
Resolver problemas por sintomas
Este documento organiza as etapas de solução de problemas em sequência, desde verificações fundamentais até configurações mais avançadas. Para um diagnóstico mais abrangente, recomendamos seguir estas etapas em ordem. Como alternativa, se você estiver com problemas específicos, consulte os links relevantes na tabela a seguir:
| Sintoma | Etapas da solução de problemas |
|---|---|
O pod que solicita uma ComputeClass personalizada está travado no estado Pending |
|
| O escalonador automático de cluster não está criando novos nós que correspondem à ComputeClass personalizada | |
| O escalonador automático de clusters cria tipos de máquina padrão em vez de tipos especializados | Analisar o comportamento de fallback do escalonador automático |
A saída do comando kubectl describe computeclass mostra um status não íntegro |
Verificar configurações personalizadas de ComputeClass |
| As cargas de trabalho não estão migrando para nós de prioridade mais alta | Verificar a integridade geral do escalonador automático de cluster |
| As cargas de trabalho de VMs de GPU ou de VM spot têm problemas de programação |
Problemas fora do escopo
Este documento não aborda os seguintes problemas:
- Problemas gerais de rede do GKE, como conectividade de pod para pod ou balanceamento de carga de serviço.
- Problemas relacionados ao Escalonador automático horizontal de pods (HPA) ou ao Autoescalonador de Pods Vertical (VPA).
- Problemas não relacionados ao mecanismo de ComputeClass personalizada, como erros no nível do aplicativo ou problemas de PersistentVolume que não estão relacionados a restrições de programação.
- Problemas de cota ou indisponibilidade de recursos que não estão diretamente relacionados à lógica de fallback da ComputeClass.
Identificar variáveis de marcador de posição
Para personalizar os comandos neste documento, insira seus valores específicos na coluna Variable. Os valores editados são sincronizados automaticamente em todos os blocos de código e comandos.
| Variável | Descrição |
|---|---|
| PROJECT_ID | O ID do projeto do Cloud de Confiance . |
| LOCATION | A região ou zona do Compute Engine em que o cluster está localizado. |
| CLUSTER_NAME | O nome do cluster. |
| NODE_POOL_NAME | O nome do pool de nós a ser inspecionado (se aplicável a clusters padrão). |
| CUSTOM_COMPUTECLASS_NAME | O nome da ComputeClass personalizada solicitada pelo pod. |
| NAMESPACE | O namespace do pod que não está sendo programado. |
| POD_NAME | O nome do pod que não está sendo programado. |
Antes de começar
Para receber as permissões necessárias para realizar as tarefas neste documento, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto do Cloud de Confiance by S3NS :
-
Para acessar clusters do GKE:
Leitor de cluster do Kubernetes Engine (
roles/container.viewer). -
Para ver os registros:
Visualizador de registros (
roles/logging.viewer). -
Para gerenciar clusters do GKE: administrador do Kubernetes Engine (
roles/container.admin).
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.
Para configurar o kubectl para se comunicar com o cluster, execute o seguinte
comando:
gcloud container clusters get-credentials CLUSTER_NAME
--location LOCATION
--project PROJECT_ID
Realizar verificações de diagnóstico básicas
Verifique se os componentes principais estão configurados corretamente e se o cluster é compatível com ComputeClasses personalizadas.
Verificar o status e o seletor do pod
Confirme se o pod está no estado Pending e solicita corretamente a ComputeClass personalizada.
Liste os pods no estado
Pending:kubectl get pods --all-namespaces -o wide | grep PendingInspecione a especificação do pod para o campo
nodeSelector:kubectl get pod POD_NAME -n NAMESPACE -o jsonpath='{.spec.nodeSelector}'
Avaliar o resultado
- A saída mostra o rótulo:o campo
nodeSelectorestá configurado corretamente com o rótulocloud.google.com/compute-class. - A saída não mostra o rótulo:
- Interpretação:pode haver um campo
nodeSelectorincorreto ou ausente para o rótulocloud.google.com/compute-classna configuração de implantação da carga de trabalho. - Resolução:modifique o arquivo YAML da sua carga de trabalho, como uma implantação ou um job, para incluir o campo
nodeSelectorna seçãospec.template.spec.
- Interpretação:pode haver um campo
Verificar a compatibilidade da versão do cluster
As ComputeClasses personalizadas exigem o GKE versão 1.30.3-gke.1451000 ou posterior. Verifique se o cluster está executando uma versão que oferece suporte a ComputeClasses personalizadas.
Verifique a versão do cluster:
gcloud container clusters describe CLUSTER_NAME
--location LOCATION
--format="value(currentMasterVersion)"
Avaliar o resultado
- Versão
1.30.3-gke.1451000ou mais recente:sua versão do cluster é compatível com ComputeClasses personalizadas. - Versão anterior a
1.30.3-gke.1451000:- Interpretação:seu cluster não foi atualizado para uma versão que oferece suporte a ComputeClasses personalizados.
- Resolução:faça upgrade do cluster para usar ComputeClasses personalizadas.
Verificar os nós provisionados para a ComputeClass personalizada
Para verificar se há nós no cluster associados à sua ComputeClass, liste os nós que correspondem ao rótulo da ComputeClass:
kubectl get nodes -l cloud.google.com/compute-class=CUSTOM_COMPUTECLASS_NAME
Se a saída for No resources found, não haverá nós associados
à ComputeClass. Verifique se as cargas de trabalho realmente selecionaram essa ComputeClass
e confira os eventos de escalonamento automático para erros de escalonamento vertical.
Verificar configurações de ComputeClass personalizada
Configurações incorretas no recurso ComputeClass personalizado podem impedir a programação de pods ou o provisionamento correto de nós pelo GKE.
Verificar a integridade e o status da ComputeClass
Verifique se o GKE informa a ComputeClass personalizada como íntegra.
Liste todos os recursos
ComputeClass:kubectl get computeclassDescreva o recurso
ComputeClassespecífico:kubectl describe computeclass CUSTOM_COMPUTECLASS_NAME
Avaliar o resultado
O status de integridade mostra
True:a ComputeClass personalizada está íntegra. Veja a seguir um exemplo de uma ComputeClass personalizada íntegra:Status: Conditions: Last Transition Time: 2024-01-19T17:18:48Z Message: CCC is healthy. Reason: Health Status: True Type: HealthO status de integridade mostra
False:- Interpretação:a ComputeClass personalizada não está íntegra. Analise os campos
MessageeReasonna saída para identificar o problema. - Resolução:execute a ação que corresponde ao campo
Reasonna saída:NodePoolNotExist: verifique se o pool de nós referenciado existe ou atualize a ComputeClass para referenciar um pool de nós atual.ReservationUnusable: verifique a configuração e o uso da reserva referenciada.Invalid machine type: atualize a ComputeClass para usar um tipo de máquina compatível com a região ou zona do cluster.
- Interpretação:a ComputeClass personalizada não está íntegra. Analise os campos
Validar a política unsatisfiable
O campo whenUnsatisfiable determina o comportamento quando nenhuma regra de prioridade pode ser
atendida.
Confira a política:
kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yaml
Inspecione o campo spec.whenUnsatisfiable na saída. Esse campo pode ter um dos
seguintes valores:
DoNotScaleUp: os pods vão permanecer no estadoPendingse não for possível criar nós preferenciais.ScaleUpAnyway: os pods podem ser executados em tipos de nó padrão (como a série E2) se os nós preferenciais não estiverem disponíveis.
Avaliar o resultado
O efeito da política whenUnsatisfiable depende do valor dela:
- Se o valor for
DoNotScaleUp:- Interpretação:esse é o comportamento esperado quando nenhuma regra de prioridade pode ser atendida, possivelmente devido à indisponibilidade de recursos ou aos limites de cota. Se os pods precisarem esperar por um hardware específico, esse valor estará correto.
- Resolução:se a execução da carga de trabalho for mais importante do que a execução em um hardware específico, mude a política para
ScaleUpAnyway.
- Se o valor for
ScaleUpAnyway:- Interpretação:esse comportamento é esperado. O GKE está voltando aos tipos de nós padrão porque os nós preferenciais não estão disponíveis.
- Resolução:se os pods não puderem ser executados em tipos de nó padrão, mude a política para
DoNotScaleUp.
- Comportamento padrão:se você não especificou um valor para o campo
whenUnsatisfiablee está usando uma versão do GKE anterior à 1.33, a política padrão éScaleUpAnyway.
O exemplo a seguir mostra como atualizar a política editando o campo whenUnsatisfiable no manifesto do ComputeClass:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: CUSTOM_COMPUTECLASS_NAME
spec:
# ... other fields
whenUnsatisfiable: DoNotScaleUp # or ScaleUpAnyway
Verificar as restrições de programação de pods
Verifique se a especificação do pod é compatível com os atributos dos nós provisionados pela ComputeClass personalizada.
Verificar solicitações de recursos de pods
Verifique se as solicitações de CPU, memória e GPU do pod podem ser atendidas por pelo menos um dos tipos de máquina definidos no campo priorities da ComputeClass personalizada.
Receba solicitações de recursos de pods:
kubectl get pod POD_NAME -n NAMESPACE -o jsonpath='{.spec.containers[*].resources.requests}'Inspecione a saída de
cpu,memorye solicitações de GPU, comonvidia.com/gpu.Compare essas solicitações com os tipos de máquina definidos no campo
prioritiesda ComputeClass personalizada:kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o jsonpath='{.spec.priorities}'Inspecione a saída dos campos
machineTypeoumachineFamily. Para cada tipo de máquina na ComputeClass personalizada, confira as especificações na documentação sobre tipos de máquinas e verifique se os recursos alocáveis são maiores do que as solicitações do pod.
Avaliar o resultado
- Recursos compatíveis:as solicitações de recursos do pod são menores ou iguais aos recursos alocáveis de pelo menos um tipo de máquina na ComputeClass.
Os recursos excedem a capacidade:
- Interpretação:o pod não pode ser programado porque nenhum tipo de máquina na ComputeClass fornece CPU, memória ou GPU suficientes. Isso também pode acontecer se o campo
nodePoolAutoCreationestiver definido comotruee a solicitação de memória do pod exceder os limites dos pools de nós criados automaticamente. - Resolução:ajuste as solicitações de recursos do pod ou os tipos de máquina da ComputeClass personalizada:
- Reduza as solicitações de recursos do pod: se as solicitações de recursos forem altas, diminua os valores de
cpu,memoryougpuno arquivo YAML da carga de trabalho. - Mudar para tipos de máquina maiores: se as solicitações do pod forem justificadas, modifique o campo
spec.prioritiesno manifesto da ComputeClass personalizada para incluir opções maiores demachineTypeoumachineFamilyque possam atender às demandas do pod. Exemplo:
- Reduza as solicitações de recursos do pod: se as solicitações de recursos forem altas, diminua os valores de
spec: priorities: - machineType: n2d-highmem-96 # A larger machine type spot: true # ... other priorities- Interpretação:o pod não pode ser programado porque nenhum tipo de máquina na ComputeClass fornece CPU, memória ou GPU suficientes. Isso também pode acontecer se o campo
Verificar se há taints e tolerâncias conflitantes
Os nós criados para uma ComputeClass personalizada têm o
taint cloud.google.com/compute-class=CUSTOM_COMPUTECLASS_NAME:NoSchedule.
O GKE adiciona essa tolerância aos pods automaticamente.
No entanto, hardwares especializados, como GPUs, têm taints adicionais, como o taint nvidia.com/gpu=present:NoSchedule. Se a ComputeClass usar
nós com hardware especializado, os pods precisam ter uma tolerância para esses
taints para serem programados nesses nós.
Verifique o campo tolerations do pod:
kubectl get pod POD_NAME
-n NAMESPACE
-o jsonpath='{.spec.tolerations}'
Avaliar o resultado
- Tolerâncias corretas:as restrições e tolerâncias estão configuradas corretamente.
Tolerâncias ausentes:
- Interpretação:a falta de tolerâncias impede que o pod seja programado em nós com taints de hardware especializados. Por exemplo, se a ComputeClass usar nós de GPU, o pod pode não ter a tolerância
nvidia.com/gpu=present:NoSchedule. Para requisitos específicos da GPU, consulte Verificar a configuração da GPU. Resolução:no campo
tolerationsda especificação do pod, adicione as tolerâncias necessárias para corresponder aos taints nos nós definidos pela ComputeClass. Por exemplo, para nós de GPU, adicione uma tolerância ao taintnvidia.com/gpu=present:NoScheduleda seguinte maneira:spec: template: spec: tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule" # ... other tolerations and Pod spec
- Interpretação:a falta de tolerâncias impede que o pod seja programado em nós com taints de hardware especializados. Por exemplo, se a ComputeClass usar nós de GPU, o pod pode não ter a tolerância
Analisar a métrica de pods pendentes do escalonador automático de clusters
Versões aplicáveis do GKE: 1.37 e mais recentes
Para entender por que os pods que solicitam uma ComputeClass específica estão
pendentes, use a métrica kubernetes.io/autoscaler/cluster_pending_pods_per_ccc
no Cloud Monitoring. Essa métrica ajuda a identificar se o problema é a
falta de nós adequados para a ComputeClass, um problema com o provisionamento
ou algo inerente à configuração do pod. Essa métrica mostra o número de pods que o escalonador automático de cluster está processando, dividido por ComputeClass, o motivo de estar pendente e se é um pod do sistema ou do usuário.
Etapas para consultar
Para consultar a métrica no console do Cloud de Confiance , siga estas etapas:
- No console Cloud de Confiance , acesse a página do Metrics Explorer.
- Selecione o Tipo de recurso:
k8s_entity. - Selecione a Métrica:
kubernetes.io/autoscaler/cluster_pending_pods_per_ccc. - Adicione um filtro:
entity_type = ComputeClass. - Adicione um Filtro para sua ComputeClass específica:
entity_name = "COMPUTECLASS_NAME".- Para ver os pods que não estão usando nenhuma ComputeClass, filtre com
entity_name = "".
- Para ver os pods que não estão usando nenhuma ComputeClass, filtre com
- Agrupe por
metric.labels.reasonpara ver os estados do escalonador automático desses pods. Também é possível agrupar pods usando o rótulo de chavemetric.labels.type.
Exemplo de consulta PromQL
Para encontrar o status dos pods de usuário pendentes que solicitam a ComputeClass "COMPUTECLASS_NAME", use a seguinte consulta do PromQL:
sum by (reason) (
kubernetes_io:autoscaler_cluster_pending_pods_per_ccc{
monitored_resource="k8s_entity",
entity_type="ComputeClass",
entity_name="COMPUTECLASS_NAME",
type="user_pod"
}
)
Motivos de métricas
A saída do rótulo da chave metric.labels.reason pode incluir o seguinte:
unable_to_provision: o escalonador automático de cluster está bloqueado. Os pods nesse estado para uma ComputeClass não podem ser programados porque não é possível criar novos nós. Verifique os registros do escalonador automático de cluster no plano de controle para mais detalhes sobre falta de estoque, cotas ou configurações incorretas na definição da ComputeClass. Revise também os eventos de visibilidade do escalonador automático de clusters.provisioning_in_progress: um escalonamento vertical foi acionado para nós que precisam corresponder aos requisitos da ComputeClass. Se os pods permanecerem aqui, pode haver atrasos na criação ou prontidão do nó.unprocessed: o escalonador automático de cluster ainda não avaliou esses pods. Um número alto persistente pode indicar um atraso no escalonador automático.no_action_taken: o escalonador automático de clusters decidiu não escalonar esses pods. Esse comportamento pode ser resultado de restrições de pod que não podem ser atendidas pelos tipos de nó da ComputeClass ou por outros limites no nível do cluster. Examine a especificação do pod (kubectl describe pod) e os registros do escalonador automático de cluster.
Analisar falhas de provisionamento de nós
Versões do GKE aplicáveis: 1.37 e mais recentes
Para verificar o status de integridade atual de uma ComputeClass, consulte
Verificar a integridade da ComputeClass. Se você observar que os pods associados
a uma ComputeClass estão em um estado unable_to_provision, o escalonador automático de clusters
não está provisionando novos nós que atendam aos requisitos da ComputeClass.
Use a métrica do Cloud Monitoring kubernetes.io/autoscaler/cluster_node_provisioning_failed_attempts_count_per_ccc para diagnosticar a causa raiz.
- No console do Cloud de Confiance , acesse Monitoring e Metrics Explorer.
- Selecione o Tipo de recurso como
k8s_entity. - Selecione a Métrica como
kubernetes.io/autoscaler/cluster_node_provisioning_failed_attempts_count_per_ccc. - Adicione um Filtro:
resource.labels.entity_type = ComputeClass. - Adicione um filtro para sua ComputeClass específica:
entity_name = "CUSTOM_COMPUTECLASS_NAME".- Para ver os pods que não usam nenhuma ComputeClass, filtre com
entity_name = "".
- Para ver os pods que não usam nenhuma ComputeClass, filtre com
- Na seção Agrupar por, selecione
metric.labels.reasoneresource.labels.entity_name. - Escolha um Agregador, como
rateoudelta.
A taxa ou mudança nas falhas é exibida, dividida por motivo.
Interpretar motivos de falha
O campo metric.labels.reason fornece insights sobre por que a criação de nós está
falhando. Ao identificar os principais motivos da falha, você pode tomar medidas corretivas.
Os possíveis motivos incluem:
| Motivo | Explicação | Possíveis ações corretivas |
|---|---|---|
QUOTA_EXCEEDED |
Um limite de cota do Cloud de Confiance by S3NS foi atingido (por exemplo, CPUs, discos ou endereços IP). Revise as cotas do projeto. | Solicite aumento de cota. |
RESOURCE_POOL_EXHAUSTED |
Indisponibilidade do Compute Engine; capacidade insuficiente para os recursos solicitados na zona. | Tente outros tipos de máquinas ou zonas. Modifique a ComputeClass para incluir tipos de máquina ou zonas de substituição. Use reservas. |
IP_SPACE_EXHAUSTED |
A sub-rede do nó ficou sem endereços IP disponíveis. | Expanda o intervalo de endereços IP principal da sub-rede. |
PERMISSIONS_ERROR |
A conta de serviço do GKE não tem as permissões necessárias do IAM para criar recursos (por exemplo, instâncias, discos). | Conceda os papéis necessários à conta de serviço do GKE. |
VM_EXTERNAL_IP_ACCESS_POLICY_CONSTRAINT |
Uma política da organização (constraints/compute.vmExternalIpAccess) impede a criação de nós com IPs externos conforme configurado. |
Revise e modifique a política da organização ou a configuração do nó da ComputeClass. |
INVALID_RESERVATION |
A reserva do Compute Engine configurada é inválida, está configurada incorretamente ou não corresponde à solicitação do nó. | Verifique as configurações de reserva e a definição de ComputeClass. |
RESERVATION_NOT_FOUND |
O nome da reserva do Compute Engine especificado não existe. | Verifique o nome da reserva na ComputeClass. |
RESERVATION_NOT_READY |
A reserva de destino ainda não está ativa ou ainda está sendo provisionada. | Aguarde até que a reserva fique ativa. |
RESERVATION_CAPACITY_EXCEEDED |
A reserva está cheia e não pode atender à solicitação. | Aumente o tamanho da reserva ou use outros tipos de máquina. |
RESERVATION_INCOMPATIBLE |
A configuração do nó (por exemplo, tipo de máquina ou zona) não corresponde às propriedades da reserva. | Alinhe a especificação do nó ComputeClass com as propriedades da reserva. |
AUTOMATIC_RESERVATIONS_NOT_AVAILABLE |
Ocorreu um problema ao tentar usar as reservas automáticas. | Verifique os registros. Talvez seja necessário entrar em contato com o Cloud Customer Care. |
AUTOMATIC_RESERVATIONS_NO_CAPACITY |
As reservas automáticas não têm capacidade suficiente. | Talvez seja necessário mudar para reservas manuais ou tipos de máquina diferentes. |
UNSUPPORTED_TPU_CONFIGURATION |
A configuração de TPU solicitada é inválida ou não é compatível com a zona ou o projeto selecionado. | Confira a documentação da TPU e a ComputeClass. |
GkePersistentOperationError |
Ocorreu um erro persistente no plano de controle do GKE durante o processo de criação do nó. | Entre em contato com o Cloud Customer Care. |
OTHER |
Uma explicação abrangente para falhas que não se encaixam em outras categorias. | Para mais detalhes, consulte os registros do escalonador automático de clusters no plano de controle. |
Configuração do pool de nós (clusters padrão)
Nos clusters do GKE Standard, os pools de nós criados manualmente precisam ser rotulados e corrompidos para funcionar com uma ComputeClass personalizada.
Verificar identificadores e taints do pool de nós
Identifique os pools de nós na sua ComputeClass personalizada. Se a ComputeClass personalizada usar o campo
nodePools, anote os nomes dos pools de nós listados:kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yamlPara cada pool de nós identificado, verifique a configuração:
gcloud container node-pools describe NODE_POOL_NAME --cluster CLUSTER_NAME --location LOCATION --format="yaml(config.labels, config.taints)"
Avaliar o resultado
- Pool de nós configurado corretamente:o pool de nós tem o rótulo
cloud.google.com/compute-class: CUSTOM_COMPUTECLASS_NAMEe o taintcloud.google.com/compute-class=CUSTOM_COMPUTECLASS_NAME:NoSchedule. Pool de nós configurado incorretamente:
- Interpretação:o pool de nós não foi configurado com o rótulo e o taint necessários para associá-lo à ComputeClass personalizada.
Resolução:atualize o pool de nós para adicionar o rótulo e o taint:
Adicione ou atualize o rótulo do nó:
gcloud container node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME --location=LOCATION \ --node-labels=cloud.google.com/compute-class=CUSTOM_COMPUTECLASS_NAMEAdicione ou atualize o taint do nó:
gcloud container node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME --location=LOCATION \ --node-taints=cloud.google.com/compute-class=CUSTOM_COMPUTECLASS_NAME:NoSchedule
Verificar a configuração de criação automática de pool de nós
Para clusters do Autopilot e do Standard com nodePoolAutoCreation definido como true,
a criação automática de pool de nós precisa ser configurada corretamente.
Verificar se a criação automática de pool de nós está ativada
Verifique se o campo
nodePoolAutoCreation.enabledna ComputeClass personalizada está definido comotrue:kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yamlVerifique se a criação automática de pool de nós está ativada no cluster:
gcloud container clusters describe CLUSTER_NAME --location LOCATION --format="value(autoscaling.enableNodeAutoprovisioning)"
Se um deles estiver desativado, a criação automática de pool de nós não vai criar novos pools para sua ComputeClass personalizada.
Avaliar o resultado
- Criação automática de pool de nós ativada:na ComputeClass, o campo
nodePoolAutoCreation.enabledestá definido comotrue, e o provisionamento automático de nós está ativado no nível do cluster. Criação automática de pool de nós desativada:
- Interpretação:a criação automática de pool de nós será desativada se o valor do campo
nodePoolAutoCreation.enabledforfalseou estiver ausente na ComputeClass ou se o provisionamento automático de nós no nível do cluster estiver desativado. Resolução:ative a criação automática de pool de nós:
Edite o arquivo YAML da ComputeClass personalizada para incluir
nodePoolAutoCreation: enabled: true:spec: # ... priorities nodePoolAutoCreation: enabled: trueAtive a criação automática de pool de nós no nível do cluster e configure os limites de recursos:
gcloud container clusters update CLUSTER_NAME --location LOCATION \ --enable-autoprovisioning \ --autoprovisioning-min-cpu=MIN_CPU \ --autoprovisioning-max-cpu=MAX_CPU \ --autoprovisioning-min-memory=MIN_MEMORY \ --autoprovisioning-max-memory=MAX_MEMORY
- Interpretação:a criação automática de pool de nós será desativada se o valor do campo
Verificar os limites de recursos para a criação automática de pool de nós
A criação automática de pools de nós tem limites de CPU e memória para todo o cluster. Se o uso atual do cluster mais os recursos de um novo nó excederem esses limites, a criação automática de pool de nós não provisionará novos nós.
Confira os limites de recursos:
gcloud container clusters describe CLUSTER_NAME --location LOCATION --format="value(autoscaling.resourceLimits)"A saída lista os campos
resourceType,minimumemaximumpara CPU e memória (em GB).Revise os tipos de máquina nas prioridades da ComputeClass personalizada. Confira as especificações de CPU e memória na documentação sobre tipos de máquina.
Determine a capacidade total atual de CPU e memória de todos os nós no cluster. A soma da capacidade atual mais os recursos de um possível novo nó não pode exceder o limite máximo para a criação automática de pool de nós.
Avaliar o resultado
- Capacidade suficiente:o cluster tem capacidade de CPU e memória suficiente dentro dos limites de recursos para que a criação automática de pool de nós provisione um novo nó.
Limites excedidos:
- Interpretação:a criação automática de pool de nós não pode provisionar novos nós porque o cluster atingiu os limites de CPU ou memória, ou os limites foram definidos muito baixos para os tipos de máquina na ComputeClass.
Resolução:aumente os limites de recursos para a criação automática de pool de nós:
Determine novos limites máximos que considerem o uso atual e o crescimento futuro, incluindo os maiores tipos de máquina na ComputeClass personalizada.
Atualizar os limites de recursos para a criação automática de pool de nós de nós. É possível definir vários recursos em um comando:
gcloud container clusters update CLUSTER_NAME --location LOCATION \ --set-nap-resource-limits resourceType=cpu,maximum=NEW_MAX_CPU \ --set-nap-resource-limits resourceType=memory,maximum=NEW_MAX_GB
Analisar o comportamento de fallback do escalonador automático
Esta seção ajuda você a investigar fatores externos para entender por que o escalonador automático de clusters pode estar ignorando as opções preferidas e usando substitutos ou não conseguindo fazer escalonar verticalmente.
As ComputeClasses personalizadas usam uma lógica de substituição priorizada. Se um pod não estiver sendo programado em nós que correspondem à regra de maior prioridade, isso geralmente se deve a restrições como indisponibilidade de recursos ou cotas de projeto. Quando o GKE não consegue provisionar nós que correspondam a uma regra de prioridade específica, por exemplo, devido a um erro ZONE_RESOURCE_POOL_EXHAUSTED ou QUOTA_EXCEEDED do Compute Engine, o escalonador automático de clusters tenta imediatamente a próxima regra na lista priorities. Não há período de espera antes que o GKE volte para a próxima prioridade, exceto ao usar TPUs ou o modelo de provisionamento de início flexível, que aceitam um atraso configurável.
Verificar se há indisponibilidade de recursos
Verifique se os recursos estão indisponíveis na zona especificada conferindo os registros do escalonador automático de clusters ou os erros do grupo gerenciado de instâncias (MIG) do Compute Engine.
Opção 1: verificar eventos de visibilidade do escalonador automático de clusters
No console do Cloud de Confiance , acesse Cloud Logging > Análise de registros e execute a seguinte consulta para encontrar eventos do escalonador automático que possam indicar indisponibilidade de recursos:
resource.type="k8s_cluster"
resource.labels.location="LOCATION"
resource.labels.cluster_name="CLUSTER_NAME"
log_id("container.googleapis.com/cluster-autoscaler-visibility")
jsonPayload.noScaleUpReason.messageId="no.scale.up.nap.resource.exhausted"
Opção 2: verificar erros do MIG
É possível verificar erros de MIG no console Cloud de Confiance ou usando uma consulta do Cloud Logging.
Usando o console do Cloud de Confiance :
- No console do Cloud de Confiance , acesse Compute Engine > Grupos de instâncias.
- Encontre o MIG correspondente ao pool de nós que não está sendo escalonar verticalmente.
- Clique no nome do MIG e acesse a guia Erros. Procure mensagens que indiquem esgotamento de recursos.
Usando a consulta do Cloud Logging:
- No console do Cloud de Confiance , acesse Cloud Logging > Análise de registros.
- Execute a consulta a seguir para verificar se há erros de esgotamento de recursos do MIG:
resource.type="gce_instance" log_id("cloudaudit.googleapis.com/activity") protoPayload.status.message:("ZONE_RESOURCE_POOL_EXHAUSTED" OR "does not have enough resources available to fulfill the request" OR "resource pool exhausted" OR "does not exist in zone")
Avaliar o resultado
- Os recursos estão disponíveis:se os registros não mostrarem as mensagens
ZONE_RESOURCE_POOL_EXHAUSTED, é improvável que a indisponibilidade de recursos seja a causa da falha de escalonamento vertical. Os recursos não estão disponíveis:
- Interpretação:o provisionamento de nós falha devido a uma alta demanda temporária por um tipo de máquina específico (especialmente VMs spot ou GPUs) nessa zona ou porque um pod está restrito pela afinidade do PersistentVolume a uma zona que está passando por indisponibilidade de recursos.
Resolução:a indisponibilidade de recursos é temporária, mas é possível melhorar a resiliência adicionando flexibilidade à configuração:
Diversifique os tipos de máquinas: verifique se o campo
spec.prioritiesna ComputeClass personalizada contém vários tipos ou famílias de máquinas como substitutos:spec: priorities: - machineFamily: c3 # Highest priority - machineFamily: n2d # Fallback option - machineFamily: e2 # Lowest priorityUse clusters regionais: se o cluster for zonal, ele estará vulnerável à indisponibilidade de recursos nessa única zona. O uso de clusters regionais permite que o escalonador automático de clusters tente provisionar nós em outras zonas da região em que a capacidade pode estar disponível.
Use reservas do Compute Engine: para cargas de trabalho críticas que não podem tolerar atrasos, crie reservas do Compute Engine para garantir a capacidade de tipos de máquinas específicos.
Verificar as cotas do projeto
Confirme se o projeto tem cota suficiente para os recursos, como CPUs, GPUs e endereços IP exigidos pelos novos nós.
Verifique os registros do escalonador automático para encontrar erros de cota. Use o Cloud Logging para pesquisar mensagens de erro relacionadas a cotas nos eventos de visibilidade do escalonador automático:
resource.type="k8s_cluster" resource.labels.location="LOCATION" resource.labels.cluster_name="CLUSTER_NAME" log_id("container.googleapis.com/cluster-autoscaler-visibility") jsonPayload.noScaleUpReason.messageId="no.scale.up.nap.quota.exceeded"Como alternativa, use a seguinte consulta do Cloud Logging para verificar os registros em busca de erros relacionados a cotas do MIG:
resource.type="gce_instance" protoPayload.methodName:"compute.instances.insert" protoPayload.status.message:"QUOTA_EXCEEDED" severity=ERRORAnalise as cotas no console do Cloud de Confiance :
- No console do Cloud de Confiance , acesse IAM e administrador > Cotas.
- Filtre pelo serviço API Compute Engine.
- Verifique o uso de métricas relevantes, como CPUs, GPUs (todos os tipos) e endereços IP em uso na região em que o cluster do GKE está localizado. Verifique se o uso atual não está no limite.
Avaliar o resultado
- Cota abaixo dos limites:se o uso da cota estiver abaixo dos limites e não houver erros
QUOTA_EXCEEDEDnos registros, os limites de cota não vão bloquear o escalonamento vertical. - Cota excedida:
- Interpretação:o provisionamento de nós falha devido à cota insuficiente para recursos como CPUs, GPUs, endereços IP ou MIGs.
- Resolução:se o projeto atingiu um limite de cota, solicite um aumento de cota.
Configurações avançadas
Configurações como GPUs, VMs spot e reservas do Compute Engine têm requisitos específicos e possíveis pontos de falha que precisam ser verificados.
Verificar a configuração da GPU
Para ComputeClasses personalizadas que provisionam nós de GPU, valide a configuração da GPU na ComputeClass personalizada e verifique se o pod tem a tolerância nvidia.com/gpu obrigatória.
Verifique o YAML da ComputeClass personalizada para um bloco
gpuem uma regra de prioridade:kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yamlO bloco
gpuprecisa especificar um campotypee um campocount. Por exemplo:priorities: - machineType: a2-highgpu-1g gpu: type: nvidia-tesla-a100 count: 1Inspecione o pod para verificar a tolerância da GPU. Qualquer pod que precise ser programado em um nó de GPU precisa ter a tolerância
nvidia.com/gpu, mesmo que o pod não solicite uma GPU.kubectl get pod POD_NAME -n NAMESPACE -o jsonpath='{.spec.tolerations}'Verifique a tolerância no campo
spec.tolerations.
Avaliar o resultado
GPU configurada corretamente:se a ComputeClass definir a GPU
typeecount, e os pods incluírem a tolerâncianvidia.com/gpu, a configuração da GPU estará correta. Veja a tolerância necessária:tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"GPU configurada incorretamente:
- Interpretação:o pod pode não ter a tolerância
nvidia.com/gpunecessária, a ComputeClass pode estar em estado ruim devido a incompatibilidades de campo de GPU ou a versão do GKE pode não processar a configuração de GPU corretamente. - Resolução:execute uma das seguintes ações:
- Modifique o arquivo YAML da carga de trabalho para incluir a tolerância obrigatória de GPU e reaplique o arquivo YAML.
- Faça upgrade do cluster do GKE. Se a ComputeClass personalizada não estiver íntegra e o problema estiver relacionado aos campos de GPU, verifique se há problemas conhecidos e faça upgrade para uma versão corrigida do GKE, por exemplo, 1.31.8-gke.1045000 ou mais recente.
- Interpretação:o pod pode não ter a tolerância
Verificar a configuração das VMs spot
Se você usar VMs spot, verifique se a configuração spot: true está nas regras de prioridade corretas no manifesto da ComputeClass. Além disso, entenda a lógica de preços do escalonador automático de cluster.
Inspecione o manifesto ComputeClass:
kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yaml
Na saída, procure spot: true no campo spec.priorities. Por exemplo:
priorities:
- machineFamily: n2d
spot: true
O escalonador automático de clusters pode usar dados de preços de us-central1 como base ao comparar o custo de diferentes tipos de VMs spot, o que pode levar a escolhas aparentemente não ideais em outras regiões. Esse é um comportamento conhecido.
Avaliar o resultado
- VMs spot configuradas corretamente:se o campo
spot: truefor especificado e o escalonador automático de cluster provisionar VMs spot, a configuração vai funcionar conforme o esperado. Falha ao programar VMs spot:
- Interpretação:os pods que exigem VMs spot podem não ser programados nelas devido à indisponibilidade de recursos na zona de destino ou porque o escalonador automático de clusters pode estar escolhendo um tipo de VM diferente com base no modelo de preços
us-central1. Resolução:
- Se você suspeitar que um recurso está indisponível, consulte Verificar a indisponibilidade de recursos.
Para controlar a seleção de VMs spot, liste explicitamente as entradas
machineTypeno campopriorities, da mais barata para a mais cara na sua região. Essa abordagem oferece controle direto sobre a ordem de substituição. Exemplo:spec: priorities: - machineType: t2d-standard-48 # Cheapest in this region spot: true - machineType: n2d-standard-48 # Fallback Spot option spot: true - machineType: n2d-standard-48 # On-demand fallback spot: false
- Interpretação:os pods que exigem VMs spot podem não ser programados nelas devido à indisponibilidade de recursos na zona de destino ou porque o escalonador automático de clusters pode estar escolhendo um tipo de VM diferente com base no modelo de preços
Saúde geral do escalonador automático de clusters
Esta seção ajuda a verificar problemas que podem não estar diretamente relacionados à configuração personalizada do ComputeClass, mas que podem estar afetando a operação.
Verificar operações simultâneas
Verifique se não há outras operações de cluster ou pool de nós em andamento simultaneamente. O GKE tem limites para operações simultâneas, o que pode bloquear o escalonamento automático.
Liste as operações em andamento que não estão no estado DONE:
gcloud container operations list \
--location=LOCATION \
--filter='targetLink~"/clusters/CLUSTER_NAME" AND status!=DONE'
Se o comando retornar alguma operação, uma ação como um upgrade de cluster, a criação de um pool de nós ou outra modificação pode estar em andamento. Os eventos de escalonamento automático podem ser bloqueados até que essa operação seja concluída.
Avaliar o resultado
- Nenhuma operação simultânea:se o comando
listretornar uma lista vazia, o escalonador automático de cluster não será bloqueado por nenhuma operação. Operações simultâneas encontradas:
- Interpretação:se o comando listar operações com status
RUNNINGouPENDING, uma operação simultânea, como um upgrade de cluster ou uma modificação de pool de nós, poderá estar em andamento e bloqueando o escalonamento automático. Resolução:aguarde a conclusão da operação em andamento. É possível monitorar o status usando um ID de operação:
gcloud container operations wait OPERATION_ID --location LOCATIONSubstitua
OPERATION_IDpelo ID da saída do comandolist. Depois que a operação de bloqueio for concluída, o escalonador automático de cluster vai retomar a função normal.
- Interpretação:se o comando listar operações com status
Analisar migração ativa
Se você observar que as cargas de trabalho permanecem em nós de prioridade mais baixa quando nós de prioridade mais alta estão disponíveis, verifique se a migração ativa está ativada. Se o campo activeMigration.optimizeRulePriority estiver definido como false ou omitido na ComputeClass, o GKE não moverá automaticamente as cargas de trabalho para nós de maior prioridade quando eles ficarem disponíveis.
Para verificar as tolerâncias do pod, revise o campo
spec.tolerations. Se o pod tiver tolerâncias que correspondam a taints em vários pools de nós de prioridades diferentes, o programador poderá colocá-lo em um nó de prioridade mais baixa se ele estiver disponível primeiro.kubectl get pod POD_NAME -n NAMESPACE -o jsonpath='{.spec.tolerations[*]}{"\n"}'Para verificar se a migração ativa está ativada, inspecione o manifesto ComputeClass para o campo
spec.activeMigration.optimizeRulePriority.kubectl get computeclass CUSTOM_COMPUTECLASS_NAME -o yaml
Avaliar o resultado
- Migração ativa ativada:se o campo
activeMigration.optimizeRulePriorityfortrue, o GKE tentará mover as cargas de trabalho para nós de maior prioridade quando eles estiverem disponíveis. Migração ativa desativada ou ineficaz:
- Interpretação:se o campo
activeMigration.optimizeRulePriorityforfalseou for omitido, ou se as tolerâncias do pod forem muito amplas, as cargas de trabalho vão permanecer em nós de prioridade mais baixa quando nós de prioridade mais alta estiverem disponíveis. Essa abordagem permite que as cargas de trabalho sejam programadas em nós de prioridade mais baixa que ficam disponíveis primeiro. Resolução:se você quiser que as cargas de trabalho sejam movidas para nós de prioridade mais alta, execute uma das seguintes ações:
- Use restrições de programação mais específicas, como
nodeAffinity, para preferir pools de nós de maior prioridade. Edite o manifesto do ComputeClass para definir
activeMigration.optimizeRulePriority: truee aplique o arquivo YAML:spec: activeMigration: optimizeRulePriority: true
- Use restrições de programação mais específicas, como
- Interpretação:se o campo
Receber suporte
Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte para mais ajuda, incluindo conselhos sobre os seguintes tópicos:
- Abrir um caso de suporte entrando em contato com o Cloud Customer Care.
- Receber suporte da comunidade
fazendo perguntas no StackOverflow
e usando a tag
google-kubernetes-enginepara pesquisar problemas semelhantes. Você também pode participar do canal do Slack#kubernetes-enginepara receber mais suporte da comunidade. - Abrir problemas ou solicitações de recursos usando o Issue Tracker público.
A seguir
- Leia as práticas recomendadas para ComputeClasses
- Aplicar ComputeClasses aos pods por padrão
- Configurar a separação de cargas de trabalho no GKE
- Resolver problemas de escalonamento horizontal do escalonamento automático de clusters