Gaps do EKS revelados pela primeira migração de app real

O que aconteceu

A migração do gateway (primeiro app com imagem privada, PVC e node selector) do DOKS para o EKS compartilhado quebrou em cadeia: pod Pending (selector), PVC nunca bindava, imagem não puxava, prometheus estourava timeout e o cluster bateu no teto de nós. Cada apply falho ainda deixava o deployment tainted, disparando um bug de identity do provider kubernetes que quebrava o plan seguinte.

Causa raiz

O DOKS entregava implicitamente coisas que o EKS não tem por padrão — e o marketing (primeiro inquilino) não usava nenhuma delas, então nada foi percebido na migração do cluster:

  • Sem EBS CSI driver: em EKS ≥1.23 nenhum PVC binda sem o addon (aws-ebs-csi-driver + IRSA).
  • Sem storage class default: o gp2 do EKS não é default; PVC sem storageClassName fica pendente pra sempre (no DOKS o do-block-storage era default).
  • Sem integração de registry privado: o DOKS puxava DOCR nativamente; no EKS, imagem privada exige credencial — resolvido migrando a imagem para ECR na conta shared (o node role já tem AmazonEC2ContainerRegistryReadOnly, pull nativo).
  • Node selectors da era DOKS (workload=gateway) apontavam para pools que não existem mais.
  • Capacidade: max_nodes do pool é teto do Cluster Autoscaler; workloads novos (prometheus 50Gi) estouram o teto silenciosamente (max node group size reached).
  • Bug de identity: deployment que falha rollout fica tainted com identity nula; o plan seguinte quebra com “Unexpected Identity Change” (provider kubernetes + TF ≥1.12). Cirurgia: kubectl delete + terraform state rm e deixar o apply recriar.

Correção

aws-ebs-csi-driver com IRSA + storage class gp3 default no módulo kubernetes; ECR compartilhado (src/shared/registry) com imagem copiada one-off do DOCR; selectors removidos; max_nodes 3→5; ignore_changes no desired_size (o CA é o dono).

Como evitar

  • Ao migrar um app pro EKS, checar a lista: PVC (CSI + storage class), imagem privada (ECR), node selectors/taints, capacidade do pool, e recursos tainted no state.
  • Novos apps: imagem no ECR compartilhado (registry_repositories em src/shared/registry), sem pull secret.
  • Veja também [[infra_eks_node_group_nao_escala_sozinho]] e [[infra_amazon_mq_rabbitmq_cluster]].