Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Troubleshoot pod issues

Última atualização: Jun 30, 2026

Resolva falhas de agendamento de pods, erros de pull de imagem, travamentos na inicialização, OOM kills e problemas de runtime.

Nota

Para solução de problemas via console — visualização de status, eventos e logs do pod, acesso a terminais e execução de diagnósticos — consulte Procedimentos comuns de solução de problemas.

Procedimento rápido de diagnóstico

Para diagnosticar um pod anormal, acesse a página de detalhes em Pods. Clique na aba Events para revisar as descrições de eventos anormais. Em seguida, clique na aba Logs para verificar logs anormais recentes.

Pod no estado Pending

Se um Pod apresentar status Unschedulable em seus Status Details ou se um evento FailedScheduling aparecer em Events, acesse Nodes > Nodes para verificar a integridade dos nós e os níveis de recursos (CPU e memória). Verifique também se as regras de afinidade do pod — nodeSelector, nodeAffinity e tolerâncias — são restritivas demais. Consulte Problemas de agendamento.

Falha no pull de imagem (ImagePullBackOff/ErrImagePull)

Na página de detalhes de Pods, acesse a aba Container e verifique o endereço da Image. Acesse o nó do pod e execute crictl pull <image-address> ou curl -v https://<image-address> para verificar a conectividade de rede com o repositório de imagens. No canto superior direito, clique em Edit YAML e confirme se o Secret especificado no campo spec.imagePullSecrets da workload existe e é válido. Para mais etapas de solução de problemas, consulte Problemas de pull de imagem.

Falha ao iniciar o Pod (CrashLoopBackOff)

A aplicação trava e reinicia repetidamente. Na página de detalhes de Pods, clique na aba Logs e selecione Show the log of the last container exit para visualizar a causa da falha. Para mais etapas de solução de problemas, consulte Solucionar falhas de inicialização de pods.

Pod em Running mas não está pronto

A sonda de prontidão (readiness probe) do pod falhou. Na página Edit da Workloads alvo, verifique se o caminho da requisição de health check (por exemplo, /healthz) e a porta correspondem aos fornecidos pela aplicação. Para mais etapas de solução de problemas, consulte O pod está em Running mas não está pronto (Ready: False).

Desative temporariamente o health check e use curl no terminal do pod ou no nó host para verificar se o endpoint responde corretamente.

Pod com OOMKilled

Na página de detalhes de Pods, clique na aba Logs e selecione Show the log of the last container exit para visualizar os logs de OOM. Verifique se a aplicação apresenta vazamento de memória ou erro de out-of-memory (OOM). Para aplicações Java, otimize o parâmetro -Xmx. Ajuste o limite de recursos de memória da aplicação (resources.limits.memory) conforme necessário. Para mais etapas de solução de problemas, consulte OOMKilled.

Se uma sonda de vivacidade (liveness probe) estiver configurada, o pod permanece no estado OOMKilled apenas brevemente antes de reiniciar automaticamente.

Fluxo de trabalho de diagnóstico

Para diagnosticar um pod anormal, inspecione seus eventos, logs e configuração.

Fluxo de trabalho de solução de problemas

image

Fase 1: Problemas de agendamento

Pod não agendado em um nó

Se um pod permanecer no estado Pending por um período prolongado, ele não foi agendado em nenhum nó.

Mensagem de erro

Descrição

Solução

no nodes available to schedule pods.

O cluster não possui nós disponíveis para agendamento de pods.

  1. Verifique se algum nó no cluster está no estado NotReady. Se um nó estiver NotReady, inspecione-o e repare-o.

  2. Verifique se o pod define um nodeSelector, nodeAffinity ou tolerâncias a taints. Caso nenhuma restrição de agendamento esteja definida, considere adicionar mais nós ao node pool.

  • 0/x nodes are available: x Insufficient cpu.

  • 0/x nodes are available: x Insufficient memory.

Nenhum nó disponível no cluster consegue atender às solicitações de recursos de CPU ou memória do pod.

Um nó torna-se não agendável quando o total de requests alocados atinge a capacidade, mesmo que a utilização real seja baixa.

Na página de detalhes do cluster alvo, acesse Nodes > Nodes e verifique a taxa de alocação de requests de CPU ou memória para o nó alvo. Passe o mouse sobre a taxa de alocação para visualizar os valores específicos de alocação de recursos.

Request allocation

Para visualizar o uso detalhado de recursos do nó, consulte Usar kubectl para visualizar o uso de recursos do nó.

x node(s) didn't match pod's node affinity/selector.

