Resolva problemas com cargas de trabalho implementadas


Esta página mostra como resolver erros com as cargas de trabalho implementadas no Google Kubernetes Engine (GKE).

Para obter aconselhamento mais geral sobre a resolução de problemas das suas aplicações, consulte o artigo Resolução de problemas de aplicações na documentação do Kubernetes.

Todos os erros: verifique o estado do pod

Se existirem problemas com os pods de uma carga de trabalho, o Kubernetes atualiza o estado do pod com uma mensagem de erro. Veja estes erros verificando o estado de um pod através da consola ou da ferramenta de linha de comandos kubectl. Google Cloud

Consola

Siga estes passos:

  1. Na Google Cloud consola, aceda à página Workloads.

    Aceda a Cargas de trabalho

  2. Selecione a carga de trabalho que quer investigar. O separador Vista geral apresenta o estado da carga de trabalho.

  3. Na secção Pods geridos, clique em qualquer mensagem de estado de erro.

kubectl

Para ver todos os pods em execução no seu cluster, execute o seguinte comando:

kubectl get pods

O resultado é semelhante ao seguinte:

NAME       READY  STATUS             RESTARTS  AGE
POD_NAME   0/1    CrashLoopBackOff   23        8d

Os potenciais erros são apresentados na coluna Status.

Para obter informações mais detalhadas sobre um pod específico, execute o seguinte comando:

kubectl describe pod POD_NAME

Substitua POD_NAME pelo nome do pod que quer investigar.

No resultado, o campo Events mostra mais informações sobre os erros.

Se quiser ver mais informações, consulte os registos do contentor:

kubectl logs POD_NAME

Estes registos podem ajudar a identificar se um comando ou um código no contentor causou a falha de sistema do pod.

Depois de identificar o erro, use as secções seguintes para tentar resolver o problema.

Erro: CrashLoopBackOff

O estado CrashLoopBackOff não significa que exista um erro específico. Em vez disso, indica que um contentor está a falhar repetidamente após o reinício.

Para mais informações, consulte o artigo Resolva problemas de eventos CrashLoopBackOff.

Erros: ImagePullBackOff e ErrImagePull

Um estado de ImagePullBackOff ou ErrImagePull indica que não é possível carregar a imagem usada por um contentor a partir do registo de imagens.

Para orientações sobre a resolução de problemas destes estados, consulte o artigo Resolva problemas de obtenção de imagens.

Erro: o pod não é agendável

Um estado de PodUnschedulable indica que não é possível agendar o seu Pod devido a recursos insuficientes ou a algum erro de configuração.

Se tiver configurado métricas do plano de controlo, pode encontrar mais informações acerca destes erros nas métricas do programador e nas métricas do servidor da API.

Use o manual interativo de pods não agendáveis

Pode resolver problemas de erros PodUnschedulable através do manual interativo na consola Google Cloud :

  1. Aceda ao manual interativo de pods não agendáveis:

    Aceda ao guia interativo

  2. Na lista pendente Cluster, selecione o cluster que quer resolver. Se não conseguir encontrar o cluster, introduza o nome do cluster no campo Filtrar.

  3. Na lista pendente Namespace, selecione o espaço de nomes que quer resolver. Se não conseguir encontrar o seu espaço de nomes, introduza-o no campo Filtro.

  4. Para ajudar a identificar a causa, siga cada uma das secções do playbook:

    1. Investigue a CPU e a memória
    2. Investigue o número máximo de pods por nó
    3. Investigue o comportamento do escalador automático
    4. Investigue outros modos de falha
    5. Correlacione eventos de alteração
  5. Opcional: para receber notificações sobre erros futuros, na secção Sugestões de mitigação futuras, selecione Criar um alerta.PodUnschedulable

Erro: recursos insuficientes

Pode encontrar um erro que indica uma 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 existe CPU suficiente disponível para satisfazer os pedidos de um pod.

Se os pedidos de recursos do Pod excederem os de um único nó de qualquer conjunto de nós elegível, o GKE não agenda o Pod e também não aciona o aumento da escala para adicionar um novo nó. Para que o GKE agende o pod, tem de pedir menos recursos para o pod ou criar um novo conjunto de nós com recursos suficientes.

Também pode ativar o aprovisionamento automático de nós para que o GKE possa criar automaticamente conjuntos de nós com nós onde os pods não agendados podem ser executados.

O pedido de CPU predefinido é de 100 m ou 10% de uma CPU (ou um núcleo). Se quiser pedir mais ou menos recursos, especifique o valor na especificação do pod em spec: containers: resources: requests.

Erro: MatchNodeSelector

MatchNodeSelector indica que não existem nós que correspondam ao seletor de etiquetas do pod.

Para verificar isto, consulte as etiquetas especificadas no campo nodeSelector da especificação do pod, em spec: nodeSelector.

Para ver como os nós no cluster estão etiquetados, execute o seguinte comando:

kubectl get nodes --show-labels

Para anexar uma etiqueta a um nó, execute o seguinte comando:

kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE

Substitua o seguinte:

  • NODE_NAME: o nó ao qual quer adicionar uma etiqueta.
  • LABEL_KEY: a chave da etiqueta.
  • LABEL_VALUE: o valor da etiqueta.

Para mais informações, consulte o artigo Atribuir pods a nós na documentação do Kubernetes.

Erro: PodToleratesNodeTaints

PodToleratesNodeTaints indica que não é possível agendar o pod para nenhum nó porque o pod não tem tolerâncias que correspondam a contaminações de nós existentes.

Para verificar se é este o caso, execute o seguinte comando:

