Nesta página, mostramos como resolver problemas com clusters do Autopilot do Google Kubernetes Engine (GKE).
Problemas com clusters
Não é possível criar um cluster: nenhum nó registrado
O problema a seguir ocorre quando você tenta criar um cluster do Autopilot com uma conta de serviço do IAM que está desativada ou não tem as permissões necessárias. A criação do cluster falha com a seguinte mensagem de erro:
All cluster resources were brought up, but: only 0 nodes out of 2 have registered.
Para resolver o problema, faça o seguinte:
Verifique se a conta de serviço padrão do Compute Engine ou a conta de serviço personalizada do IAM que você quer usar está desativada:
gcloud iam service-accounts describe SERVICE_ACCOUNT
Substitua
SERVICE_ACCOUNT
pelo endereço de e-mail da conta de serviço, comomy-iam-account@my-first-project.iam.gserviceaccount.com
.Se a conta de serviço for desativada, a saída vai ser semelhante a esta:
disabled: true displayName: my-service-account email: my-service-account@my-project.iam.gserviceaccount.com ...
Ative a conta de serviço se ela estiver desativada:
gcloud iam service-accounts enable SERVICE_ACCOUNT
Se a conta de serviço estiver ativada e o erro persistir, conceda a ela as permissões mínimas necessárias para o GKE:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:SERVICE_ACCOUNT" \
--role roles/container.nodeServiceAccount
Namespace travado no estado de encerramento quando o cluster tem 0 nós
O problema a seguir ocorre quando você exclui um namespace em um cluster depois que ele
é reduzido a zero nós. O componente metrics-server
não pode aceitar a solicitação de exclusão de namespace porque o componente tem zero réplicas.
Para diagnosticar esse problema, execute o seguinte comando:
kubectl describe ns/NAMESPACE_NAME
Substitua NAMESPACE_NAME
pelo nome do namespace.
A saída é esta:
Discovery failed for some groups, 1 failing: unable to retrieve the complete
list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to
handle the request
Para resolver esse problema, escalone qualquer carga de trabalho para que o GKE crie um novo nó. Quando o nó estiver pronto, a solicitação de exclusão de namespace será concluída automaticamente. Depois que o GKE excluir o namespace, reduza a carga de trabalho novamente.
Problemas de escalonamento
Falha ao escalonar verticalmente o nó: o pod corre o risco de não ser programado
O problema a seguir ocorre quando a geração de registros da porta serial está desativada no seu projeto do Google Cloud. Os clusters do Autopilot do GKE exigem a geração de registros da porta serial para depurar problemas de nós com eficiência. Se a geração de registros da porta serial estiver desativada, o Autopilot não poderá provisionar nós para executar as cargas de trabalho.
A mensagem de erro no log de eventos do Kubernetes é semelhante a esta:
LAST SEEN TYPE REASON OBJECT MESSAGE
12s Warning FailedScaleUp pod/pod-test-5b97f7c978-h9lvl Node scale up in zones associated with this pod failed: Internal error. Pod is at risk of not being scheduled
A geração de registros da porta serial pode ser desativada no nível da organização por uma política da organização que aplica a restrição compute.disableSerialPortLogging
. A geração de registros da porta serial também pode ser desativada no nível da instância do projeto ou da máquina virtual (VM).
Para resolver esse problema, faça o seguinte:
- Peça ao administrador de políticas da organização do Google Cloud para remover a restrição
compute.disableSerialPortLogging
do projeto com o cluster do Autopilot. - Se você não tiver uma política da organização que aplique essa restrição, tente ativar a geração de registros da porta serial nos metadados do seu projeto.
Essa ação requer a permissão
compute.projects.setCommonInstanceMetadata
do IAM.
Falha no escalonamento vertical dos nós: recursos zonais do pod excedidos
O problema a seguir ocorre quando o Autopilot não provisiona novos nós para um pod em uma zona específica porque um novo nó violaria os limites de recursos.
A mensagem de erro nos registros é semelhante a esta:
"napFailureReasons": [
{
"messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
...
Esse erro refere-se a um evento noScaleUp
, em que o provisionamento automático de nós não provisionou nenhum grupo de nós para o pod na zona.
Se você encontrar esse erro, confirme o seguinte:
- Os pods têm memória e CPU suficientes.
- O intervalo CIDR do endereço IP do pod é grande o suficiente para acomodar o tamanho máximo previsto do cluster.
Problemas com a carga de trabalho
Pods travados no estado pendente
Um pod pode ficar travado no status Pending
se você selecionar um nó específico para que ele use, mas a soma das solicitações de recursos no pod e nos DaemonSets que precisam ser executados no nó excede o capacidade máxima alocável do nó. Isso pode fazer com que o pod tenha um status Pending
e permaneça não programado.
Para evitar esse problema, avalie os tamanhos das cargas de trabalho implantadas para garantir que estejam dentro das solicitações máximas de recursos do Autopilot compatíveis.
Tente também programar os DaemonSets antes de programar os pods de carga de trabalho regulares.
Desempenho de carga de trabalho consistentemente não confiável em um nó específico
No GKE versão 1.24 e posterior, se as cargas de trabalho em um nó específico tiverem consistentemente interrupções, falhas ou comportamentos semelhantes não confiáveis, é possível informar o GKE sobre o nó problemático restringindo ele com o seguinte comando:
kubectl drain NODE_NAME --ignore-daemonsets
Substitua NODE_NAME
pelo nome do nó problemático.
Para encontrar o nome do nó, execute
kubectl get nodes
.
O GKE faz o seguinte:
- Remove as cargas de trabalho atuais do nó e interrompe a programação de cargas de trabalho nele.
- Recria automaticamente todas as cargas de trabalho removidas que são gerenciadas por um controlador, como uma implantação ou um StatefulSet, em outros nós.
- Encerra quaisquer cargas de trabalho que permaneçam no nó e repara ou recria o nó ao longo do tempo.
- Se você usar o Autopilot, o GKE será encerrado e substituirá o nó imediatamente e ignorará qualquer PodDisruptionBudgets configurado.