Pular para o conteúdo principal
Este guia ajuda você a diagnosticar e resolver os problemas mais comuns ao implantar ou operar o Midaz no Kubernetes com Helm. Cada seção cobre um sintoma específico, os comandos de diagnóstico para investigá-lo e os passos para resolvê-lo.

Comandos gerais de diagnóstico


Comece com estes comandos para obter uma visão geral do estado do seu deployment antes de mergulhar em problemas específicos.

Pods travados em Pending


Sintoma: Um ou mais pods permanecem no estado Pending e nunca iniciam. Comandos de diagnóstico:
Causas comuns e soluções:
  • CPU ou memória insuficiente nos nós — O scheduler não consegue encontrar um nó que satisfaça as solicitações de recursos do pod. Verifique a seção Events do kubectl describe pod. Procure mensagens como Insufficient cpu ou Insufficient memory. Reduza resources.requests no seu values.yaml ou adicione mais nós ao cluster.
  • PersistentVolumeClaim não vinculado — Um PVC exigido por uma dependência (PostgreSQL, MongoDB, Valkey) está travado em Pending.
    Verifique se existe um StorageClass disponível e configurado como padrão. Consulte PVC travado em Pending abaixo.
  • Node selector ou affinity sem correspondência — O pod exige um label de nó específico que nenhum nó do cluster possui. Verifique seu values.yaml para configurações de nodeSelector ou affinity e confirme que os nós têm os labels esperados:

ImagePullBackOff


Sintoma: Os pods mostram o status ImagePullBackOff ou ErrImagePull. Comandos de diagnóstico:
Causas comuns e soluções:
  • Tag de imagem incorreta — A tag especificada não existe no registry. Verifique o valor de image.tag no seu values.yaml comparando com a tabela de compatibilidade de versões.
  • Registry privado requer autenticação — O cluster não consegue baixar as imagens sem credenciais. Crie um secret de pull de imagem e referencie-o no seu values.yaml:
  • imagePullSecrets não configurado — O secret existe mas não está referenciado na configuração do componente. Certifique-se de que imagePullSecrets esteja configurado em todos os componentes afetados.

CrashLoopBackOff


Sintoma: Os pods iniciam e caem imediatamente, reiniciando repetidamente. Comandos de diagnóstico:
Use --previous para ver os logs da última instância do container que caiu, e não do que está reiniciando atualmente.
Causas comuns e soluções:
  • Variáveis de ambiente incorretas ou ausentes — Uma chave de configuração necessária está ausente ou tem um valor incorreto. Verifique os logs buscando mensagens como missing env var, invalid config ou similares. Revise a seção configmap do seu values.yaml.
  • Secret do Kubernetes ausente — O pod referencia um secret que não existe.
    Se o secret não existe, crie-o manualmente ou execute novamente a instalação do Helm.
  • Credenciais de banco de dados incorretas — O serviço não consegue autenticar com PostgreSQL, MongoDB ou Redis. Verifique os logs buscando authentication failed, connection refused ou ECONNREFUSED. Confirme a seção secrets no seu values.yaml e verifique se as credenciais correspondem às usadas ao provisionar os bancos de dados.
  • OOMKilled — O container excedeu seu limite de memória e foi eliminado pelo kernel.
    Procure OOMKilled na seção Last State. Aumente resources.limits.memory no seu values.yaml. Consulte Evicção de pod / OOMKilled abaixo.

Timeout no Helm install


Sintoma: helm install ou helm upgrade falha com erro de timeout antes de o release atingir o estado deployed. Comandos de diagnóstico:
Causas comuns e soluções:
  • Download de imagens lento — Imagens grandes em uma conexão lenta podem ultrapassar o timeout padrão. Aumente o timeout:
  • Init containers falhando — Um init container (por exemplo, o job de bootstrap do banco de dados) está travado ou reiniciando. Verifique os logs do init container:
  • Readiness probes falhando — O pod está rodando mas não passa na verificação de readiness, então o Helm espera indefinidamente. Descreva o pod e verifique as seções Conditions e Events. Pode ser necessário aumentar initialDelaySeconds nas configurações do readiness probe, ou investigar por que o serviço não está saudável na inicialização.