Os nós existentes não correspondem à política de afinidade de nó do pod (nodeAffinity/nodeSelector). Consulte Assigning Pods to Nodes.

  1. Visualize todos os rótulos em um nó.

    Console

    1. Na página de detalhes do cluster alvo, acesse Nodes > Nodes.

    2. Na página Nodes, localize o nó alvo e, na coluna Actions, clique em More > Manage Labels and Taints para visualizar seus rótulos.

    Kubectl

    Substitua <YOUR_NODE_NAME> pelo nome real do seu nó.

    kubectl get node <YOUR_NODE_NAME> --show-labels
  2. Verifique e ajuste a regra de afinidade de nó para a workload (deployment).

    Console

    Ao criar uma nova workload:

    1. Na página Advanced para criar um Deployment em Create, localize Node Affinity na seção Scheduling e clique em Add.

    2. Configure Required (afinidade rígida) ou Optional (afinidade suave) com base nas necessidades do seu negócio. Múltiplos Selector têm uma relação lógica AND, enquanto múltiplas Rule têm uma relação lógica OR.

    Para workloads existentes:

    1. Na página Nodes > Nodes, clique em image > Node Affinity na coluna Actions do Deployment alvo.

    2. O método de configuração é o mesmo descrito acima.

    Exemplo YAML

    NodeAffinity

    As políticas de afinidade incluem afinidade rígida (requiredDuringSchedulingIgnoredDuringExecution), que deve ser atendida, e afinidade suave (preferredDuringSchedulingIgnoredDuringExecution), que expressa uma preferência. O exemplo a seguir usa afinidade rígida.

    apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: app-demo-node-affinity-deploy
          labels:
            app: demo-node-affinity
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: demo-node-affinity
          template:
            metadata:
              labels:
                app: demo-node-affinity
            spec:
              containers:
              - name: nginx
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              affinity:
                nodeAffinity:
                  # Hard affinity: The rule must be met.
                  requiredDuringSchedulingIgnoredDuringExecution:
                    nodeSelectorTerms:
                    - matchExpressions:
                      - key: disktype
                        operator: In
                        values:
                        - ssd
                        - nvme  # Logic: The node's 'disktype' label must be either 'ssd' or 'nvme'.

    NodeSelector

    Isso fornece uma correspondência exata simples. O pod é agendado apenas se os rótulos do nó atenderem às condições.

    apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: app-demo-node-selector-deploy
          labels:
            app: demo-node-selector
        spec:
          replicas: 2  
          selector:
            matchLabels:
              app: demo-node-selector  
          template:
            metadata:
              labels:
                app: demo-node-selector
            spec:
              containers:
              - name: nginx
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              # The pod is scheduled only if the node has the label disktype=ssd.
              nodeSelector:
                disktype: ssd
  • x node(s) didn't match pod affinity rules.

  • x node(s) didn't match pod anti-affinity rules.

  • Incompatibilidade de regra de afinidade. O pod possui uma regra de pod affinity (por exemplo, exigindo um rótulo específico), mas nenhum nó hospeda um pod com um rótulo correspondente, impedindo o agendamento.

  • Conflito de anti-afinidade. O pod possui uma regra de pod anti-affinity (por exemplo, não pode coexistir com outra aplicação), mas todos os nós disponíveis já hospedam um pod conflitante, impedindo o agendamento.

  1. Visualize os rótulos dos pods em um nó.

    Console

    1. Na página de detalhes do cluster alvo, acesse Nodes > Nodes.

    2. Na página Nodes, clique no nome do nó alvo para visualizar sua página de detalhes. Role para baixo até a seção Pods para visualizar os valores de rótulo para diferentes pods na coluna Label.

    Kubectl

    • Visualizar pods e seus rótulos em um nó específico: Substitua <YOUR_NAMESPACE> pelo nome do seu namespace e <YOUR_NODE_NAME> pelo nome real do seu nó.

      kubectl get pods -n <YOUR_NAMESPACE> --field-selector spec.nodeName=<YOUR_NODE_NAME> -o custom-columns=NAME:.metadata.name,LABELS:.metadata.labels
    • Consultar pods por rótulo: Substitua <LABEL> pelo par chave-valor real do rótulo, como app=nginx.

      kubectl get pods -A -l <LABEL> -o wide
  2. Verifique e ajuste a regra de afinidade de pod para a workload (deployment).

    Console

    1. Ao criar uma nova workload, na página Create do Deployment, em Advanced, localize Pod Affinity/Pod Anti-affinity na seção Scheduling e clique em Add.

    2. Configure Required (afinidade rígida) ou Optional (afinidade suave) com base nas necessidades do seu negócio. Múltiplos Selector têm uma relação lógica AND, enquanto múltiplas opções de Add Rule têm uma relação lógica OR.

    Exemplo YAML

    As políticas de afinidade são classificadas em afinidade rígida (requiredDuringSchedulingIgnoredDuringExecution) e afinidade suave (preferredDuringSchedulingIgnoredDuringExecution). Regras de afinidade rígida devem ser atendidas, enquanto regras de afinidade suave são preferenciais. O exemplo a seguir mostra uma configuração para pod affinity obrigatória.

    Para configurar pod anti-affinity, basta substituir podAffinity por podAntiAffinity.

    apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: app-demo-podaffinity-deploy
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: demo-podaffinity
          template:
            metadata:
              labels:
                app: demo-podaffinity
            spec:
              containers:
              - name: nginx
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              affinity:
                podAffinity:
                  # Hard affinity: Pod must be co-located with a pod that has the 'app: nginx' label.
                  requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                      - key: app
                        operator: In
                        values:
                        - nginx
                    # Topology domain scope: host-level isolation.
                    topologyKey: kubernetes.io/hostname

0/x nodes are available: x node(s) had volume node affinity conflict.

O agendamento falha devido a um conflito de afinidade de nó do volume. Isso geralmente ocorre porque um disco de nuvem não pode ser montado em zonas diferentes.

  • Para um PV provisionado estaticamente, configure a afinidade de nó do pod para garantir que ele seja agendado em um nó na mesma zona que o PV.

  • Para um PV provisionado dinamicamente, defina o volumeBindingMode da StorageClass como WaitForFirstConsumer. Isso garante que o PV seja criado somente após o pod ter sido agendado em um nó, assegurando que o disco de nuvem seja criado na mesma zona que o nó do pod.

InvalidInstanceType.NotSupportDiskCategory

A instância ECS não suporta o tipo de disco de nuvem especificado.

Consulte Famílias de instâncias para confirmar os tipos de disco de nuvem suportados pela sua instância ECS. Ao montar, atualize o tipo de disco de nuvem para um que seja suportado pela instância ECS.

0/x nodes are available: x node(s) had taints that the pod didn't tolerate.

O pod não pode ser agendado em um nó porque falta uma tolerância para um dos taints do nó.

  • Se o taint foi adicionado manualmente, remova-o ou configure uma tolerância para o pod. Consulte Taints and Tolerations e Gerenciar rótulos e taints de nós.

  • Se o taint foi adicionado pelo sistema, resolva o problema subjacente abaixo e aguarde o reagendamento.

    Visualizar taints adicionados pelo sistema

    • node.kubernetes.io/not-ready: O nó está no estado NotReady.

    • node.kubernetes.io/unreachable: O nó está inacessível para o controlador de nós. Isso equivale ao status Ready do nó sendo Unknown.

    • node.kubernetes.io/memory-pressure: O nó está sob pressão de memória.

    • node.kubernetes.io/disk-pressure: O nó está sob pressão de disco.

    • node.kubernetes.io/pid-pressure: O nó está sob pressão de PID.

    • node.kubernetes.io/network-unavailable: A rede do nó está indisponível.

    • node.kubernetes.io/unschedulable: O nó está marcado como não agendável.

