Guia Completo de Troubleshooting para Kubernetes
Guia de Troubleshooting para Kubernetes
Este guia fornece uma coleção organizada de comandos e técnicas para diagnosticar e resolver problemas comuns no Kubernetes. A estrutura segue uma lógica de causa e efeito, apresentando um problema (o efeito) e, em seguida, os comandos para investigar e identificar a causa.
Fluxo de Troubleshooting Estruturado (Checklist Inicial)
Antes de mergulhar em diagnósticos profundos, comece com este checklist para os problemas mais comuns. Ele serve como um ponto de partida rápido para identificar a área geral do problema.
- POD não inicia
- Causa provável: Imagem não encontrada, erro de configuração, falta de recursos, falha no pull da imagem.
- Diagnóstico:
kubectl describe pod <NOME_DO_POD>para ver detalhes e eventos.kubectl logs --previous <NOME_DO_POD>para verificar logs de containers que reiniciaram.- Verificar eventos do namespace:
kubectl get events -n <NAMESPACE>. - Checar
imagePullSecretsse a imagem for de um registro privado.
- POD em Crash (CrashLoopBackOff)
- Causa provável: Erro na aplicação, configuração incorreta de probes (liveness/readiness), falta de memória ou CPU.
- Diagnóstico:
kubectl logs <NOME_DO_POD>para ver a saída do container.- Verificar a configuração das
readiness/liveness probesno manifesto do pod. - Checar o consumo de recursos:
kubectl top pod <NOME_DO_POD>.
- Problemas de Rede
- Causa provável: Problema de DNS,
NetworkPolicybloqueando tráfego, serviço mal configurado. - Diagnóstico:
- Testar resolução de DNS interno a partir de um pod de debug.
- Verificar
NetworkPolicies:kubectl get networkpolicies -A. - Checar os
endpointsdo serviço:kubectl get endpoints <NOME_DO_SERVICO>.
- Causa provável: Problema de DNS,
- Armazenamento não Monta
- Causa provável:
StorageClassincorreta, problema no provisionador de volume,PersistentVolumeClaim(PVC) não consegue se vincular a umPersistentVolume(PV). - Diagnóstico:
kubectl describe pvc <NOME_DO_PVC>para obter detalhes sobre o erro.- Verificar a
StorageClasse seu provisionador. - Checar eventos relacionados ao PV e PVC:
kubectl get events | grep -i pvc.
- Causa provável:
Diagnóstico de Componentes do Cluster
Quando o problema não é óbvio a partir do checklist inicial, o próximo passo é investigar a saúde dos componentes fundamentais do cluster.
1. Diagnóstico de Nós (Nodes)
Efeito: Um ou mais nós não estão se comportando como esperado (ex: NotReady, sobrecarregado).
Causa: Problemas de rede no nó, kubelet parado, falta de recursos (CPU, memória, disco).
1
2
3
4
5
6
7
8
9
10
11
# Listar todos os nós e seu status
kubectl get nodes -o wide
# Obter informações detalhadas sobre um nó específico
kubectl describe node <NOME_DO_NO>
# Verificar o consumo de CPU e memória dos nós
kubectl top nodes
# Verificar rapidamente se todos os nós estão com status "Ready"
kubectl get nodes -o jsonpath='{.items[*].status.conditions[?(@.type=="Ready")].status}'
2. Diagnóstico de Pods
Efeito: O pod está em um estado inesperado (Pending, CrashLoopBackOff, ImagePullBackOff).
Causa: Falta de recursos para agendamento, erro na imagem, erro na aplicação dentro do container.
1
2
3
4
5
6
7
8
9
10
11
# Listar todos os pods em todos os namespaces
kubectl get pods --all-namespaces -o wide
# Descrever um pod para ver eventos e configurações detalhadas
kubectl describe pod <NOME_DO_POD> -n <NAMESPACE>
# Verificar o consumo de CPU e memória dos pods em um namespace
kubectl top pods -n <NAMESPACE>
# Obter eventos associados a um pod específico
kubectl get events --field-selector involvedObject.name=<NOME_DO_POD>
3. Análise de Logs
Efeito: A aplicação dentro do pod não funciona corretamente.
Causa: Erros de código, problemas de configuração, falhas de conexão, que são geralmente registrados nos logs.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Ver logs de um pod (se houver múltiplos containers, especifique com -c)
kubectl logs <NOME_DO_POD> -c <NOME_DO_CONTAINER>
# Ver logs de todos os containers em um pod
kubectl logs <NOME_DO_POD> --all-containers
# Ver logs de uma execução anterior de um container que reiniciou
kubectl logs --previous <NOME_DO_POD>
# Adicionar timestamps aos logs
kubectl logs <NOME_DO_POD> --timestamps
# Seguir os logs de múltiplos pods com um label específico (ex: app=meu-app)
kubectl logs -f -l app=<VALOR_DO_LABEL>
# Ver logs desde um tempo específico (ex: última hora)
kubectl logs <NOME_DO_POD> --since=1h
Troubleshooting de Rede
Problemas de rede são uma das causas mais comuns de falhas em aplicações distribuídas. A investigação deve seguir uma abordagem passo a passo, da camada de serviço até a conectividade básica.
1. Diagnóstico de Serviços (Services) e Endpoints
Efeito: Uma aplicação não consegue se conectar a outra através de um Service.
Causa: O Service não está selecionando nenhum pod, os Endpoints não foram criados, ou uma NetworkPolicy está bloqueando o tráfego.
1
2
3
4
5
6
7
8
# Verificar se o Service tem Endpoints (pods) associados a ele
kubectl get endpoints <NOME_DO_SERVICO>
# Descrever o Service para verificar o seletor e as portas
kubectl describe service <NOME_DO_SERVICO>
# Listar todas as políticas de rede para verificar se há bloqueios
kubectl get networkpolicies -A
2. Testes de Conectividade e DNS
Efeito: Falha na resolução de nomes ou na conexão com um serviço.
Causa: Problema no CoreDNS, configuração de DNS incorreta no pod, ou falha de rede básica.
1
2
3
4
5
6
7
8
9
10
11
12
# Criar um pod de debug para testar a rede de dentro do cluster
kubectl run multitool --image=praqma/network-multitool --rm -it --restart=Never -- bash
# Dentro do pod de debug, testar a resolução de DNS
nslookup <NOME_DO_SERVICO>.<NAMESPACE>.svc.cluster.local
# Testar a conectividade com a porta de um serviço
nc -zv <NOME_DO_SERVICO> <PORTA>
# Usar o port-forward para expor um pod ou serviço localmente e debugá-lo
kubectl port-forward <NOME_DO_POD> <PORTA_LOCAL>:<PORTA_DO_POD>
kubectl port-forward service/<NOME_DO_SERVICO> <PORTA_LOCAL>:<PORTA_DO_SERVICO>
3. Diagnóstico de Ingress
Efeito: O tráfego externo não chega ao serviço.
Causa: Configuração incorreta do Ingress, problema no Ingress Controller, ou erro de certificado TLS.
1
2
3
4
5
6
7
8
# Listar todos os Ingress no cluster
kubectl get ingress -A
# Descrever o Ingress para ver as regras, backends e eventos
kubectl describe ingress <NOME_DO_INGRESS> -n <NAMESPACE>
# Obter a configuração completa do Ingress em formato YAML
kubectl get ingress <NOME_DO_INGRESS> -o yaml -n <NAMESPACE>
Troubleshooting de Armazenamento
Efeito: O pod não consegue iniciar porque um volume não pode ser montado.
Causa: PersistentVolumeClaim (PVC) não consegue se vincular a um PersistentVolume (PV), a StorageClass não existe ou está mal configurada, ou há um problema com o provisionador de armazenamento subjacente.
1
2
3
4
5
6
7
8
# Listar todos os PVs, PVCs e StorageClasses
kubectl get pv,pvc,storageclass -A
# Descrever o PVC para entender por que ele está em estado "Pending" ou com erro
kubectl describe pvc <NOME_DO_PVC> -n <NAMESPACE>
# Filtrar eventos do cluster para encontrar problemas relacionados a PVCs
kubectl get events | grep -i pvc
Troubleshooting de Acesso a Compartilhamentos NFS e SMB/CIFS
Compartilhamentos de rede como NFS (Network File System) e SMB/CIFS (Common Internet File System) são frequentemente utilizados em ambientes Kubernetes para persistência de dados. Problemas de conectividade, permissões e configuração podem impedir que os pods acessem esses recursos corretamente.
1. Testes Básicos de Conectividade NFS
Efeito: Os pods não conseguem montar volumes NFS ou a montagem falha intermitentemente.
Causa: Problema de conectividade de rede, portas bloqueadas, servidor NFS inacessível ou versão do NFS incompatível.
Verificar Portas NFS
O NFS utiliza múltiplas portas que precisam estar acessíveis. As principais são:
- Porta 111 (rpcbind): Serviço de mapeamento RPC
- Porta 2049 (nfs): Serviço NFS principal
- Porta 20048 (mountd): Serviço de montagem
1
2
3
4
5
# Testar conectividade com servidor NFS em uma porta específica
kubectl run test-nfs-connect --rm -it --image=alpine --restart=Never -- nc -zv nfs-server.example.com 2049
# Testar múltiplas portas NFS simultaneamente
kubectl exec -it multitool -- bash -c "nc -zv nfs-server 111; nc -zv nfs-server 2049; nc -zv nfs-server 20048"
Testar Montagem NFS Básica
O pod a seguir tenta montar um compartilhamento NFS e executar testes básicos de leitura e escrita:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: v1
kind: Pod
metadata:
name: nfs-test-basic
spec:
containers:
- name: nfs-tester
image: alpine:latest
command: ["sh", "-c"]
args:
- |
apk add --no-cache nfs-utils
mkdir -p /mnt/nfs
echo "Tentando montar NFS..."
mount -t nfs -o nfsvers=4 nfs-server.example.com:/export/path /mnt/nfs
if mountpoint -q /mnt/nfs; then
echo "Montagem NFS bem-sucedida"
df -h /mnt/nfs
ls -la /mnt/nfs
# Testar escrita
echo "teste_$(date)" > /mnt/nfs/testfile.txt
cat /mnt/nfs/testfile.txt
umount /mnt/nfs
else
echo "Falha na montagem NFS"
exit 1
fi
securityContext:
privileged: true
restartPolicy: Never
2. Pod de Diagnóstico NFS Completo
Para um diagnóstico mais aprofundado, este ConfigMap contém um script que testa conectividade, portas, exports do servidor e diferentes versões do NFS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
apiVersion: v1
kind: ConfigMap
metadata:
name: nfs-diagnostic-script
data:
test-nfs.sh: |
#!/bin/bash
set -e
echo "=== Diagnóstico NFS ==="
echo "Servidor NFS: ${NFS_SERVER}"
echo "Caminho: ${NFS_PATH}"
# Instalar dependências
echo "1. Instalando nfs-utils..."
apk add --no-cache nfs-utils
# Testar portas
echo -e "\n2. Testando conectividade nas portas NFS:"
for port in 111 2049 20048; do
if nc -z -w5 ${NFS_SERVER} ${port}; then
echo "Porta ${port} acessível"
else
echo "Porta ${port} inacessível"
fi
done
# Mostrar exports do servidor
echo -e "\n3. Listando exports do servidor:"
showmount -e ${NFS_SERVER} || echo "showmount falhou"
# Testar montagem NFSv3
echo -e "\n4. Testando montagem NFSv3:"
mkdir -p /mnt/nfs-test
if mount -t nfs -o nfsvers=3 ${NFS_SERVER}:${NFS_PATH} /mnt/nfs-test; then
echo "NFSv3 montado com sucesso"
df -h /mnt/nfs-test
umount /mnt/nfs-test
else
echo "Falha na montagem NFSv3"
fi
# Testar montagem NFSv4
echo -e "\n5. Testando montagem NFSv4:"
if mount -t nfs -o nfsvers=4 ${NFS_SERVER}:${NFS_PATH} /mnt/nfs-test; then
echo "NFSv4 montado com sucesso"
ls -la /mnt/nfs-test
# Testar escrita
TEST_FILE="/mnt/nfs-test/test_write_$(hostname).txt"
echo "Teste de escrita $(date)" > ${TEST_FILE}
echo "Conteúdo escrito: $(cat ${TEST_FILE})"
rm ${TEST_FILE}
umount /mnt/nfs-test
else
echo "Falha na montagem NFSv4"
fi
# Verificar estatísticas RPC
echo -e "\n6. Estatísticas RPC:"
rpcinfo -p ${NFS_SERVER} || echo "rpcinfo falhou"
echo -e "\n=== Diagnóstico completo ==="
Para executar este script:
1
2
3
4
5
6
kubectl run nfs-diagnostic --rm -it --image=alpine \
--env="NFS_SERVER=nfs-server.example.com" \
--env="NFS_PATH=/export/data" \
--restart=Never -- sh -c "
apk add --no-cache curl
curl -s https://raw.githubusercontent.com/seu-repo/nfs-test.sh | sh"
3. Testes de Conectividade SMB/CIFS
Efeito: Os pods não conseguem montar compartilhamentos SMB ou a autenticação falha.
Causa: Portas bloqueadas, credenciais incorretas, versão do SMB incompatível ou problemas de domínio.
Testar Portas SMB
O SMB utiliza as seguintes portas:
- Porta 139 (NetBIOS): Comunicação NetBIOS
- Porta 445 (SMB): SMB direto (recomendado)
1
2
3
4
5
6
# Testar portas SMB
kubectl run test-smb-ports --rm -it --image=alpine --restart=Never -- \
sh -c "nc -zv smb-server 139; nc -zv smb-server 445"
# Usando multitool com nmap para scan mais detalhado
kubectl exec -it multitool -- nmap -p 139,445 smb-server.example.com
Pod de Teste SMB/CIFS Básico
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: v1
kind: Pod
metadata:
name: smb-test-basic
spec:
containers:
- name: smb-tester
image: alpine:latest
command: ["sh", "-c"]
args:
- |
apk add --no-cache cifs-utils samba-client
mkdir -p /mnt/smb
echo "Testando lista de compartilhamentos..."
smbclient -L //smb-server.example.com -U ${SMB_USER}%${SMB_PASSWORD} || \
smbclient -L //smb-server.example.com -N
echo "Tentando montar SMB..."
mount -t cifs //smb-server.example.com/share /mnt/smb \
-o username=${SMB_USER},password=${SMB_PASSWORD},vers=3.0
if mountpoint -q /mnt/smb; then
echo "SMB montado com sucesso"
df -h /mnt/smb
ls -la /mnt/smb
# Testar escrita
echo "teste_$(date)" > /mnt/smb/testfile.txt
cat /mnt/smb/testfile.txt
umount /mnt/smb
else
echo "Falha na montagem SMB"
fi
env:
- name: SMB_USER
value: "usuario"
- name: SMB_PASSWORD
value: "senha"
securityContext:
privileged: true
restartPolicy: Never
4. Pod Avançado de Diagnóstico SMB
Este pod executa testes completos incluindo diferentes versões do SMB, testes de IO e performance:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
apiVersion: v1
kind: Pod
metadata:
name: smb-diagnostic
spec:
containers:
- name: diagnostic
image: ubuntu:latest
command: ["bash", "-c"]
args:
- |
apt-get update && apt-get install -y cifs-utils smbclient curl netcat
echo "=== Diagnóstico SMB/CIFS ==="
echo "Servidor: ${SMB_SERVER}"
echo "Compartilhamento: ${SMB_SHARE}"
# Testar portas
echo -e "\n1. Testando portas:"
timeout 5 nc -zv ${SMB_SERVER} 139 && echo "Porta 139 (NetBIOS) acessível"
timeout 5 nc -zv ${SMB_SERVER} 445 && echo "Porta 445 (SMB) acessível"
# Listar compartilhamentos
echo -e "\n2. Listando compartilhamentos disponíveis:"
if [ -n "${SMB_USER}" ] && [ -n "${SMB_PASSWORD}" ]; then
smbclient -L //${SMB_SERVER} -U ${SMB_USER}%${SMB_PASSWORD} || true
else
smbclient -L //${SMB_SERVER} -N || true
fi
# Testar diferentes versões do SMB
echo -e "\n3. Testando diferentes versões SMB:"
for vers in 1.0 2.0 2.1 3.0 3.1.1; do
mkdir -p /mnt/smb-test-${vers}
echo -n "SMB versão ${vers}: "
if mount -t cifs //${SMB_SERVER}/${SMB_SHARE} /mnt/smb-test-${vers} \
-o username=${SMB_USER},password=${SMB_PASSWORD},vers=${vers},ro 2>/dev/null; then
echo "Suporte disponível"
umount /mnt/smb-test-${vers}
else
echo "Não suportado"
fi
rmdir /mnt/smb-test-${vers}
done
# Montagem completa e teste de IO
echo -e "\n4. Teste completo de montagem e IO:"
mkdir -p /mnt/smb-final
MOUNT_OPTS="username=${SMB_USER},password=${SMB_PASSWORD},vers=3.0"
if mount -t cifs //${SMB_SERVER}/${SMB_SHARE} /mnt/smb-final -o ${MOUNT_OPTS}; then
echo "Montagem bem-sucedida"
# Informações do sistema de arquivos
echo -e "\nInformações do sistema de arquivos:"
df -h /mnt/smb-final
mount | grep /mnt/smb-final
# Teste de leitura
echo -e "\nTestando leitura:"
ls -la /mnt/smb-final | head -20
# Teste de escrita (se não for readonly)
echo -e "\nTestando escrita:"
TEST_FILE="/mnt/smb-final/test_k8s_$(hostname)_$(date +%s).txt"
if touch ${TEST_FILE} 2>/dev/null; then
echo "Teste de escrita $(date)" > ${TEST_FILE}
echo "Escrita bem-sucedida. Conteúdo:"
cat ${TEST_FILE}
rm ${TEST_FILE}
else
echo "Escrita não permitida (pode ser normal para compartilhamentos readonly)"
fi
# Teste de performance básico
echo -e "\nTeste de performance (dd):"
time dd if=/dev/zero of=/mnt/smb-final/test_dd bs=1M count=10 status=none 2>&1 || \
echo "dd falhou - possivelmente sem permissão de escrita"
# Limpeza
umount /mnt/smb-final
echo -e "\nTestes concluídos"
else
echo "Falha na montagem final"
exit 1
fi
env:
- name: SMB_SERVER
value: "smb-server.example.com"
- name: SMB_SHARE
value: "compartilhamento"
- name: SMB_USER
value: "usuario"
- name: SMB_PASSWORD
value: "senha"
securityContext:
privileged: true
restartPolicy: Never
5. Usando Secrets para Credenciais SMB
Ao trabalhar com credenciais sensíveis, é recomendado utilizar Kubernetes Secrets em vez de variáveis de ambiente em texto plano:
1
2
3
4
5
6
7
8
9
# Secret para credenciais SMB
apiVersion: v1
kind: Secret
metadata:
name: smb-credentials
type: Opaque
stringData:
username: "dominio\\usuario"
password: "senha-secreta"
Pod que utiliza o Secret:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: v1
kind: Pod
metadata:
name: smb-with-secret
spec:
containers:
- name: smb-mount
image: alpine:latest
command: ["sh", "-c"]
args:
- |
apk add --no-cache cifs-utils
mkdir -p /mnt/smb
mount -t cifs //smb-server/share /mnt/smb \
-o username=${SMB_USER},password=${SMB_PASS},domain=${SMB_DOMAIN}
if mountpoint -q /mnt/smb; then
echo "Montagem bem-sucedida"
ls -la /mnt/smb
fi
sleep 3600
env:
- name: SMB_USER
valueFrom:
secretKeyRef:
name: smb-credentials
key: username
- name: SMB_PASS
valueFrom:
secretKeyRef:
name: smb-credentials
key: password
- name: SMB_DOMAIN
value: "MEUDOMINIO"
securityContext:
privileged: true
6. Testes de PersistentVolume com NFS/SMB
Verificar PVs e PVCs Existentes
1
2
3
4
5
6
7
8
# Listar todos os PVs e PVCs
kubectl get pv,pvc -A
# Descrever um PV específico para ver detalhes de configuração
kubectl describe pv <nome-do-pv-nfs>
# Verificar eventos relacionados ao volume
kubectl get events --field-selector involvedObject.kind=PersistentVolumeClaim
Testar Montagem de PV NFS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: test-pv-nfs
spec:
containers:
- name: test-container
image: alpine:latest
command: ["sleep", "3600"]
volumeMounts:
- name: nfs-volume
mountPath: /data
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: meu-pvc-nfs
Diagnóstico de Problemas de Montagem
1
2
3
4
5
6
7
8
9
# Verificar se o pod consegue montar o volume
kubectl describe pod test-pv-nfs | grep -A 10 -B 5 "MountVolume"
# Verificar logs do kubelet (se possível)
journalctl -u kubelet | grep -i nfs
# Executar dentro do pod para testar o volume
kubectl exec -it test-pv-nfs -- df -h /data
kubectl exec -it test-pv-nfs -- touch /data/testfile
7. Ferramentas Especializadas
Usando Imagem com Ferramentas SMB/NFS Completas
1
2
3
4
5
6
7
8
# Imagem com todas as ferramentas de diagnóstico
kubectl run storage-tools --rm -it --image=instrumentisto/nmap-smb-nfs \
--restart=Never -- bash
# Dentro do container, você pode executar:
# nmap -sV --script smb-protocols,smb-security-mode,nfs-showmount <servidor>
# smbclient //server/share
# showmount -e nfs-server
Script de Diagnóstico Automático
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# diagnose-storage.sh
echo "=== Diagnóstico de Armazenamento ==="
# Testar DNS
echo "1. Resolução DNS:"
nslookup $NFS_SERVER
nslookup $SMB_SERVER
# Testar portas NFS
echo -e "\n2. Portas NFS:"
nmap -p 111,2049,20048 $NFS_SERVER | grep open
# Testar portas SMB
echo -e "\n3. Portas SMB:"
nmap -p 139,445 $SMB_SERVER | grep open
# Testar exports NFS
echo -e "\n4. Exports NFS:"
showmount -e $NFS_SERVER 2>/dev/null || echo "showmount falhou"
# Testar compartilhamentos SMB
echo -e "\n5. Compartilhamentos SMB:"
smbclient -L //$SMB_SERVER -N 2>/dev/null | grep -E "^\s+[A-Z]" || echo "smbclient falhou"
8. Solução de Problemas Comuns
Problemas Comuns de NFS
| Problema | Solução |
|---|---|
| Timeout na montagem | Tentar com versão específica do NFS: mount -t nfs -o nfsvers=4.1,timeo=300,retrans=5 server:/path /mnt |
| Problemas de permissão | Verificar UID/GID no servidor NFS: kubectl exec -it pod-nfs -- id e montar com: mount -t nfs -o uid=1000,gid=1000 server:/path /mnt |
| Stale file handles | Remontar o volume: umount -l /mnt/nfs seguido de mount -t nfs server:/path /mnt/nfs |
Problemas Comuns de SMB
| Problema | Solução |
|---|---|
| Protocolo incompatível | Forçar versão específica: mount -t cifs -o vers=2.0 //server/share /mnt |
| Problemas de encoding | Especificar charset: mount -t cifs -o iocharset=utf8,codepage=cp850 //server/share /mnt |
| Problemas de domínio | Incluir domínio na montagem: mount -t cifs -o domain=MEUDOMINIO //server/share /mnt |
9. Comandos Rápidos para Troubleshooting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Verificar se o serviço NFS está rodando no servidor
kubectl exec -it multitool -- rpcinfo -p nfs-server | grep nfs
# Verificar estatísticas NFS
kubectl exec -it multitool -- nfsstat -m
# Testar performance básica com dd
kubectl exec -it pod-com-nfs -- dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=100
# Verificar latência do servidor
kubectl exec -it multitool -- ping -c 5 nfs-server
# Capturar pacotes (se tiver permissão)
kubectl exec -it multitool -- tcpdump -i any port 2049 -c 10
10. Job para Teste Contínuo de Armazenamento
Para monitoramento contínuo da saúde dos compartilhamentos, este CronJob executa testes periodicamente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: batch/v1
kind: CronJob
metadata:
name: storage-health-check
spec:
schedule: "*/15 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: checker
image: alpine:latest
command: ["sh", "-c"]
args:
- |
apk add --no-cache nfs-utils cifs-utils
# Testar NFS
mkdir -p /mnt/nfs-test
if mount -t nfs nfs-server:/share /mnt/nfs-test; then
echo "$(date) - NFS OK" >> /tmp/health.log
echo "test" > /mnt/nfs-test/healthcheck.txt
umount /mnt/nfs-test
else
echo "$(date) - NFS FAILED" >> /tmp/health.log
fi
# Testar SMB
mkdir -p /mnt/smb-test
if mount -t cifs //smb-server/share /mnt/smb-test -o username=user,password=pass; then
echo "$(date) - SMB OK" >> /tmp/health.log
umount /mnt/smb-test
else
echo "$(date) - SMB FAILED" >> /tmp/health.log
fi
cat /tmp/health.log
securityContext:
privileged: true
restartPolicy: OnFailure
Troubleshooting de Configuração e Debug
Erros de configuração são sutis e podem levar a comportamentos inesperados. O debug direto nos containers é uma ferramenta poderosa para investigações em tempo real.
1. Verificação de ConfigMaps e Secrets
Efeito: A aplicação se comporta de forma inesperada ou não consegue iniciar devido a configurações ou credenciais ausentes/incorretas.
Causa: ConfigMap ou Secret não montado corretamente, dados incorretos ou erro de codificação (para Secrets).
1
2
3
4
5
6
7
8
# Validar um manifesto antes de aplicá-lo (dry-run no lado do cliente)
kubectl apply --dry-run=client -f seu-manifesto.yaml
# Ver o conteúdo de um ConfigMap
kubectl get configmap <NOME_DO_CONFIGMAP> -o yaml
# Decodificar e ver o conteúdo de um Secret
kubectl get secret <NOME_DO_SECRET> -o jsonpath='{.data}' | base64 -d
2. Debug Interativo de Containers
Efeito: Necessidade de investigar o ambiente de um container em execução ou executar comandos de diagnóstico dentro dele.
Causa: O problema só é reproduzível dentro do ambiente do container.
1
2
3
4
5
6
7
8
9
10
# Acessar um shell dentro de um container em execução
kubectl exec -it <NOME_DO_POD> -c <NOME_DO_CONTAINER> -- sh
# Usar um container efêmero para debug (Kubernetes 1.18+)
# Isso anexa um novo container com ferramentas de debug a um pod existente
kubectl debug <NOME_DO_POD> -it --image=busybox --target=<NOME_DO_CONTAINER>
# Copiar arquivos entre o pod e a máquina local
kubectl cp <NOME_DO_POD>:/caminho/no/pod ./arquivo-local
kubectl cp ./arquivo-local <NOME_DO_POD>:/caminho/no/pod
Validação de Conexão com Banco de Dados
Efeito: A aplicação não consegue se conectar ao banco de dados.
Causa: Problema de rede, credenciais incorretas, erro de DNS ou o serviço do banco de dados não está acessível.
1. Teste Básico de Conectividade
1
2
3
4
5
6
# Criar um pod temporário com o cliente do banco de dados (ex: MySQL)
kubectl run mysql-test --rm -it --image=mysql:8.0 --restart=Never -- bash
# Dentro do container, tente se conectar ao serviço do banco de dados
# O nome do serviço deve ser o FQDN (Fully Qualified Domain Name)
mysql -h <NOME_DO_SERVICO>.<NAMESPACE>.svc.cluster.local -u <USUARIO> -p
2. Teste de Porta com Netcat
1
2
# Use um pod com netcat para verificar se a porta do banco de dados está aberta
kubectl run netcat-test --rm -it --image=alpine --restart=Never -- nc -zv <NOME_DO_SERVICO_DB> <PORTA_DO_DB>
3. Script Completo de Diagnóstico (Exemplo para MySQL)
Crie um ConfigMap com um script de diagnóstico e execute-o a partir de um pod para um teste automatizado e completo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# configmap-diagnostic.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-diagnostic-script
data:
diagnostic.sh: |
#!/bin/bash
echo "=== Testando Conexão com MySQL: $MYSQL_HOST ==="
echo "1. Resolução de DNS:"
nslookup $MYSQL_HOST
echo -e "\n2. Acessibilidade da Porta 3306:"
nc -zv $MYSQL_HOST 3306
echo -e "\n3. Teste de Conexão MySQL:"
mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT @@version;"
Ferramentas Externas Úteis
Além do kubectl, o ecossistema Kubernetes oferece várias ferramentas de linha de comando que podem acelerar e simplificar o troubleshooting.
- k9s: Uma UI de terminal completa para gerenciar e observar seu cluster, permitindo navegação rápida entre recursos.
- stern: Permite visualizar logs de múltiplos pods e containers de forma agregada e com cores, facilitando o rastreamento de problemas em aplicações distribuídas.
- kubectx / kubens: Utilitários para trocar de contexto (cluster) e namespace de forma rápida e eficiente.
- popeye: Uma ferramenta que escaneia clusters Kubernetes em busca de possíveis problemas e configurações incorretas, gerando um relatório de “saúde”.
- kube-score: Realiza uma análise estática de seus manifestos YAML e fornece sugestões de melhoria e boas práticas.
Comandos de Contexto e Configuração
Gerenciar a configuração do kubectl é fundamental, especialmente ao trabalhar com múltiplos clusters.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Listar todos os contextos de cluster configurados
kubectl config get-contexts
# Trocar para um contexto diferente
kubectl config use-context <NOME_DO_CONTEXTO>
# Exibir a configuração atual do kubectl
kubectl config view
# Exibir informações sobre o cluster (endpoints do master e serviços)
kubectl cluster-info
# Verificar a versão do cliente e do servidor Kubernetes
kubectl version