Desafio 8: Troubleshooting - Drift, Sync Failure e Health Degraded

Diagnosticar e resolver três cenários reais de falha no ArgoCD EKS Capabilities: drift manual no cluster, sync failure por permissão insuficiente, e aplicação com health degraded.

O ArgoCD detecta e corrige automaticamente desvios entre o estado desejado (Git) e o estado real (cluster). Mas quando algo falha, saber onde olhar é a diferença entre resolver em 5 minutos ou passar horas no escuro.

No EKS Capabilities, algumas ferramentas de debug do self-managed não estão disponíveis - você não tem acesso direto aos logs do ArgoCD controller, não pode editar argocd-cm, e o sync timeout é fixo em 120 segundos. O debug é feito via UI do EKS Console, kubectl no cluster alvo, e os eventos do Kubernetes.

Referência: Comparing EKS Capability for Argo CD to self-managed Argo CD  - lista completa de features não disponíveis no managed capability.

Os três cenários abaixo são independentes. Tente resolver cada um antes de abrir a solução.


Situação: Uma aplicação está Synced e Healthy. Um desenvolvedor faz uma mudança manual direta no cluster (kubectl edit deployment). O que acontece e como reverter?

Dica: O ArgoCD EKS Capability faz polling a cada 6 minutos por padrão. Se você configurou webhook no desafio anterior, a detecção é imediata.

O que acontece: O ArgoCD detecta o drift no próximo ciclo de polling e muda a aplicação para OutOfSync.

Como ver o drift na UI:

  • Application > App Diff - mostra exatamente o que mudou no cluster vs Git
  • Resources com ícone de alerta indicam divergência

Reverter o drift:

Se selfHeal: true estiver no syncPolicy, o ArgoCD reverte automaticamente. Se não:

# Forçar sync para reverter ao estado do Git
argocd app sync minha-app --force

Prevenir drift em produção:

syncPolicy:
  automated:
    prune: true
    selfHeal: true

Situação: Você cria uma Application que tenta criar um ClusterRole. O sync falha com erro de permissão. O AppProject está configurado com clusterResourceWhitelist vazio.

Dica: A mensagem de erro exata aparece na UI do ArgoCD ao expandir o recurso com falha em Sync Status.

Diagnóstico:

# Ver eventos de sync
kubectl get events -n argocd --sort-by='.lastTimestamp'

# Ver detalhes da application
kubectl describe application minha-app -n argocd

Causa raiz: clusterResourceWhitelist: [] bloqueia recursos cluster-scoped (ClusterRole, ClusterRoleBinding, Namespace, etc.).

Correção no AppProject:

spec:
  clusterResourceWhitelist:
  - group: "rbac.authorization.k8s.io"
    kind: "ClusterRole"
  - group: "rbac.authorization.k8s.io"
    kind: "ClusterRoleBinding"
kubectl apply -f project-corrigido.yaml
argocd app sync minha-app

Situação: Uma Application está Synced mas Degraded. O deployment foi aplicado mas os pods não sobem. Como diagnosticar via ArgoCD e via kubectl?

Dica: Synced significa que o ArgoCD aplicou o manifesto com sucesso. Degraded significa que o Kubernetes não conseguiu subir os pods - são problemas diferentes.

Diagnóstico na UI do ArgoCD:

  • Application > clicar no recurso Deployment > aba Events
  • Pods com ImagePullBackOff, CrashLoopBackOff, Pending aparecem em vermelho

Diagnóstico via kubectl:

kubectl get pods -n meu-namespace
kubectl describe pod NOME_DO_POD -n meu-namespace
kubectl logs NOME_DO_POD -n meu-namespace --previous

Causas comuns:

StatusCausa provávelCorreção
ImagePullBackOffImagem não existe ou sem permissão no ECRCorrigir tag no Git ou adicionar permissão ECR na node role
CrashLoopBackOffAplicação crashando na inicializaçãoVer logs com --previous, corrigir config/env vars
PendingSem recursos no clusterEscalar node group ou ajustar requests/limits
OOMKilledLimite de memória atingidoAumentar resources.limits.memory no manifesto

Diferença importante no EKS Capabilities:

No self-managed você teria acesso direto aos logs do argocd-application-controller. No EKS Capabilities o debug é via:

  • UI do EKS Console
  • kubectl describe application e eventos do Kubernetes
  • CloudTrail para auditoria das chamadas de API do ArgoCD
  • Implementar health checks customizados para CRDs e recursos não-padrão
  • Integrar CloudTrail com CloudWatch para alertas em sync failures recorrentes
  • Explorar o desafio de Fleet Management para ver como troubleshooting escala em ambientes multi-cluster