0/x nodes are available: x Insufficient ephemeral-storage.

O nó tem armazenamento efêmero insuficiente.

  1. Verifique a solicitação de armazenamento efêmero do Pod, que é o valor de spec.containers.resources.requests.ephemeral-storage no YAML do Pod. Se o valor for muito alto e exceder a capacidade real disponível do nó, o Pod falhará ao ser agendado.

  2. Verifique a capacidade total de armazenamento efêmero em cada nó com kubectl describe node | grep -A10 Capacity. Se for insuficiente, expanda o disco do nó ou adicione mais nós.

0/x nodes are available: pod has unbound immediate persistent volume claims.

O pod falhou ao vincular a uma persistent volume claim (PVC).

Verifique se a PVC ou PV especificado pelo pod foi criado. Execute kubectl describe pvc <pvc-name> ou kubectl describe pv <pv-name> para visualizar eventos de PVC e PV para diagnóstico adicional. Consulte FAQ de Armazenamento - CSI.

Pod agendado mas permanece Pending

Se um pod foi agendado, mas permanece Pending, siga estas etapas.

  1. Se um pod usar hostPort, apenas um pod com essa hostPort pode ser executado por nó, então hostPort limita a contagem de Replicas ao número de nós. Se a porta já estiver em uso, o agendamento falha.

    hostPort adiciona complexidade ao agendamento. Use um Service para expor pods em vez disso.

  2. Se o Pod não estiver configurado com hostPort, siga as etapas abaixo para solucionar o problema.

    1. Visualize os eventos do pod com kubectl describe pod <pod-name>. Causas comuns incluem falhas no pull de imagem, recursos insuficientes, restrições de política de segurança e erros de configuração.

    2. Se nenhum evento útil for encontrado, verifique os logs do kubelet no nó com grep -i <pod name> /var/log/messages* | less.

Fase 2: Problemas de pull de imagem

ImagePullBackOff ou ErrImagePull

Um status de pod ImagePullBackOff ou ErrImagePull indica que o pull da imagem falhou. Examine os eventos do pod para identificar a causa.

Mensagem de erro

Descrição

Solução sugerida

Failed to pull image "xxx": rpc error: code = Unknown desc = Error response from daemon: Get xxx: denied:

O acesso ao repositório de imagens é negado porque um imagePullSecret não foi especificado quando o pod foi criado.

Verifique se o Secret especificado no campo spec.imagePullSecrets do arquivo YAML da workload existe.

Ao usar o ACR, utilize um credential helper para fazer pull de imagens sem senha. Consulte Fazer pull de imagens da mesma conta.

Failed to pull image "xxxx:xxx": rpc error: code = Unknown desc = Error response from daemon: Get https://xxxxxx/xxxxx/: dial tcp: lookup xxxxxxx.xxxxx: no such host

O endereço do repositório de imagens não pôde ser resolvido ao fazer pull de uma imagem via HTTPS.

  1. Verifique se o endereço do repositório de imagens em spec.containers.image do arquivo YAML do pod está correto. Se estiver incorreto, atualize-o.

  2. Se o endereço estiver correto, verifique a conectividade de rede do nó onde o pod está sendo executado até o repositório de imagens. Acesse o nó (para mais informações, consulte Escolher um método de conexão remota ECS) e execute o comando curl -kv https://xxxxxx/xxxxx/ para verificar se o endereço está acessível. Se ocorrer um erro, investigue possíveis problemas de rede, como configuração de rede incorreta, regras de firewall ou problemas de resolução DNS.

Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "xxxxxxxxx": Error response from daemon: mkdir xxxxx: no space left on device

O nó tem espaço em disco insuficiente.

Acesse o nó (consulte Escolher um método de conexão remota ECS) e execute df -h para verificar o espaço em disco. Se o disco estiver cheio, redimensione-o. Consulte Etapa 1: Redimensionar um disco de nuvem.

Failed to pull image "xxx": rpc error: code = Unknown desc = error pulling image configuration: xxx x509: certificate signed by unknown authority

O repositório de imagens de terceiros usa um certificado assinado por uma Autoridade Certificadora (CA) desconhecida ou insegura.

  1. O repositório de terceiros deve usar um certificado emitido por uma CA confiável.

  2. Se você estiver usando um repositório de imagens privado, consulte Criar uma aplicação a partir de um repositório de imagens privado.

  3. Se não for possível alterar o certificado, configure o nó para permitir pull e push de imagens de um repositório que usa um certificado inseguro. Recomendamos usar este método apenas em ambientes de teste, pois pode afetar outros pods no nó.

Visualizar etapas detalhadas

Console

Procedimento

As alterações não afetam contêineres em execução. Realize esta operação fora dos horários de pico.

  1. Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Nodes > Node Pools.

  3. Na página Node Pools, localize o node pool desejado e, em sua coluna Actions, escolha image > Containerd Configuration.

  4. Adicione parâmetros, especifique os nós alvo, defina a política de lote e clique em Submit.

    Consulte Exemplos de configuração.
    • Remover um parâmetro de runtime personalizado reverte-o para o valor padrão.

    • As configurações são aplicadas aos nós em lotes. Monitore o progresso na área Event Records, onde você pode pausar, retomar ou cancelar a atualização. Se a atualização de um nó falhar, solucione o problema e clique em Continue para tentar novamente.

      Pausar permite validar alterações nos nós atualizados. Os nós em andamento terminam, mas novas atualizações aguardam até que você retome. Conclua a tarefa prontamente — tarefas pausadas são canceladas automaticamente após sete dias, excluindo todos os registros e logs.

Exemplos de configuração

Mirror para docker.io

Registro privado inseguro

Registro privado HTTP