kubectl describe nodes NODE_NAME

No resultado, verifique o campo Taints, que apresenta pares chave-valor e efeitos de agendamento.

Se o efeito apresentado for NoSchedule, não é possível agendar nenhum Pod nesse nó, a menos que tenha uma tolerância correspondente.

Uma forma de resolver este problema é remover a mancha. Por exemplo, para remover uma contaminação NoSchedule, execute o seguinte comando:

kubectl taint nodes NODE_NAME key:NoSchedule-

Erro: PodFitsHostPorts

O erro PodFitsHostPorts significa que um nó está a tentar usar uma porta que já está ocupada.

Para resolver o problema, considere seguir as práticas recomendadas do Kubernetes e usar um NodePort em vez de um hostPort.

Se tiver de usar um hostPort, verifique os manifestos dos pods e certifique-se de que todos os pods no mesmo nó têm valores únicos definidos para hostPort.

Erro: não tem disponibilidade mínima

Se um nó tiver recursos adequados, mas continuar a ver a mensagem Does not have minimum availability , verifique o estado do pod. Se o estado for SchedulingDisabled ou Cordoned, o nó não pode agendar novos pods. Pode verificar o estado de um nó através da Google Cloud consola ou da ferramenta de linha de comandos kubectl.

Consola

Siga estes passos:

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Selecione o cluster que quer investigar. O separador Nodes apresenta os nós e o respetivo estado.

Para ativar a programação no nó, siga estes passos:

  1. Na lista, clique no nó que quer investigar.

  2. Na secção Detalhes do nó, clique em Desativar isolamento.

kubectl

Para obter os estados dos seus nós, execute o seguinte comando:

kubectl get nodes

Para ativar o agendamento no nó, execute o seguinte comando:

kubectl uncordon NODE_NAME

Erro: foi atingido o limite máximo de pods por nó

Se o limite de agrupamentos máximos por nó for atingido por todos os nós no cluster, os agrupamentos ficam bloqueados no estado de agendamento impossível. No separador Eventos do podcast, é apresentada uma mensagem com a expressão Too many pods.

Para resolver este erro, conclua os seguintes passos:

  1. Verifique a configuração do Maximum pods per node no separador Nodes (Nós) dos detalhes do cluster do GKE na Google Cloud consola.

  2. Obtenha uma lista de nós:

    kubectl get nodes
    
  3. Para cada nó, verifique o número de pods em execução no nó:

    kubectl get pods -o wide | grep NODE_NAME | wc -l
    
  4. Se o limite for atingido, adicione um novo conjunto de nós ou adicione nós adicionais ao conjunto de nós existente.

Problema: foi atingido o tamanho máximo do conjunto de nós com o escalador automático do cluster ativado

Se o conjunto de nós tiver atingido o respetivo tamanho máximo de acordo com a configuração do escalador automático do cluster, o GKE não aciona o aumento da escala para o pod que, de outra forma, seria agendado com este conjunto de nós. Se quiser que o pod seja agendado com este conjunto de nós, altere a configuração do autoscaler do cluster.

Problema: tamanho máximo do node pool atingido com o redimensionador automático de cluster desativado

Se o conjunto de nós tiver atingido o número máximo de nós e o dimensionamento automático do cluster estiver desativado, o GKE não pode agendar o pod com o conjunto de nós. Aumente o tamanho do seu conjunto de nós ou ative o dimensionamento automático do cluster para que o GKE redimensione o cluster automaticamente.

Erro: Unbound PersistentVolumeClaims

Unbound PersistentVolumeClaims indica que o Pod faz referência a um PersistentVolumeClaim que não está associado. Este erro pode ocorrer se o seu PersistentVolume não tiver sido aprovisionado. Pode verificar se o aprovisionamento falhou ao obter os eventos para o seu PersistentVolumeClaim e examiná-los para detetar falhas.

Para obter eventos, execute o seguinte comando:

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

Substitua o seguinte:

  • STATEFULSET_NAME: o nome do objeto StatefulSet.
  • PVC_NAME: o nome do objeto PersistentVolumeClaim.

Isto também pode acontecer se tiver ocorrido um erro de configuração durante o pré-aprovisionamento manual de um PersistentVolume e a respetiva associação a um PersistentVolumeClaim.

Para resolver este erro, tente pré-aprovisionar o volume novamente.

Erro: quota insuficiente

Verifique se o seu projeto tem quota suficiente do Compute Engine para o GKE aumentar a escala do cluster. Se o GKE tentar adicionar um nó ao seu cluster para agendar o pod e o aumento da escala exceder a quota disponível do seu projeto, recebe a mensagem de erro scale.up.error.quota.exceeded.

Para saber mais, consulte o artigo Erros do ScaleUp.

Problema: APIs descontinuadas

Certifique-se de que não está a usar APIs descontinuadas que são removidas com a versão secundária do cluster. Para saber mais, consulte o artigo Descontinuações de funcionalidades e APIs.

Erro: não tinha portas livres para as portas do agrupamento pedidas

Se vir um erro semelhante ao seguinte, é provável que tenha vários pods no mesmo nó com o mesmo valor definido no campo hostPort:

0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.

A associação de um agrupamento a um hostPort limita onde o GKE pode agendar o agrupamento, porque cada combinação de hostIP, hostPort e protocol tem de ser única.

Para resolver o problema, considere seguir as práticas recomendadas do Kubernetes e usar um NodePort em vez de um hostPort.

Se tiver de usar um hostPort, verifique os manifestos dos pods e certifique-se de que todos os pods no mesmo nó têm valores únicos definidos para hostPort.

O que se segue?