Skip to main content
Este guia ajuda você a diagnosticar e resolver problemas comuns ao fazer deploy ou operar o Midaz no Kubernetes com Helm.

Comandos gerais de diagnóstico


Comece por estes comandos para ter um panorama do estado do seu deploy.

Pods travados em Pending


Sintoma: um ou mais pods continuam no estado Pending e nunca iniciam. Comandos de diagnóstico:
Causas e soluções comuns:
  • CPU ou memória insuficientes nos nós. O scheduler não encontra um nó que satisfaça os requests 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 sem bind. Um PVC exigido por uma dependência (PostgreSQL, MongoDB, Valkey) está travado em Pending.
    Verifique se existe uma StorageClass disponível e se ela é a padrão. Consulte PVC travado em Pending abaixo.
  • Seletor de nó ou afinidade incompatível. O pod exige um label de nó específico que nenhum nó do cluster tem. Verifique as configurações nodeSelector ou affinity no seu values.yaml e confirme que seus nós têm os labels esperados:

ImagePullBackOff


Sintoma: os pods mostram o status ImagePullBackOff ou ErrImagePull. Comandos de diagnóstico:
Causas e soluções comuns:
  • Tag de imagem errada. A tag indicada não existe no registry. Inspecione o pacote do chart selecionado e compare ledger.image.tag com os metadados e os values dele. A página de versões do chart do Midaz registra o padrão auditado.
  • O registry privado exige autenticação. O cluster não consegue baixar imagens sem credenciais. Crie um secret de pull de imagem e referencie-o no seu values.yaml:
  • imagePullSecrets ausente. O secret existe, mas a configuração do componente não faz referência a ele. Defina imagePullSecrets em todos os componentes afetados.

CrashLoopBackOff


Sintoma: os pods iniciam e caem na hora, reiniciando repetidamente. Comandos de diagnóstico:
Use --previous para ver os logs da última instância do container que caiu, não da que está reiniciando agora.
Causas e soluções comuns:
  • Variáveis de ambiente erradas ou ausentes. Uma chave de configuração obrigatória está ausente ou tem um valor incorreto. Procure nos logs mensagens como missing env var, invalid config ou parecidas. Revise a seção configmap do seu values.yaml.
  • Secret do Kubernetes ausente. O pod faz referência a um secret que não existe.
    Se o secret não existe, crie-o manualmente ou rode a instalação do Helm de novo.
  • Credenciais de banco de dados erradas. O serviço não consegue se autenticar no PostgreSQL, no MongoDB ou no Redis. Procure nos logs authentication failed ou connection refused. Verifique a seção secrets do seu values.yaml e confirme que as credenciais são as mesmas que você usou ao provisionar os bancos de dados.
  • OOMKilled. O container passou do limite de memória e o kernel o matou.
    Procure OOMKilled na seção Last State. Aumente resources.limits.memory no seu values.yaml. Consulte Eviction de pod / OOMKilled abaixo.

Timeout na instalação com Helm


Sintoma: o helm install ou o helm upgrade falha com erro de timeout antes de o release chegar ao estado deployed. Comandos de diagnóstico:
Causas e soluções comuns:
  • Download lento de imagens. Imagens grandes em uma conexão lenta podem passar do timeout padrão. Aumente o timeout:
  • Init containers falhando. Um init container (por exemplo, o job de bootstrap do banco de dados) trava ou faz novas tentativas. Consulte os logs do init container:
  • Probes de readiness falhando. O pod roda, mas não passa na verificação de readiness, então o Helm espera indefinidamente. Descreva o pod e olhe as seções Conditions e Events. Você pode precisar aumentar initialDelaySeconds nas configurações da probe de readiness ou investigar por que o serviço não fica saudável ao iniciar.

Serviços inacessíveis


Sintoma: as APIs do Midaz ficam inacessíveis de fora do cluster, ou os serviços não conseguem se comunicar internamente. Comandos de diagnóstico:
Causas e soluções comuns:
  • Ingress mal configurado. O recurso Ingress existe, mas o controller não o assume. Verifique se ingress.className corresponde à classe do ingress controller que você instalou:
    Verifique também se o próprio pod do ingress controller está rodando:
  • DNS não aponta para o load balancer. O hostname do seu Ingress não resolve para o IP externo do controller. Pegue o IP externo e compare com o seu registro DNS:
  • TLS mal configurado. Um secret TLS ausente ou expirado faz o ingress falhar em silêncio. Verifique se o secret existe e se não expirou:
    Se você usa o cert-manager, verifique o status do recurso Certificate:

PVC travado em Pending


Sintoma: um PersistentVolumeClaim continua no estado Pending e o pod dependente não consegue iniciar. Comandos de diagnóstico:
Causas e soluções comuns:
  • Sem StorageClass padrão. O cluster não tem uma StorageClass padrão.
    Se nenhuma mostrar (default), crie uma StorageClass ou defina uma explicitamente no seu values.yaml para a dependência afetada (por exemplo, postgresql.primary.persistence.storageClass).
  • Modo de acesso errado. A StorageClass não aceita o modo de acesso pedido pelo PVC (por exemplo, ReadWriteMany em um driver de armazenamento que aceita apenas ReadWriteOnce). Verifique a seção Events do kubectl describe pvc. Ajuste accessModes no seu values.yaml para corresponder ao que sua StorageClass aceita.
  • O modo de binding do volume é WaitForFirstConsumer. Algumas StorageClasses usam binding tardio. O PVC fica em Pending até um pod que o consome ser agendado. Esse é o comportamento normal. Espere o pod ser agendado.

Eviction de pod / OOMKilled


Sintoma: os pods sofrem eviction repetidamente ou mostram OOMKilled no último estado. Comandos de diagnóstico:
Causas e soluções comuns:
  • Limites de memória baixos demais. O resources.limits.memory do container fica abaixo do que o serviço precisa sob carga. Revise o uso atual de memória com kubectl top pods e aumente o limite no seu values.yaml: Os padrões do chart são requests: 256Mi / 1500m e limits: 512Mi / 2000m. Seu override substitui esses valores, então trate os padrões como a base de dimensionamento. Defina o limite de memória acima do padrão quando o container sofrer OOMKilled:
  • Nó sob pressão de memória. O próprio nó está sob pressão e o kubelet faz eviction dos pods de prioridade menor. Verifique as conditions do nó:
    Considere adicionar nós ou habilitar o cluster autoscaler. Você também pode definir PriorityClass nos pods do Midaz para protegê-los da eviction.

Definições do RabbitMQ não carregadas


Sintoma: os serviços do Midaz iniciam, mas as transações falham, as filas não existem ou as mensagens ficam sem processamento. Os logs podem mostrar erros de conexão AMQP ou exchanges/filas ausentes. Comandos de diagnóstico:
Os nomes dos Jobs de bootstrap são <release>-bootstrap-postgres, <release>-bootstrap-mongodb e <release>-bootstrap-rabbitmq. Eles definem ttlSecondsAfterFinished: 300, então se excluem cinco minutos depois de terminar. Colete os logs deles logo, ou o comando retorna NotFound.
Causas e soluções comuns:
  • RabbitMQ externo sem load_definitions.json. Quando você usa uma instância externa de RabbitMQ, as filas, os exchanges e os 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 fica em charts/midaz/files/rabbitmq/load_definitions.json no repositório Helm.
  • O job de bootstrap falhou em silêncio. O job rodou, mas encontrou um erro (credenciais erradas, timeout de rede, porta errada).
    Verifique as credenciais rabbitmqAdminLogin e se a porta de gerenciamento (padrão 15672) é alcançável de dentro do cluster.

Recursos relacionados