Graviton no EKS: arquitetura mista, imagens multi-arch e migração gradual
Quer trocar parte dos nós do seu cluster AWS EKS por instâncias AWS Graviton? Neste artigo, você vai ver o que precisa ser compatível, como criar imagens multi-arch no AWS ECR, como usar Graviton no EKS com o Karpenter numa arquitetura mista e como migrar workloads x86 aos poucos, sem a armadilha de subir um pod x86 num nó Arm.
No post sobre Karpenter no AWS EKS , vimos que o Karpenter escolhe o tipo de instância a cada provisionamento. Isso abre uma oportunidade: trocar parte dos nós x86 por instâncias com processadores AWS Graviton, baseados em Arm. Neste post, você vai ver como adotar Graviton no EKS sem quebrar nada: o que precisa ser compatível, como criar imagens multi-arch, como montar uma arquitetura mista e como migrar aos poucos.
Um post da série "Otimização de custos com AWS EKS".
Por que considerar o AWS Graviton
O AWS Graviton é a família de processadores Arm projetada pela AWS para instâncias AWS EC2 . Segundo as páginas oficiais do Graviton:
- As instâncias Graviton custam até 20% menos que instâncias x86 comparáveis;
- O Graviton oferece até 40% melhor preço-desempenho para vários tipos de workload, como microsserviços, bancos de dados e analytics;
- As instâncias Graviton usam até 60% menos energia que instâncias EC2 comparáveis, para o mesmo desempenho.
💰 Preços de referência: outubro de 2026. Os percentuais acima são os divulgados pela AWS nessa data, comparam instâncias equivalentes e variam por workload. Antes de estimar a economia, compare os preços atuais das famílias Graviton e x86 na página de preços do AWS EC2 e teste com o seu workload.
Para workloads em containers, no entanto, a troca costuma ser mais simples do que parece. A aplicação já está empacotada, a orquestração é a mesma e o Kubernetes já sabe escolher nós por arquitetura. O trabalho principal está nas imagens.
O que precisa ser compatível
Antes de mover qualquer pod para um nó Arm, portanto, confirme três coisas:
- As imagens das suas aplicações precisam existir para
linux/arm64. Linguagens interpretadas e com runtime, como Python, Node.js e Java, costumam exigir pouco ou nenhum ajuste no código. Já linguagens compiladas, como Go e Rust, precisam ser recompiladas para Arm, o que em geral é simples. - As dependências nativas (bibliotecas em C, drivers, agentes de terceiros) também precisam de versão Arm.
- Os componentes do cluster, como DaemonSets de observabilidade, segurança e rede. A página de add-ons do EKS não traz uma tabela de compatibilidade com Arm, então valide cada add-on e cada ferramenta de terceiros.
O guia oficial aws-graviton-getting-started reúne orientações por linguagem, containers e ferramentas, e é o melhor ponto de partida para o levantamento.
Imagens multi-arch: uma tag, duas arquiteturas
Uma imagem multi-arch é, na prática, uma lista de imagens (manifest list ou image index) com uma variante por arquitetura. Quando o nó baixa a imagem, o runtime escolhe automaticamente a variante da sua arquitetura. Assim, o mesmo manifesto do Kubernetes roda em nós x86 e Arm.

