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
gp2do EKS não é default; PVC semstorageClassNamefica pendente pra sempre (no DOKS odo-block-storageera 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_nodesdo 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 rme 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_repositoriesemsrc/shared/registry), sem pull secret. - Veja também [[infra_eks_node_group_nao_escala_sozinho]] e [[infra_amazon_mq_rabbitmq_cluster]].