Em Registry mirrors, defina Image registry como docker.io, Registry mirror como o endereço do mirror (ex.: https://example.com) e override_path como false.

Em Insecure registries, insira o endereço do registro em Image registry (formato: Endereço IP:Porta, ex.: 192.xxx.xxx.xxx:443) e defina skip_verify como true.

Em Registry mirrors, defina Image registry como o endereço do registro privado (ex.: 192.xxx.1), Registry mirror como seu endereço HTTP (ex.: http://192.xxx.1) e override_path como false. Clique em + Add para mais mapeamentos.

CLI

  1. Crie um diretório de certificados para o containerd armazenar arquivos de configuração de certificados para repositórios de imagens específicos.

    mkdir -p /etc/containerd/cert.d/xxxxx
  2. Configure o containerd para confiar em um repositório de imagens inseguro específico.

    cat << EOF > /etc/containerd/cert.d/xxxxx/hosts.toml
           server = "https://harbor.test-cri.com"
           [host."https://harbor.test-cri.com"]
             capabilities = ["pull", "resolve", "push"]
             skip_verify = true
             # ca = "/opt/ssl/ca.crt"  # Or upload a CA certificate
           EOF
  3. Modifique a configuração do daemon Docker para adicionar o repositório inseguro.

    vi /etc/docker/daemon.json

    Adicione o seguinte conteúdo. Substitua your-insecure-registry pelo endereço do seu repositório privado.

       {
             "insecure-registries": ["your-insecure-registry"]
           }
  4. Reinicie o serviço containerd para que as alterações tenham efeito.

    systemctl restart containerd

Failed to pull image "XXX": rpc error: code = Unknown desc = context canceled

A operação foi cancelada, possivelmente porque o arquivo de imagem é muito grande. O Kubernetes tem um tempo limite padrão para pull de imagens. Se o pull não progredir por um período específico, o Kubernetes assume que a operação falhou ou não está respondendo e cancela a tarefa.

  1. Verifique se imagePullPolicy está definido como IfNotPresent no arquivo YAML do pod.

  2. Acesse o nó onde o pod está sendo executado (para mais informações, consulte Escolher um método de conexão remota ECS) e execute docker pull ou crictl pull para verificar se a imagem pode ser baixada.

Failed to pull image "xxxxx": rpc error: code = Unknown desc = Error response from daemon: Get https://xxxxxxx: xxxxx/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Não é possível conectar ao repositório de imagens devido a problemas de rede.

  1. Acesse o nó onde o pod está sendo executado (para mais informações, consulte Escolher um método de conexão remota ECS) e execute o comando curl https://xxxxxx/xxxxx/ para verificar se o endereço está acessível. Se ocorrer um erro, investigue possíveis problemas de rede, como configuração de rede incorreta, regras de firewall ou problemas de resolução DNS.

  2. Verifique a política de rede pública do nó, incluindo configurações para entradas SNAT e Endereços IP Elásticos (EIPs) vinculados.

Failed to pull image "xxxx:xxx": failed to pull and unpack image "xxxx:xxx": failed to resolve reference "xxxx:xxx": failed to do request: Head "xxxx:xxx": dial tcp xxx.xxx.xx.x:xxx: i/o timeout

Tempo limite de conexão excedido devido a problemas de rede ao fazer pull de uma imagem de um repositório no exterior.

Fazer pull de imagens de repositórios no exterior, como Docker Hub, pode falhar em clusters ACK devido a redes de operadoras instáveis. Para resolver isso, considere as seguintes soluções:

Too Many Requests.

O Docker Hub impõe limites de taxa nas solicitações de pull de imagem.

Faça upload da imagem para o Container Registry (ACR) e faça o pull a partir de um repositório de imagens ACR.

O status Pulling image é exibido consistentemente

O mecanismo de limitação de taxa de pull de imagem do kubelet pode ter sido acionado.

Ajuste o registryPullQPS (QPS máximo para o repositório de imagens) e registryBurst (número máximo de pulls de imagem em rajada) usando o recurso Personalizar configurações do kubelet do node pool.

Fase 3: Problemas de inicialização

Pod está no estado Init

Mensagem de erro

Descrição

Solução

Preso no estado Init:N/M

O pod tem M contêineres de inicialização; N concluídos, mas os M-N restantes falharam ao iniciar.

  1. Verifique os eventos do pod e problemas de contêiner de inicialização com kubectl describe pod -n <ns> <pod name>.

  2. Verifique os logs dos contêineres de inicialização não iniciados com kubectl logs -n <ns> <pod name> -c <container name>.

  3. Revise a configuração do pod, como as configurações de health check, para garantir que os contêineres de inicialização estejam configurados corretamente.

Consulte Depurar contêineres de inicialização.

Preso no estado Init:Error

Um contêiner de inicialização no pod falhou ao iniciar.

Preso no estado Init:CrashLoopBackOff

Um contêiner de inicialização no pod falhou ao iniciar e está em um loop de reinicialização.

Pod está no estado Creating

Mensagem de erro

Descrição

Solução

failed to allocate for range 0: no IP addresses available in range set: xx.xxx.xx.xx-xx.xx.xx.xx

Este é um comportamento esperado devido ao design do plugin de rede Flannel.

Atualize o componente Flannel para v0.15.1.11-7e95fe23-aliyun ou posterior. Consulte Flannel.

Em clusters que executam uma versão do Kubernetes anterior à 1.20, um vazamento de endereço IP pode ocorrer se um pod reiniciar repetidamente ou se pods de um CronJob concluírem suas tarefas e saírem rapidamente.

Atualize o cluster para Kubernetes 1.20 ou posterior (recomenda-se o mais recente). Consulte Atualizar manualmente um cluster.

Defeitos no containerd e runC causam esse problema.

Para uma correção de emergência, consulte Por que meu pod falha ao iniciar com o erro "no IP addresses available in range"?

error parse config, can't found dev by mac 00:16:3e:01:c2:e8: not found

O plugin de rede Terway mantém um banco de dados interno no nó para rastrear e gerenciar elastic network interfaces (ENIs). Este erro ocorre quando o estado do banco de dados é inconsistente com a configuração real do dispositivo de rede, causando falha na alocação de ENI.

  1. As interfaces de rede carregam de forma assíncrona. A interface ainda pode estar carregando durante a configuração do CNI, o que aciona uma nova tentativa automática do CNI. Esse processo não afeta a alocação final da ENI. Verifique o status final do pod para confirmar o sucesso.

  2. Se a criação do pod ainda falhar e este erro persistir, o driver provavelmente falhou ao carregar a ENI devido à memória de ordem alta insuficiente. Reinicie a instância ECS para resolver isso.

  • cmdAdd: error alloc ip rpc error: code = DeadlineExceeded desc = context deadline exceeded

  • cmdAdd: error alloc ip rpc error: code = Unknown desc = error wait pod eni info, timed out waiting for the condition

O plugin de rede Terway pode ter falhado ao solicitar um endereço IP do vSwitch.

  1. Visualize os logs do contêiner Terway dentro do pod do componente Terway no nó para verificar o processo de alocação de ENI.

  2. Visualize informações de ENI para o pod Terway com kubectl logs -n kube-system <terwayPodName > -c terway | grep <podName>. Obtenha o Request ID e a mensagem de erro da OpenAPI.

  3. Use o Request ID e a mensagem de erro para investigar a falha.

Falha ao iniciar o Pod (CrashLoopBackOff)

Mensagem de erro

Descrição

Solução

O log contém exit(0).

  1. Acesse o nó onde a workload anômala está implantada.

  2. Use docker ps -a | grep $podName para verificar. Se o contêiner não tiver um processo persistente, ele sai com código de status 0.

Os eventos do pod mostram Liveness probe failed: ....

A sonda de vivacidade falhou, causando a reinicialização da aplicação.

  • Configuração da sonda de vivacidade: Na página Edit da Workloads alvo, verifique se o caminho da requisição de health check (por exemplo, /healthz) e a porta correspondem aos fornecidos pela aplicação. Aumente o Initial Delay (s) para garantir que a sonda de vivacidade inicie apenas após a aplicação ter sido totalmente lançada.

    Desative temporariamente a Liveness. Em seguida, acesse o terminal do pod ou seu nó host e use um comando, como curl, para verificar se o método de health check funciona corretamente.
  • Solucionar problemas da aplicação: Investigue o problema verificando os Events e Log do pod. Selecione Show the log of the last container exit.

Os eventos do pod mostram Startup probe failed: ....

A sonda de inicialização falhou, causando a reinicialização da aplicação.

  • Configuração da sonda de inicialização: Na página Edit da Workloads alvo, verifique se o caminho da requisição de health check (por exemplo, /healthz) e a porta correspondem aos fornecidos pela aplicação. Se a aplicação demorar muito para iniciar, aumente o Unhealthy Threshold para evitar reinicializações prematuras.

    Desative temporariamente a Startup. Em seguida, acesse o terminal do pod ou seu nó host e use um comando, como curl, para verificar se o método de health check funciona corretamente.
  • Solucionar problemas da aplicação: Investigue o problema verificando os Events e Logs do pod. Selecione Show the log of the last container exit.

O log do pod contém no space left on device.

Espaço em disco de nuvem insuficiente.

  • Redimensione o disco de nuvem.

  • Limpe imagens desnecessárias para liberar espaço em disco e configure imageGCHighThresholdPercent para definir o limiar para coleta de lixo de imagens no nó.

A inicialização falha sem informações de evento.

Este problema ocorre quando um contêiner requer mais recursos do que seus limites declarados, causando sua falha.

Verifique se a configuração de recursos do pod está correta. Ative o resource profiling para obter configurações recomendadas de Request e Limit para o contêiner.

O log do pod mostra Address already in use.

Existe um conflito de porta entre contêineres no mesmo pod.

  1. Verifique se o pod está configurado com hostNetwork: true. Esta configuração faz com que os contêineres no pod compartilhem o namespace de rede e o espaço de porta do host. Se isso não for necessário, altere para hostNetwork: false.

  2. Se o pod exigir hostNetwork: true, configure pod anti-affinity para garantir que pods do mesmo replica set sejam agendados em nós diferentes.

  3. Verifique se nenhum outro pod no mesmo nó está usando a porta.

O log do pod mostra container init caused "setenv: invalid argument": unknown.

A workload monta um Secret, mas o valor no Secret não está codificado em Base64.

  • Crie o Secret no console (os valores são codificados em Base64 automaticamente). Consulte Gerenciar Secrets.

  • Crie o Secret a partir de um arquivo YAML e codifique manualmente o valor em Base64 executando o comando echo -n "xxxxx" | base64.

Problema específico da aplicação.

Examine os logs do pod para solucionar o problema.

Pod está em Running mas não está pronto (Ready: False)

Mensagem de erro

Descrição

Solução

image Os eventos do pod mostram Readiness probe failed: ....

A sonda de prontidão falhou, impedindo o pod alvo de receber tráfego.

  • Configuração da sonda de prontidão: Na página Edit da Workloads alvo, verifique se o caminho do health check (por exemplo, /healthz) e a porta correspondem aos da aplicação. Se a aplicação iniciar lentamente, aumente o Unhealthy Threshold para evitar falhas prematuras.

    Desative temporariamente a Readiness, depois use curl no terminal do pod ou no host para verificar o endpoint de health check.
  • Solucionar problemas da aplicação: Investigue o problema verificando os Events e Logs do pod. Selecione Show the log of the last container exit.

O status do pod é o mesmo acima. Os eventos do pod mostram Startup probe failed: ....

Uma sonda de inicialização com falha causa a reinicialização do contêiner. Este erro não deve resultar em um estado persistente Running/NotReady, mas sim em um estado 'CrashLoopBackOff'.

Solucione este problema conforme descrito na seção "Falha ao iniciar o Pod (CrashLoopBackOff)" para Startups.

Fase 4: Problemas de runtime do Pod

OOMKilled

Quando um contêiner excede seu limite de memória, ele é encerrado por um OOM kill. Consulte Atribuir Recursos de Memória a Contêineres e Pods.

  • Se o processo encerrado for o processo principal do contêiner, o contêiner pode reiniciar inesperadamente.

  • Quando um evento OOM ocorre, ele aparece na aba Events da página de detalhes do pod no console, como pod was OOM killed. node:XXX pod:XXX namespace:XXX.

  • Configure um alerta de exceção de réplica de contêiner para receber notificações de OOM.

Nível de OOM

Descrição

Solução recomendada

Nível de SO

Verifique o log do kernel em /var/log/messages no nó do pod. Se o log mostrar um processo encerrado, mas não contiver logs de cgroup, o evento OOM ocorreu no nível do SO.

Nível de cgroup

Verifique o log do kernel em /var/log/messages no nó do pod. Se o log contiver uma mensagem de erro semelhante a Task in /kubepods.slice/xxxxx killed as a result of limit of /kubepods.slice/xxxx, o evento OOM ocorreu no nível do cgroup.

Consulte Causas e soluções para OOM Killer.

Terminating

Causa possível

Descrição

Solução recomendada

O nó está no estado NotReady.

O pod é excluído automaticamente após o nó se recuperar do estado NotReady.

O pod está configurado com finalizers.

Se um pod estiver configurado com finalizers, o Kubernetes executa as operações de limpeza especificadas pelos finalizers antes de excluir o pod. Se uma operação de limpeza falhar ao responder, o pod permanece no estado Terminating.

Verifique a configuração de finalizer do pod com kubectl get pod -n <ns> <pod name> -o yaml e investigue a causa.

O hook preStop do pod é inválido ou está travado.

Se um hook preStop estiver configurado para o pod, o Kubernetes executa o hook antes de encerrar o contêiner. O pod permanece no estado Terminating enquanto o hook está em execução.

Verifique a configuração do hook preStop do pod com kubectl get pod -n <ns> <pod name> -o yaml e investigue a causa.

Um período de desligamento gracioso está configurado para o pod.

Se um Pod estiver configurado com um período de desligamento gracioso (terminationGracePeriodSeconds), o Pod entra no estado Terminating após receber um comando de encerramento, como kubectl delete pod <pod_name>. O Kubernetes considera o Pod como desligado com sucesso somente após o tempo especificado em terminationGracePeriodSeconds decorrer ou o contêiner sair.

O Kubernetes exclui automaticamente o pod após o contêiner concluir um desligamento gracioso.

O contêiner não responde.

Quando você solicita parar ou excluir um pod, o Kubernetes envia um sinal SIGTERM para os contêineres no pod. Se um contêiner não lidar corretamente com o sinal SIGTERM durante o encerramento, o pod pode permanecer no estado Terminating.

  1. Force a exclusão do pod com kubectl delete pod <pod-name> --grace-period=0 --force.

  2. Verifique os logs do containerd ou Docker no nó do pod para investigar mais a fundo.

Evicted

Causa possível

Descrição

Solução recomendada

O nó está sob pressão de recursos devido a fatores como uso de memória ou disco.

O nó pode estar enfrentando pressão de memória, pressão de disco ou pressão de PID.

  • Verifique os taints do nó com kubectl describe node <node name> | grep Taints. A saída pode incluir:

    • Pressão de memória: O nó tem o taint node.kubernetes.io/memory-pressure.

    • Pressão de disco: O nó tem o taint node.kubernetes.io/disk-pressure.

    • Pressão de PID: O nó tem o taint node.kubernetes.io/pid-pressure.

  • O status do pod é um dos seguintes:

    • Evicted

    • ContainerStatusUnknown, e o campo reason no arquivo YAML do pod mostra Evicted.

Ocorre uma evicção inesperada.

Um taint NoExecute adicionado manualmente no nó do pod causou uma evicção inesperada.

Verifique se há um taint NoExecute com kubectl describe node <node name> | grep Taints. Se existir, remova-o.

A evicção não prossegue conforme o esperado.

  • --pod-eviction-timeout: Pods em um nó com falha são evacuados após este período de tempo limite. O padrão é 5 minutos.

  • --node-eviction-rate: O número de pods evacuados de um nó por segundo. O padrão é 0.1, significando que no máximo um pod é evacuado de um nó a cada 10 segundos.

  • --secondary-node-eviction-rate: A taxa secundária de evicção de nó. Se muitos nós em um cluster falharem, a taxa de evicção é reduzida para este valor. O padrão é 0.01.

  • --unhealthy-zone-threshold: O limiar de zona de disponibilidade não saudável. O padrão é 0.55. Quando a fração de nós com falha em uma zona de disponibilidade excede este limiar, a zona é considerada não saudável.

  • --large-cluster-size-threshold: O limiar de tamanho de cluster grande. O padrão é 50. Um cluster é considerado grande quando tem mais de 50 nós.

Em um cluster pequeno (50 nós ou menos), se mais de 55% dos nós falharem, a evicção de pods para. Consulte Limites de taxa na evicção.

Em um cluster grande (mais de 50 nós), se a fração de nós não saudáveis exceder o --unhealthy-zone-threshold (padrão 0.55), a taxa de evicção cai para --secondary-node-eviction-rate (padrão 0.01 pods por segundo). Consulte Limites de taxa na evicção.

Um pod é frequentemente reagendado em seu nó original após ser evacuado.

O kubelet evacua pods com base no uso real de recursos, enquanto o scheduler coloca pods com base nas solicitações de recursos. Como uma evicção libera recursos, o scheduler pode reagendar um pod no mesmo nó se suas solicitações ainda couberem.

Ajuste as solicitações de recursos do pod para caber nos recursos alocáveis do nó. Consulte Definir recursos de CPU e memória para um contêiner. Ative o resource profiling para obter valores recomendados de request e limit.

Completed

Todos os contêineres saíram com sucesso. Comum para jobs e contêineres de inicialização.

FAQ

Pod está em execução mas não funciona

Erros de YAML podem fazer com que um pod entre em Running, mas falhe ao funcionar.

  1. Verifique as configurações do contêiner na configuração do pod.

  2. Use os seguintes métodos para verificar sua configuração YAML quanto a erros de ortografia.

    Se uma chave YAML estiver escrita incorretamente (por exemplo, command como commnd), o cluster cria o recurso sem erro, mas não consegue executar a chave mal escrita em runtime.

    O exemplo a seguir, no qual command está escrito incorretamente como commnd, descreve como solucionar problemas de ortografia.

    1. Adicione --validate a kubectl apply -f e execute kubectl apply --validate -f XXX.yaml .

      Se você escrever uma palavra incorretamente, um erro será relatado: XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/test.

    2. Compare a saída pod.yaml com o arquivo YAML original usado para criar o pod.

      Nota

      [$Pod] é o nome do Pod anômalo, que você pode obter executando o comando kubectl get pods.

        kubectl get pods [$Pod] -o yaml > pod.yaml
      • Se o arquivo pod.yaml tiver mais linhas que o arquivo original, significa que o pod foi criado conforme esperado e o cluster adicionou valores padrão.

      • Se linhas do seu arquivo YAML original estiverem ausentes em pod.yaml, isso indica um erro de ortografia no seu arquivo original.

  3. Verifique os logs do pod para solucionar o problema.

  4. Acesse o contêiner através de um terminal e verifique se os arquivos locais dentro do contêiner estão conforme o esperado.

Verificar uso de recursos do nó com kubectl

  1. Verifique o uso de CPU e memória de todos os nós no cluster.

    kubectl describe nodes | awk '/^Name:/{print "\n"$2} /Resource +Requests +Limits/{print $0} /^[ \t]+cpu.*%/{print $0} /^[ \t]+memory.*%/{print $0}'

    Saída esperada:

    cn-hangzhou.192.168.0.xxx
      Resource           Requests      Limits
      cpu                1725m (44%)   10320m (263%)
      memory             1750Mi (11%)  16044Mi (109%)
    
    cn-hangzhou.192.168.16.xxx
      Resource           Requests      Limits
      cpu                1885m (48%)   16820m (429%)
      memory             2536Mi (17%)  25760Mi (179%)

    Um nó com alta utilização de requests pode não conseguir satisfazer os requests de um novo Pod, impedindo que o Pod seja agendado.

  2. Substitua YOUR_NODE_NAME pelo nome real do nó para visualizar o uso de recursos de todos os Pods no nó.kubectl describe node YOUR_NODE_NAME | awk '/Non-terminated Pods/,/Allocated resources/{ if ($0 !~ /Allocated resources/) print }'

    Saída esperada:

    Non-terminated Pods:          (11 in total)
      Namespace                   Name                                                        CPU Requests  CPU Limits   Memory Requests  Memory Limits  Age
      ---------                   ----                                                        ------------  ----------   ---------------  -------------  ---
      arms-prom                   node-exporter-gp95p                                         20m (0%)      1020m (26%)  160Mi (1%)       1152Mi (7%)    6d21h
      csdr                        csdr-velero-77c8bbc9c7-w46lq                                500m (12%)    1 (25%)      128Mi (0%)       2Gi (13%)      6d19h
      kube-system                 ack-cost-exporter-5b647ffc65-zdrsl                          100m (2%)     1 (25%)      200Mi (1%)       1Gi (6%)       6d21h
      kube-system                 ack-node-local-dns-admission-controller-5dfd74f5f4-9rl6n    100m (2%)     1 (25%)      100Mi (0%)       1Gi (6%)       6d21h
      kube-system                 ack-node-problem-detector-daemonset-6wql2                   200m (5%)     1200m (30%)  300Mi (2%)       1324Mi (9%)    6d21h
      kube-system                 coredns-7784559f6-dr9sn                                     100m (2%)     0 (0%)       100Mi (0%)       2Gi (13%)      6d21h
      kube-system                 csi-plugin-knz7j                                            130m (3%)     2 (51%)      176Mi (1%)       4Gi (27%)      6d21h
      kube-system                 kube-proxy-worker-rkbzv                                     100m (2%)     0 (0%)       100Mi (0%)       0 (0%)         6d21h
      kube-system                 loongcollector-ds-kw7cj                                     100m (2%)     2 (51%)      256Mi (1%)       2Gi (13%)      6d21h
      kube-system                 node-local-dns-pgzcn                                        25m (0%)      0 (0%)       30Mi (0%)        1Gi (6%)       6d21h
      kube-system                 terway-eniip-lnn8n                                          350m (8%)     1100m (28%)  200Mi (1%)       256Mi (1%)     6d21h

    Ajuste a configuração de requests com base no consumo real de recursos.

Desconexões intermitentes de rede de pods para bancos de dados

Se um pod se desconectar intermitentemente de um banco de dados, siga estas etapas.

1. Verificar pod
  • Verifique os eventos do pod em busca de sinais de instabilidade de conexão, como problemas de rede, reinicializações ou recursos insuficientes.

  • Verifique os logs do pod em busca de mensagens de erro relacionadas à conexão com o banco de dados, como timeouts, falhas de autenticação ou gatilhos de reconexão.

  • Monitore o uso de CPU e memória do pod para garantir que a exaustão de recursos não cause falha na aplicação ou no driver do banco de dados.

  • Revise os requests e limits de recursos do pod para garantir que ele tenha CPU e memória suficientes.

2. Verificar nó
  • Verifique se há escassez de recursos no nó (memória, disco). Consulte Monitorar nós.

  • Teste se há interrupções intermitentes de rede entre o nó e o banco de dados alvo.

3. Verificar banco de dados
  • Verifique o status e as métricas de desempenho do banco de dados em busca de reinicializações ou gargalos de desempenho.

  • Revise o número de conexões anômalas e as configurações de tempo limite de conexão, ajustando-as com base nos requisitos da sua aplicação.

  • Inspecione os logs do banco de dados em busca de registros relacionados a desconexões.

4. Verificar status dos componentes do cluster

Componentes do cluster com falha podem interromper a comunicação de rede de um pod.

kubectl get pod -n kube-system  # Check the status of component pods.

Além disso, verifique os seguintes componentes de rede:

  • CoreDNS: Verifique o status e os logs do componente para garantir que o pod possa resolver corretamente o endereço do serviço de banco de dados.

  • Flannel: Verifique o status e os logs do componente kube-flannel.

  • Terway: Verifique o status e os logs do componente terway-eniip.

5. Analisar tráfego de rede

Use tcpdump para capturar pacotes e analisar o tráfego de rede para ajudar a identificar a causa do problema.

  1. Obtenha informações do Pod e do nó:

    Liste pods e seus nós em um namespace específico:

    kubectl  get pod -n [namespace] -o wide 
  2. Acesse o nó alvo e execute os seguintes comandos para encontrar o PID do contêiner.

    Containerd

    1. Visualize o CONTAINER do contêiner.

      crictl ps |grep <Pod name keyword>

      Saída esperada:

      CONTAINER           IMAGE               CREATED             STATE                      
      a1a214d2*****       35d28df4*****       2 days ago          Running
    2. Visualize o PID do contêiner usando o CONTAINER ID.

      crictl inspect a1a214d2***** |grep -i PID

      Saída esperada:

          "pid": 2309838,    # The PID of the target container.
                  "pid": 1
                  "type": "pid"

    Docker

    1. Visualize o CONTAINER ID do contêiner.

      docker ps |grep <pod name keyword>

      Saída esperada:

      CONTAINER ID        IMAGE                  COMMAND     
      a1a214d2*****       35d28df4*****          "/nginx
    2. Visualize o PID do contêiner usando o CONTAINER ID.

      docker inspect  a1a214d2***** |grep -i PID

      Saída esperada:

                  "Pid": 2309838,  # The PID of the target container.
                  "PidMode": "",
                  "PidsLimit": null,
  3. Capture pacotes.

    Capture pacotes de rede entre o pod e o banco de dados alvo usando o PID do contêiner.

    nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <database IP address> 

    Capture pacotes de rede entre o pod e o host usando o PID do contêiner.

    nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <node IP address>

    Capture pacotes de rede entre o host e o banco de dados.

    tcpdump -i any -n -s 0 tcp and host <database IP address> 
6. Otimizar aplicação
  • Implemente um mecanismo de reconexão automática na sua aplicação para garantir que ela possa restaurar conexões automaticamente durante um failover ou migração de banco de dados.

  • Use conexões persistentes em vez de conexões de curta duração para se comunicar com o banco de dados. Conexões persistentes podem reduzir significativamente a sobrecarga de desempenho e o consumo de recursos, melhorando a eficiência geral do sistema.

Solução de problemas via console

Acesse o ACK console e vá para a página de detalhes do seu cluster para solucionar problemas de Pod.

Ações

Console

Verificar o status de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. No canto superior esquerdo da página Pods, selecione o Namespace do Pod e verifique seu status.

    • Se o status for Running, o Pod está funcionando conforme o esperado.

    • Se o status não for Running, o Pod está em um estado anômalo. Consulte este tópico para etapas de solução de problemas.

Verificar as informações básicas de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. No canto superior esquerdo da página Pods, selecione o Namespace do Pod alvo. Em seguida, clique no nome do Pod ou clique em Details na coluna Actions para visualizar detalhes como nome do Pod, imagem, endereço IP e o nó onde ele é executado.

Verificar a configuração de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. No canto superior esquerdo da página Pods, selecione o Namespace do Pod alvo. Em seguida, clique no nome do Pod ou clique em Details na coluna Actions.

  3. No canto superior direito da página de detalhes do Pod, clique em Edit YAML para visualizar o arquivo de configuração YAML do Pod.

Verificar os eventos de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. No canto superior esquerdo da página Pods, selecione o Namespace do Pod alvo. Em seguida, clique no nome do Pod ou clique em Details na coluna Actions.

  3. Na parte inferior da página de detalhes do Pod, clique na aba Events para visualizar os eventos do Pod.

    Nota

    Por padrão, o Kubernetes retém eventos da última hora. Para armazenar eventos por um período maior, consulte Criar e usar K8s Event Center.

Visualizar os logs de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. No canto superior esquerdo da página Pods, selecione o Namespaces do Pod alvo. Em seguida, clique no nome do Pod ou clique em Details na coluna Actions.

  3. Na parte inferior da página de detalhes do Pod, clique na aba Logs para visualizar os logs do Pod.

Nota

O ACK integra-se ao Simple Log Service (SLS) para coleta de logs de contêineres. Consulte Coletar logs de contêineres de um cluster ACK.

Verificar os dados de monitoramento de um Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Operations > Prometheus Monitoring.

  2. Na página Prometheus Monitoring, clique na aba Cluster Overview para visualizar painéis de monitoramento de CPU, memória e I/O de rede do Pod.

Nota

O ACK integra-se ao Managed Service for Prometheus para monitoramento em tempo real de clusters e contêineres. Consulte Conectar e configurar o Managed Service for Prometheus.

Usar um terminal para acessar um contêiner e visualizar arquivos locais

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. Na página Pods, localize o Pod alvo e clique em Terminal na coluna Actions.

Executar diagnóstico de Pod

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

  2. Na página Pods, localize o Pod alvo e clique em Diagnose na coluna Actions. Resolva quaisquer problemas identificados com base nos resultados do diagnóstico.

Nota

Container Intelligent Service fornece diagnósticos com um clique. Consulte Usar diagnóstico de cluster.

Exclusão inesperada de Pod

O kube-controller-manager (KCM) realiza coleta de lixo de pods no status Completed quando sua contagem excede o limiar padrão de 12.500. O parâmetro --terminated-pod-gc-threshold configura esse limiar. Consulte a documentação de parâmetros do KCM.

Recomendação: Limpe periodicamente os pods Completed para evitar que afetem a eficiência do controlador.