Construindo com Docker Buildx
O Docker Buildx constrói as duas variantes e envia a lista de uma vez. Em seguida, o
imagetools inspect confere as arquiteturas publicadas na tag:1
2
3
4
5
6
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t 111122223333.dkr.ecr.us-east-1.amazonaws.com/minha-app:1.0 \
--push .
docker buildx imagetools inspect 111122223333.dkr.ecr.us-east-1.amazonaws.com/minha-app:1.0O AWS ECR aceita essas listas de imagens. A documentação também mostra como montá-las manualmente com
docker manifest create, a partir de imagens já enviadas.Builds nativos em vez de emulação
Por padrão, o Buildx pode construir a variante Arm por emulação, mas isso costuma ser lento. A alternativa é construir cada variante numa máquina da própria arquitetura. O AWS CodeBuild oferece ambientes Arm para isso. Um blog da AWS mostra o padrão completo com GitHub Actions : cada arquitetura é construída num runner nativo gerenciado pelo CodeBuild e, no fim, um passo junta as duas variantes numa única tag no ECR.
Graviton no EKS com o Karpenter: arquitetura mista
Com o Karpenter, adotar Graviton no EKS não exige node groups separados por arquitetura. A arquitetura é só mais um requisito do NodePool, usando o rótulo
kubernetes.io/arch, como descreve a documentação de scheduling do Karpenter .A armadilha: imagem só x86 num nó Arm
Se o NodePool aceita
amd64 e arm64, o Karpenter pode criar um nó Arm para um pod cuja imagem só existe para x86. O resultado é um container que não inicia, com erro de formato de executável. Há duas formas de evitar o problema:- Imagens multi-arch para todos os workloads que podem rodar em qualquer nó;
- Restrição explícita nos workloads que ainda são só x86, com
nodeSelectorou node affinity emkubernetes.io/arch: amd64. A documentação do Kubernetes sobre atribuição de pods a nós explica as duas opções.
Migração gradual com um NodePool dedicado
Há duas formas de o Karpenter provisionar nós Graviton, e o mesmo blog da AWS sobre migração de x86 para Graviton com Karpenter apresenta as duas:
- Ampliar o NodePool que você já tem, incluindo
arm64ao lado deamd64na lista de arquiteturas. É o caminho mais simples e, para um cluster em regime permanente, um padrão perfeitamente normal: o Karpenter passa a escolher entre x86 e Arm a cada provisionamento, pelo melhor custo. Nesse modelo, você controla o que vai para Arm pelas restrições dos próprios pods (nodeSelectorou node affinity emkubernetes.io/arch). - Criar um NodePool dedicado ao Graviton, protegido por um taint. Essa opção dá mais controle sobre o ritmo do rollout: com
limits,weighte o taint, é você quem decide quando e quanto cada workload migra, em vez de deixar essa decisão por conta do Karpenter.
Um ponto importante: o NodePool separado não é um requisito da arquitetura mista. As duas formas rodam x86 e Arm no mesmo cluster e dependem igualmente de imagens multi-arch — o NodePool dedicado é uma estratégia de migração, não uma exigência. Como aqui o objetivo é justamente migrar aos poucos e com controle, é o padrão que vamos usar neste artigo: só os workloads que você liberar explicitamente vão para os nós Arm.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: graviton
spec:
weight: 10 # prioridade sobre o NodePool x86
template:
spec:
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
taints:
- key: graviton-migration
effect: NoSchedule # só entra quem tolera o taint
requirements:
- key: kubernetes.io/arch
operator: In
values: ["arm64"]
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"]
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"]
limits:
cpu: "500" # limita o tamanho da migração
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 1mE, no workload que já tem imagem multi-arch e foi testado:
1
2
3
4
5
6
7
8
spec:
template:
spec:
tolerations:
- key: graviton-migration
operator: Exists
nodeSelector:
kubernetes.io/arch: arm64 # força o nó Arm durante a migraçãoPor fim, depois que a maior parte dos workloads estiver validada, você pode remover o taint e deixar o Karpenter escolher entre x86 e Arm livremente.
E com managed node groups?
Por outro lado, se você usa managed node groups em vez do Karpenter, crie um grupo separado com instâncias Graviton e a variante Arm da AMI otimizada do EKS . A lógica de taint, toleration e
nodeSelector é a mesma.Caso real: Localiza
Um blog da AWS Brasil , publicado em novembro de 2025, mostra como a Localiza migrou as aplicações de infraestrutura dos seus clusters EKS para Graviton. A migração seguiu três fases:
- Validação de compatibilidade: levantamento das aplicações, das imagens Arm disponíveis e das dependências. A maior parte das ferramentas já suportava Arm, incluindo Prometheus, Datadog, ArgoCD, FluxCD, AWS Load Balancer Controller, Ingress Nginx e Istio.
- Testes de desempenho: no cenário analisado, o tempo de resposta melhorou cerca de 30%.
- Implementação gradual, começando pelos clusters menos críticos, com NodePools e EC2NodeClasses do Karpenter para nós Arm e labels e tolerations para controlar o agendamento.
Como resultado, segundo o blog, o custo das aplicações de infraestrutura caiu 58% nos ambientes não produtivos e 45% em produção. No gateway de APIs, que usa a plataforma Sensedia, a redução foi de 66% e 31%, respectivamente.
💰 Preços de referência: outubro de 2026. As reduções da Localiza foram relatadas no blog da AWS Brasil de novembro de 2025 e dependem dos workloads e dos preços da época. Para estimar o efeito no seu ambiente, compare os preços atuais na página de preços do AWS EC2 .
Boas práticas de Graviton no EKS
- Comece pelo levantamento. Liste imagens, dependências nativas e DaemonSets antes de criar o primeiro nó Arm.
- Padronize imagens multi-arch no pipeline. Uma tag para as duas arquiteturas evita manifestos diferentes por ambiente.
- Prefira builds nativos em vez de emulação, para ganhar velocidade no CI.
- Proteja os workloads só x86 com
nodeSelectorou affinity enquanto a migração não termina. - Migre por fases, começando por ambientes e serviços menos críticos, com um NodePool dedicado e limitado.
- Teste desempenho e custo com dados reais. O ganho varia por workload; meça antes de mover a produção.
- Combine Graviton com Spot. Mais arquiteturas no NodePool significam mais tipos de instância disponíveis, assunto do próximo post.
Por onde começar
Para adotar Graviton no EKS:
- Escolha um serviço sem dependências nativas e com imagem fácil de reconstruir.
- Gere a imagem multi-arch com Buildx ou com builds nativos no CodeBuild.
- Crie o NodePool Graviton com taint e libere esse serviço com toleration e
nodeSelector. - Compare desempenho e custo com a versão x86 por alguns dias, usando a visibilidade de custos por workload.
- Expanda aos poucos e, no fim, remova o taint.
Checklist do post
- As imagens dos workloads candidatos existem para
linux/arm64 - As dependências nativas e os DaemonSets foram validados em Arm
- O pipeline publica imagens multi-arch numa única tag no ECR
- Os workloads só x86 têm
nodeSelectorou affinity emamd64 - Existe um NodePool Graviton com taint e
limitspara a migração - Desempenho e custo foram comparados antes de mover a produção
- Há um plano para remover o taint ao fim da migração
Perguntas frequentes
Preciso mudar o código da aplicação para rodar no Graviton?
Na maioria dos casos, não. Linguagens como Python, Node.js e Java costumam rodar sem mudanças, e Go e Rust precisam apenas ser recompiladas para Arm. O que costuma exigir atenção são dependências nativas e imagens de terceiros.
O que é uma imagem multi-arch?
É uma lista de imagens com uma variante por arquitetura, publicada numa única tag. O runtime do nó escolhe a variante certa automaticamente.
Posso misturar nós x86 e Graviton no mesmo cluster EKS?
Sim. Com o Karpenter, basta permitir as duas arquiteturas no NodePool. O cuidado é garantir que workloads com imagem só x86 fiquem restritos a nós
amd64.Quanto dá para economizar com Graviton?
A AWS divulga que as instâncias Graviton custam até 20% menos que instâncias x86 comparáveis e oferecem até 40% melhor preço-desempenho, em valores de outubro de 2026. O resultado real depende do workload, por isso vale testar.
💰 Preços de referência: outubro de 2026. Esses percentuais podem ter mudado. Confira os preços atuais na página de preços do AWS EC2 .
Os add-ons do EKS funcionam em Arm?
A documentação de add-ons do EKS não traz uma tabela de compatibilidade com Arm. Por isso, confirme cada add-on e cada ferramenta de terceiros antes de mover os nós.
Próximo post
Com o Graviton, você muda o tipo de capacidade. A próxima alavanca é o modelo de compra. No próximo post da série, vamos combinar Spot, Savings Plans e On-Demand no EKS e ver como lidar com interrupções de Spot sem afetar as aplicações.
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article