Kubernetes é uma plataforma poderosa para orquestração de containers, mas diagnosticar problemas em produção pode ser desafiador, até mesmo para engenheiros experientes. Montei este guia para tentar oferecer as melhores práticas e comandos kubectl
para ajudá-lo a depurar problemas de forma eficiente em um cluster Kubernetes em produção.
Os comandos apresentados foram executados em um cluster ativo, garantindo que os exemplos reflitam cenários reais. Isso valida que os passos fornecidos foram devidamente testados em um ambiente Kubernetes.
1. Verificando a Saúde do Cluster
A primeira etapa para depurar um problema é verificar a saúde geral do cluster, pois isso ajuda a identificar componentes falhando ou recursos sobrecarregados.
a. Verificando o status dos nós
Os nós são a espinha dorsal do cluster, e problemas neles podem afetar os pods agendados.
Listando nós do cluster:
kubectl get nodes
Esse comando lista todos os nós e seus status (Ready, NotReady, etc.). Se um nó estiver marcado como “NotReady”, é importante investigar mais a fundo verificando os eventos associados.
Detalhando informações sobre um nó específico:
kubectl describe node <nome-do-no>
Esse comando fornece detalhes sobre possíveis problemas, como falta de memória, pressão de disco ou taints que os pods não conseguem tolerar. Também mostra os pods em execução no nó, rótulos, entre outras informações úteis.
b. Verificando componentes centrais
Componentes críticos como kube-apiserver
, kube-scheduler
e kube-controller-manager
devem estar funcionando corretamente para garantir a saúde do cluster.
Verificando o status dos componentes (substituto do comando depreciado):
kubectl get --raw='/readyz?verbose'
Esse comando verifica o status de componentes principais. Qualquer componente marcado como “Unhealthy” requer atenção imediata.
2. Diagnosticando Problemas com Pods
Os pods são as unidades de execução no Kubernetes, e a maioria dos problemas de produção se manifesta como falhas em pods.
a. Obtendo pods que não estão em estado Running
Para escanear rapidamente o estado de todos os pods em todos os namespaces:
kubectl get pod -A | grep -v "Running"
Isso ajuda a identificar rapidamente pods que estão com problemas.
b. Verificando o status de um pod específico
Para verificar os pods em um namespace específico:
kubectl get pods -n <nome-do-namespace>
As colunas STATUS, RESTARTS e AGE fornecem uma visão inicial sobre possíveis problemas. Para detalhes mais específicos sobre um pod:
kubectl describe pod <nome-do-pod> -n <nome-do-namespace>
Esse comando mostra eventos recentes, erros e mensagens de status.
c. Explorando logs de containers
Se um pod falhar ou se comportar de maneira inesperada, os logs dos containers podem fornecer pistas valiosas:
kubectl logs <nome-do-pod> -n <nome-do-namespace> --previous
A flag --previous
é útil para visualizar os logs do container que foi reiniciado após falhar. Para ver as últimas 200 linhas de log:
kubectl logs <nome-do-pod> -n <nome-do-namespace> --tail=200
Essa flag é útil para ver logs recentes, e o uso de -f
permite acompanhar logs em tempo real.
d. Acessando um container em tempo real
Em alguns casos, é necessário executar comandos diretamente no container:
kubectl exec -it <nome-do-pod> -n <nome-do-namespace> -- /bin/bash
Isso abre um shell interativo dentro do container, permitindo inspecionar arquivos, configurações e executar diagnósticos.
3. Resolvendo Problemas de Rede
Problemas de rede são comuns em ambientes distribuídos como o Kubernetes. Aqui estão algumas etapas para diagnosticar problemas de conectividade.
a. Verificando serviços e endpoints
Serviços no Kubernetes fornecem interfaces de rede estáveis para os pods. Se um serviço não estiver funcionando corretamente:
kubectl get svc -n <nome-do-namespace>
Para verificar os endpoints associados:
kubectl get endpoints <nome-do-servico> -n <nome-do-namespace>
Se um serviço não tiver endpoints, isso pode indicar que os pods de backend estão falhando ou indisponíveis.
b. Depurando ingress e balanceadores de carga
Para aplicações expostas fora do cluster, o controlador de ingress e balanceadores de carga desempenham um papel crucial. Verifique o status de um ingress:
kubectl describe ingress <nome-do-ingress> -n <nome-do-namespace>
Esse comando exibe detalhes de configuração e eventos associados. Procure por erros de configuração, certificados SSL ausentes ou problemas de roteamento.
c. Testando conectividade entre pods
Para testar a conectividade entre pods:
kubectl exec -it <nome-do-pod-origem> -n <nome-do-namespace> -- curl <servico-destino>:<porta>
Se a conectividade falhar, isso pode indicar um problema de rede mais profundo, como uma regra de firewall bloqueando o tráfego ou uma política de rede mal configurada.
4. Usando Ferramentas Avançadas de Depuração
Além do kubectl
, existem ferramentas específicas que podem ajudar a diagnosticar problemas complexos em produção.
a. kubectl-debug
O kubectl-debug
permite lançar um container de depuração (como o BusyBox ou Alpine) acoplado a um pod existente:
kubectl debug <nome-do-pod> -n <nome-do-namespace> --image=busybox --target=<nome-do-container>
Essa ferramenta é útil para acessar o ambiente de execução com permissões de root ou ferramentas adicionais.
b. k9s
O k9s
é uma interface de terminal para interagir com clusters Kubernetes. Ele oferece uma visão em tempo real de pods, serviços e outros recursos:
k9s
O k9s
permite visualizar logs, eventos e configurações em uma única interface, acelerando o processo de depuração.
c. kail
O kail
é uma ferramenta de linha de comando para visualizar logs de pods em tempo real:
kail -n <nome-do-namespace>
É especialmente útil para monitorar logs em um namespace específico, permitindo uma depuração mais rápida.
Depurar problemas de produção em Kubernetes exige uma abordagem metódica e o uso eficaz das ferramentas disponíveis. Usando os comandos kubectl
e as ferramentas avançadas mencionadas, você pode identificar rapidamente os problemas e tomar as ações apropriadas. O segredo é sempre começar com uma análise geral do cluster antes de mergulhar nos detalhes específicos.
Compartilhe suas experiências e contribua com dicas e ferramentas adicionais que você usa para depurar clusters Kubernetes em produção. Boa sorte na depuração!
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.