Nesta página, mostramos como resolver erros com as cargas de trabalho implantadas no Google Kubernetes Engine (GKE).
Para conselhos mais gerais sobre a solução de problemas de aplicativos, consulte Solução de problemas de aplicativos na documentação do Kubernetes.
Todos os erros: verificar o status do pod
Se houver problemas com os pods de uma carga de trabalho, o Kubernetes vai atualizar o status do pod
com uma mensagem de erro. Para conferir esses erros, verifique o status de um pod usando
o console do Google Cloud ou a ferramenta de linha de comando kubectl
.
Console
Siga as etapas abaixo:
No Console do Google Cloud, acesse a página Cargas de trabalho.
Selecione a carga de trabalho que você quer investigar. A guia Visão geral exibe o status da carga de trabalho.
Na seção Gerenciar pods, clique em qualquer mensagem de status de erro.
kubectl
Para ver todos os pods em execução no cluster, execute o seguinte comando:
kubectl get pods
O resultado será assim:
NAME READY STATUS RESTARTS AGE
POD_NAME 0/1 CrashLoopBackOff 23 8d
Os possíveis erros são listados na coluna Status
.
Para mais informações sobre um pod específico, execute o seguinte comando:
kubectl describe pod POD_NAME
Substitua POD_NAME
pelo nome do pod que você
quer investigar.
Na saída, o campo Events
mostra mais informações sobre erros.
Para mais informações, consulte os registros do contêiner:
kubectl logs POD_NAME
Esses registros podem ajudar a identificar se um comando ou código no contêiner causou a falha do pod.
Depois de identificar o erro, use as seções a seguir para tentar resolver o problema.
Erro: CrashLoopBackOff
Um status de CrashLoopBackOff
não significa que há um erro específico, mas
indica que um contêiner está falhando repetidamente após a reinicialização.
Quando um contêiner falha ou sai logo após a inicialização
(CrashLoop
), o Kubernetes tenta reiniciá-lo. A cada reinicialização
falha, o atraso (BackOff
) antes da próxima tentativa aumenta exponencialmente
(10s, 20s, 40s, etc.), até um máximo de cinco minutos.
As seções a seguir ajudam a identificar por que o contêiner pode estar falhando.
Usar o playbook interativo de pods com loop de falhas
Comece a resolver problemas sobre o que está causando um status CrashLoopBackOff
usando o
livro de estratégia interativo no console do Google Cloud:
Acesse o manual interativo de pods com Crashlooping:
Na lista suspensa Cluster, selecione o cluster que você quer resolver. Se você não encontrar o cluster, insira o nome dele no campo
Filtro.Na lista suspensa Namespace, selecione o namespace que você quer resolver. Se você não encontrar o namespace, insira-o no campo Filtro
.Siga cada uma das seções para identificar a causa:
- Identificar erros do aplicativo
- Investigar problemas de falta de memória
- Investigue as interrupções de nós
- Investigar falhas de sondagem de atividade
- Correlacionar eventos de mudança
Opcional: para receber notificações sobre futuros erros do
CrashLoopBackOff
, na seção Dicas de mitigação futura, selecione Criar um alerta.
Inspecionar registros
Um contêiner pode falhar por vários motivos. Verificar os registros de um pod ajuda na solução de problemas da causa raiz.
É possível verificar os registros com o console do Google Cloud ou a ferramenta de linha de comando kubectl
.
Console
Siga as etapas abaixo:
Acesse a página Cargas de trabalho no console do Google Cloud.
Selecione a carga de trabalho que você quer investigar. A guia Visão geral exibe o status da carga de trabalho.
Na seção Gerenciar Pods, clique no Pod problemático.
No menu do pod, clique na guia Registros.
kubectl
Confira todos os pods em execução no cluster:
kubectl get pods
Na saída do comando anterior, procure um pod com o erro
CrashLoopBackOff
na colunaStatus
.Acesse os registros do pod:
kubectl logs POD_NAME
Substitua
POD_NAME
pelo nome do pod problemático.Também é possível transferir a sinalização
-p
para conseguir os registros da instância anterior do contêiner do pod, caso existam.
Verificar o código de saída do contêiner com falha
Para entender melhor por que o contêiner falhou, encontre o código de saída:
Descreva o pod:
kubectl describe pod POD_NAME
Substitua
POD_NAME
pelo nome do pod problemático.Revise o valor no campo
containers: CONTAINER_NAME: last state: exit code
:- Se o código de saída for 1, o contêiner falhou porque o aplicativo falhou.
- Se o código de saída for 0, verifique por quanto tempo seu app estava sendo executado. Os contêineres
saem quando o processo principal do aplicativo é encerrado. Se seu aplicativo
concluir a execução rápido demais, o contêiner pode continuar reiniciando. Se
você receber esse erro, uma solução é definir o campo
restartPolicy
comoOnFailure
. Depois de fazer essa mudança, o app só será reiniciado quando o código de saída não for 0.
Conectar-se a um contêiner em execução
Para executar comandos bash no contêiner e testar a rede ou verificar se você tem acesso a arquivos ou bancos de dados usados pelo aplicativo, abra um shell para o pod:
kubectl exec -it POD_NAME -- /bin/bash
Se houver mais de um contêiner no pod, adicione
-c CONTAINER_NAME
.
Erros: ImagePullBackOff e ErrImagePull
Um status de ImagePullBackOff
ou ErrImagePull
indica que a imagem usada
por um contêiner não pode ser carregada do registro de imagem.
Verifique esse problema usando o console do Google Cloud ou a ferramenta de linha de comando kubectl
.
Console
Siga as etapas abaixo:
No Console do Google Cloud, acesse a página Cargas de trabalho.
Selecione a carga de trabalho que você quer investigar. A guia Visão geral exibe o status da carga de trabalho.
Na seção Gerenciar Pods, clique no Pod problemático.
No menu do Pod, clique na guia Eventos.
kubectl
Para mais informações sobre a imagem do contêiner do pod, execute o seguinte comando:
kubectl describe pod POD_NAME
Problema: a imagem não foi encontrada
Se a imagem não for encontrada, siga estas etapas:
- Verifique se o nome da imagem está correto.
- Verifique se a tag da imagem está correta. (Tente
:latest
ou nenhuma tag para extrair a imagem mais recente). - Se a imagem tiver um caminho de registro completo, verifique se ela existe no registro do Docker que você está usando. Se você fornecer apenas o nome da imagem, verifique o registro do Docker Hub.
Em clusters do GKE Standard, tente extrair a imagem do Docker manualmente:
Use o SSH para se conectar ao nó:
Por exemplo, para usar o SSH para se conectar a uma VM, execute o seguinte comando:
gcloud compute ssh VM_NAME --zone=ZONE_NAME
Substitua:
VM_NAME
: o nome da VM.ZONE_NAME
: uma zona do Compute Engine.
Gere um arquivo de configuração em
/home/[USER]/.docker/config.json
:docker-credential-gcr configure-docker
Verifique se o arquivo de configuração em
/home/[USER]/.docker/config.json
inclui o registro da imagem no campocredHelpers
. Por exemplo, o arquivo a seguir inclui informações de autenticação para imagens hospedadas emasia.gcr.io
,eu.gcr.io
,gcr.io
,marketplace.gcr.io
eus.gcr.io
:{ "auths": {}, "credHelpers": { "asia.gcr.io": "gcr", "eu.gcr.io": "gcr", "gcr.io": "gcr", "marketplace.gcr.io": "gcr", "us.gcr.io": "gcr" } }
Tente extrair a imagem:
docker pull IMAGE_NAME
Se a extração da imagem funcionar manualmente, provavelmente será necessário especificar
ImagePullSecrets
em um pod. Os pods só podem referenciar segredos de extração de imagem em seu próprio namespace, portanto, esse processo precisa ser feito uma vez por namespace.
Erro: permissão recusada
Se você encontrar um erro de "permissão negada" ou "sem acesso para extrair", verifique se você está conectado e/ou tem acesso à imagem. Tente um dos métodos a seguir, dependendo do registro em que você hospeda as imagens.
Artifact Registry
Se a imagem estiver no Artifact Registry, a conta de serviço do pool de nós precisará de acesso de leitura ao repositório que contém a imagem.
Conceda o papel artifactregistry.reader
à conta de serviço.
gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
--location=REPOSITORY_LOCATION \
--member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
--role="roles/artifactregistry.reader"
Substitua:
REPOSITORY_NAME
: o nome do repositório do Artifact RegistryREPOSITORY_LOCATION
: a região do repositório do Artifact RegistrySERVICE_ACCOUNT_EMAIL
: o endereço de e-mail da conta de serviço do IAM associada ao pool de nós.
Container Registry
Se a imagem estiver no Container Registry, a conta de serviço do pool de nós precisará de acesso de leitura ao bucket do Cloud Storage que contém a imagem.
Conceda o papel roles/storage.objectViewer
à conta de serviço para que ela possa ler o bucket:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
--role=roles/storage.objectViewer
Substitua:
SERVICE_ACCOUNT_EMAIL
: o e-mail da conta de serviço associada ao pool de nós. Liste todas as contas de serviço no seu projeto usandogcloud iam service-accounts list
.BUCKET_NAME
: o nome do bucket do Cloud Storage que contém as imagens. É possível listar todos os buckets no seu projeto usandogcloud storage ls
.
Se o administrador de registro configurar
repositórios gcr.io no Artifact Registry
para armazenar imagens para o domínio gcr.io
em vez do Container Registry, será preciso
conceder acesso de leitura a Artifact Registry, em vez do Container Registry.
Registro particular
Se a imagem estiver em um registro particular, talvez você precise de chaves para acessar as imagens. Para mais informações, consulte Como usar registros privados na documentação do Kubernetes.
Erro 401 Não autorizado: não é possível extrair imagens do repositório particular do Container Registry
Um erro semelhante ao seguinte pode ocorrer ao extrair uma imagem de um repositório particular do Container Registry:
gcr.io/PROJECT_ID/IMAGE:TAG: rpc error: code = Unknown desc = failed to pull and
unpack image gcr.io/PROJECT_ID/IMAGE:TAG: failed to resolve reference
gcr.io/PROJECT_ID/IMAGE]:TAG: unexpected status code [manifests 1.0]: 401 Unauthorized
Warning Failed 3m39s (x4 over 5m12s) kubelet Error: ErrImagePull
Warning Failed 3m9s (x6 over 5m12s) kubelet Error: ImagePullBackOff
Normal BackOff 2s (x18 over 5m12s) kubelet Back-off pulling image
Para resolver o erro, siga estas etapas:
Identifique o nó que executa o pod:
kubectl describe pod POD_NAME | grep "Node:"
Verifique se o nó identificado na etapa anterior tem o escopo de armazenamento:
gcloud compute instances describe NODE_NAME \ --zone=COMPUTE_ZONE --format="flattened(serviceAccounts[].scopes)"
O escopo de acesso do nó precisa conter pelo menos um dos escopos a seguir:
serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/devstorage.read_only serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/cloud-platform
Se o nó não tiver um desses escopos, recrie o pool de nós.
Recrie o pool de nós ao qual o nó pertence com escopo suficiente. Não é possível modificar os nós atuais. Você precisa recriar o nó com o escopo correto.
Recomendado: crie um novo pool de nós com o escopo
gke-default
:gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --scopes="gke-default"
Crie um novo pool de nós apenas com o escopo de armazenamento:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --scopes="https://www.googleapis.com/auth/devstorage.read_only"
Erro: o pod não pode ser programado
Um status de PodUnschedulable
indica que o pod não pode ser programado
devido a recursos insuficientes ou a algum erro de configuração.
Se você tiver configurado métricas do plano de controle, encontre mais informações sobre esses erros em métricas do programador e métricas do servidor da API.
Usar o manual interativo de pods não programáveis
É possível resolver erros PodUnschedulable
usando o playbook interativo no console do Google Cloud:
Acesse o playbook interativo de pods não programáveis:
Na lista suspensa Cluster, selecione o cluster que você quer resolver. Se você não encontrar o cluster, insira o nome dele no campo
Filtro.Na lista suspensa Namespace, selecione o namespace que você quer resolver. Se você não encontrar o namespace, insira-o no campo Filtro
.Para ajudar a identificar a causa, siga cada uma das seções do manual:
- Investigar CPU e memória
- Investigar o máximo de pods por nó
- Investigar comportamento do escalador automático
- Investigar outros modos de falha
- Correlacionar eventos de mudança
Opcional: para receber notificações sobre futuros erros do
PodUnschedulable
, na seção Dicas de mitigação futura, selecione Criar um alerta.
Erro: recursos insuficientes
Talvez você encontre um erro indicando falta de CPU, memória ou outro recurso. Por exemplo: No nodes are available that match all of the predicates:
Insufficient cpu (2)
, que indica que, em dois nós, não há CPU suficiente
disponível para atender às solicitações de um pod.
Se as solicitações de recursos do pod excederem o de um único nó de qualquer pool de nós qualificado, o GKE não vai programar o pod e também não acionará o escalonamento vertical para adicionar um novo nó. Para que o GKE programe o pod, é necessário solicitar menos recursos para o pod ou criar um novo pool de nós com recursos suficientes.
Também é possível ativar o provisionamento automático de nós para que o GKE possa criar automaticamente pools de nós com nós em que os pods não programados podem ser executados.
A solicitação de CPU padrão é 100m ou 10% de uma CPU (ou
um núcleo).
Se quiser solicitar mais ou menos recursos, especifique o valor na especificação do pod em spec: containers: resources: requests
Erro: MatchNodeSelector
MatchNodeSelector
indica que não há nós que correspondam ao seletor de
rótulos do pod.
Para verificar isso, confira os rótulos especificados no campo nodeSelector
da especificação do pod, em spec: nodeSelector
.
Para ver como os nós no cluster são rotulados, execute o seguinte comando:
kubectl get nodes --show-labels
Para anexar um rótulo a um nó, execute o seguinte comando:
kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE
Substitua:
NODE_NAME
: o nó em que você quer adicionar um rótulo.LABEL_KEY
: a chave do rótulo.LABEL_VALUE
: o valor do rótulo.
Para mais informações, consulte Como atribuir pods a nós na documentação do Kubernetes.
Erro: PodToleratesNodeTaints
PodToleratesNodeTaints
indica que o pod não pode ser programado para nenhum nó
porque ele não tem tolerâncias que correspondam aos taints de nó existentes.
Para verificar se esse é o caso, execute o seguinte comando:
kubectl describe nodes NODE_NAME
Na saída, verifique o campo Taints
, que lista pares de valor-chave e efeitos de programação.
Se o efeito listado for NoSchedule
, nenhum pod poderá ser programado nesse nó,
a menos que exista uma tolerância correspondente.
Uma maneira de resolver esse problema é remover o taint. Para remover um taint NoSchedule, execute o seguinte comando:
kubectl taint nodes NODE_NAME key:NoSchedule-
Erro: PodFitsHostPorts
PodFitsHostPorts
indica que uma porta que um nó está tentando usar já está em uso.
Para resolver esse problema, verifique o valor hostPort
da especificação do pod em spec: containers: ports: hostPort
. Pode ser necessário alterar esse valor para outra porta.
Erro: não há disponibilidade mínima
Se um nó tiver recursos adequados, mas ainda exibir a mensagem Does not have minimum availability
, verifique o status do pod. Se o status for SchedulingDisabled
ou Cordoned
,
o nó não poderá programar novos pods. É possível verificar o status de um
nó usando o console do Google Cloud ou a ferramenta de linha de comando kubectl
.
Console
Siga as etapas abaixo:
Acesse a página Google Kubernetes Engine no console do Google Cloud.
Selecione o cluster que você quer investigar. A guia Nós exibe os nós e o status deles.
Para ativar a programação no nó, execute as seguintes etapas:
Na lista, clique no nó que você quer investigar.
Na seção Detalhes do nó, clique em Não programável.
kubectl
Para receber o status dos seus nós, execute o seguinte comando:
kubectl get nodes
Para ativar a programação no nó, execute:
kubectl uncordon NODE_NAME
Erro: o limite máximo de pods por nó foi atingido
Se o limite Máximo de pods por nó
for atingido por todos os nós no cluster, os pods ficarão presos no
estado não programável. Na guia Eventos do pod, é mostrada uma mensagem
incluindo a frase Too many pods
.
Para resolver esse erro, siga estas etapas:
Verifique a configuração de
Maximum pods per node
na guia "Nós" nos detalhes do cluster do GKE no console do Google Cloud.Consulte uma lista de nós:
kubectl get nodes
Para cada nó, verifique o número de pods em execução nele:
kubectl get pods -o wide | grep NODE_NAME | wc -l
Se o limite for atingido, adicione um novo pool de nós ou adicione mais nós ao atual.
Problema: tamanho máximo do pool de nós atingido com o escalonador automático de clusters ativado
Se o pool de nós atingir seutamanho máximo De acordo com a configuração do escalonador automático de cluster, o GKE não aciona o escalonamento vertical do pod que seria programado com esse pool de nós. Se você quiser que o pod seja programado com esse pool de nós, altere a configuração do escalonador automático de clusters.
Problema: tamanho máximo do pool de nós atingido com o escalonador automático de cluster desativado
Se o pool de nós atingir o número máximo de nós e o escalonador automático de cluster estiver desativado, o GKE não poderá programar o pod com o pool de nós. Aumente o tamanho do pool de nós ou ative o escalonador automático de clusters para que o GKE redimensione seu cluster automaticamente.
Erro: PersistentVolumeClaims não vinculados
Unbound PersistentVolumeClaims
indica que o pod se refere a uma
PersistentVolumeClaim não vinculada. Esse erro pode acontecer caso seu
PersistentVolume falhe ao provisionar. É possível verificar se o provisionamento falhou
procurando por erros nos eventos do seu
PersistentVolumeClaim.
Para acessar eventos, execute o seguinte comando:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Substitua:
STATEFULSET_NAME
: o nome do objeto StatefulSet.PVC_NAME
: o nome do objeto PersistentVolumeClaim.
Isso também pode acontecer se houver um erro de configuração durante o pré-provisionamento manual de um PersistentVolume e sua vinculação a um PersistentVolumeClaim.
Para resolver esse erro, tente pré-aprovisionar o volume novamente.
Erro: cota insuficiente
Verifique se o projeto tem cota suficiente do Compute Engine para
o GKE escalonar verticalmente o cluster. Se o GKE tentar adicionar um nó ao cluster para programar o pod e o escalonamento vertical exceder a cota disponível do projeto, você receberá a mensagem de erro scale.up.error.quota.exceeded
.
Para saber mais, consulte Erros de ScaleUp.
Problema: APIs descontinuadas
Verifique se você não está usando APIs descontinuadas que foram removidas com a versão secundária do seu cluster. Para saber mais, consulte Descontinuações do GKE.
A seguir
Se precisar de mais ajuda, entre em contato com o Cloud Customer Care.