Serviços inacessíveis


Sintoma: As APIs do Midaz não são acessíveis de fora do cluster, ou os serviços não conseguem se comunicar internamente. Comandos de diagnóstico:
Causas comuns e soluções:
  • Configuração incorreta do Ingress — O recurso Ingress existe mas o controller não está processando. Verifique se ingress.className corresponde à classe do seu ingress controller instalado:
    Também verifique se o pod do ingress controller está rodando:
  • DNS não aponta para o load balancer — O hostname no seu Ingress não resolve para o IP externo do controller. Obtenha o IP externo e compare com seu registro DNS:
  • Configuração TLS incorreta — Um secret TLS ausente ou expirado faz o ingress falhar silenciosamente. Verifique se o secret existe e não está expirado:
    Se usar cert-manager, verifique o status do recurso Certificate:

PVC travado em Pending


Sintoma: Um PersistentVolumeClaim permanece em estado Pending e o pod dependente não consegue iniciar. Comandos de diagnóstico:
Causas comuns e soluções:
  • Sem StorageClass padrão — Nenhum StorageClass está marcado como padrão no cluster.
    Se nenhum mostrar (default), crie um StorageClass ou configure um explicitamente no seu values.yaml para a dependência afetada (por exemplo, postgresql.primary.persistence.storageClass).
  • Modo de acesso incorreto — O StorageClass não suporta o modo de acesso solicitado pelo PVC (por exemplo, ReadWriteMany em um driver de armazenamento que só suporta ReadWriteOnce). Verifique a seção Events do kubectl describe pvc. Ajuste accessModes no seu values.yaml para corresponder ao que seu StorageClass suporta.
  • Modo de binding do volume é WaitForFirstConsumer — Alguns StorageClasses usam binding adiado. O PVC ficará em Pending até que um pod que o consume seja agendado. Este é um comportamento normal; aguarde o pod ser agendado.

Evicção de pod / OOMKilled


Sintoma: Os pods são repetidamente evictados ou mostram OOMKilled em seu último estado. Comandos de diagnóstico:
Causas comuns e soluções:
  • Limites de memória muito baixos — O resources.limits.memory do container está abaixo do que o serviço realmente precisa sob carga. Verifique o uso atual de memória com kubectl top pods e então aumente o limite no seu values.yaml:
  • Nó sob pressão de memória — O próprio nó está sob pressão e o kubelet está evictando pods de menor prioridade. Verifique as condições do nó:
    Considere adicionar nós ou habilitar o cluster autoscaler. Você também pode definir PriorityClass nos pods do Midaz para protegê-los de evicção.

Definições do RabbitMQ não carregadas


Sintoma: Os serviços do Midaz iniciam mas as transações falham, filas estão ausentes, ou mensagens não estão sendo processadas. Os logs podem mostrar erros de conexão AMQP ou exchanges/filas ausentes. Comandos de diagnóstico:
Causas comuns e soluções:
  • RabbitMQ externo sem load_definitions.json — Ao usar uma instância externa de RabbitMQ, as filas, exchanges e bindings necessários não estão presentes. Habilite o job de bootstrap no seu values.yaml:
    Ou aplique as definições manualmente:
    O arquivo load_definitions.json está em charts/midaz/files/rabbitmq/load_definitions.json no repositório do Helm.
  • Job de bootstrap falhou silenciosamente — O job foi executado mas encontrou um erro (credenciais erradas, timeout de rede, porta incorreta).
    Verifique as credenciais de rabbitmqAdminLogin e confirme que a porta de gerenciamento (padrão 15672) é acessível de dentro do cluster.

Recursos relacionados