Google AX: o Kubernetes dos agentes de IA? Parte 1 — Montando o primeiro laboratório no Ubuntu

Google AX: o Kubernetes dos agentes de IA? Parte 1 — Montando o primeiro laboratório no Ubuntu

O ecossistema de agentes de IA está evoluindo rapidamente. À medida que os agentes deixam de executar apenas tarefas curtas e passam a trabalhar por minutos, horas ou até dias, surge um problema que vai além do modelo de linguagem utilizado:

como executar, isolar, suspender, recuperar e escalar milhares de agentes de maneira eficiente?

Foi tentando entender melhor esse problema que comecei a estudar o Google AX.

O próprio projeto descreve o AX como um orquestrador declarativo para workloads agentic, executado sobre o Agent Substrate. A proposta lembra deliberadamente alguns conceitos do Kubernetes: declarar recursos, aplicar manifests, observar estado e deixar uma camada de controle reconciliar o ambiente.

Isso naturalmente levanta uma pergunta:

O Google AX seria uma espécie de “Kubernetes dos agentes de IA”?

Ainda é cedo para responder.

Por isso resolvi não começar pela teoria, mas por um laboratório.

Nesta primeira parte, o objetivo não é instalar todo o AX. Antes disso, quero entender a camada sobre a qual ele executa: Kubernetes + Agent Substrate.

E o primeiro experimento trouxe resultados bastante interessantes.


A arquitetura que estamos estudando

Uma forma simplificada de enxergar a arquitetura é:

Aplicação / Sistema Agentic
          │
          ▼
         AX
  Task / Workspace
  Gateway / Model
          │
          ▼
   Agent Substrate
 Actor / Worker / Snapshot
          │
          ▼
      Kubernetes
   Pod / Node / Network
          │
          ▼
    Infraestrutura

O Google AX adiciona abstrações voltadas especificamente para workloads agentic.

Atualmente, o projeto trabalha principalmente com quatro recursos declarativos:

  • Task — workload agentic que será executado;
  • Workspace — código, ferramentas, skills e demais recursos necessários à execução;
  • Gateway — regras de comunicação e acesso externo;
  • Model — configuração do modelo utilizado pelo ambiente.

O projeto também possui uma CLI deliberadamente semelhante ao kubectl, incluindo operações como apply, get, describe, watch, suspend e resume.

Mas existe uma camada importante entre o AX e o Kubernetes:

Agent Substrate.

E foi exatamente essa camada que resolvi estudar primeiro.


Preparando o laboratório

O ambiente utilizado neste experimento foi:

Ubuntu 26.04
Docker Desktop
16 CPUs disponíveis para Docker
~12 GiB de RAM para Docker

Go 1.27.1

Kind
Kubernetes 1.37.0

Google AX
commit e6211f8

Agent Substrate
commit 67253354

Fixar os commits foi proposital.

AX e Agent Substrate estão evoluindo rapidamente, e o próprio repositório do AX alerta que conceitos, protocolos e especificações ainda podem sofrer mudanças incompatíveis.

Para um experimento reprodutível, portanto, é importante registrar exatamente qual versão está sendo utilizada.

Também criei um KUBECONFIG isolado:

export KUBECONFIG=/mnt/dados/labs/ax-lab/kubeconfig

Isso evita que comandos do laboratório sejam executados acidentalmente contra outros clusters Kubernetes configurados na máquina.


Criando o Kubernetes com Kind

O próprio Agent Substrate fornece scripts para criação do ambiente Kind.

Executei:

cd /mnt/dados/labs/ax-lab/substrate
source ../env.sh

hack/create-kind-cluster.sh

O resultado foi um cluster:

kind-ax-lab

executando:

Kubernetes 1.37.0

com as APIs necessárias ao Substrate, incluindo:

ClusterTrustBundle
PodCertificateRequest

Como o host não disponibilizava /dev/kvm para o Docker, o suporte a microVM ficou desabilitado.

Isso não impediu o laboratório porque o Agent Substrate também suporta gVisor, que foi o sandbox utilizado neste primeiro experimento.


Instalando o Agent Substrate

Com o Kubernetes funcionando, o passo seguinte foi instalar somente a infraestrutura do Substrate:

hack/install-ate-kind.sh --deploy-ate-system

A instalação criou uma arquitetura consideravelmente maior do que um simples controller Kubernetes.

Entre os componentes ficaram:

ate-api-server
ate-controller
atelet
atenet-router
atenet-egress

PostgreSQL
RustFS

OpenTelemetry Collector
Prometheus
Jaeger

Pod Certificate Controller

Todos os principais componentes terminaram o rollout corretamente.

Também foram criados CRDs como:

csidriverconfigs.ate.dev
sandboxconfigs.ate.dev
workerpools.ate.dev

Um detalhe arquitetural chamou minha atenção imediatamente.

Não existem CRDs Kubernetes chamados:

Actor
Worker
ActorTemplate

Esses objetos pertencem ao control plane do Agent Substrate.

O WorkerPool, por outro lado, é um recurso Kubernetes.

Essa distinção começa a mostrar onde ocorre a separação entre a infraestrutura física de execução e o workload lógico agentic.


Criando os Workers

Para o primeiro teste utilizei o Counter Demo existente no próprio projeto:

hack/install-ate-kind.sh --deploy-demo-counter

O demo criou um WorkerPool com três réplicas:

DESIRED   REPLICAS   READY
3         3          3

e três Pods Kubernetes:

counter-...-2l9nl
counter-...-bwff8
counter-...-zdnnd

Do ponto de vista do Agent Substrate, cada Pod tornou-se um Worker:

Worker A   ACTORS 0/1
Worker B   ACTORS 0/1
Worker C   ACTORS 0/1

Nesse momento ainda não existia nenhum Actor de aplicação.

Isso já mostra uma diferença importante:

a capacidade de execução física pode existir antes do Actor.


Criando o primeiro Actor

Então criei:

kubectl ate create actor lab-counter-1 \
  -a ate-demo-counter \
  --template counter

O resultado foi:

lab-counter-1
ACTOR_STATE_SUSPENDED
WORKER POD <none>

Esse resultado é extremamente interessante.

Criar um Actor não criou um novo Pod.

Os três Pods já existentes continuaram exatamente como estavam.

O Actor surgiu como uma entidade lógica, inicialmente suspensa e sem capacidade física atribuída.


Ativação sob demanda

O acesso ao Actor ocorre através do atenet-router.

Criei um port-forward:

kubectl port-forward \
  -n ate-system \
  svc/atenet-router \
  8000:80

E então fiz a primeira requisição:

curl -X POST \
  -H "ate-target-actor: ate-demo-counter/lab-counter-1" \
  http://localhost:8000/

O Agent Substrate detectou que o Actor estava suspenso, escolheu um Worker disponível, restaurou o Actor e encaminhou a requisição.

Depois dessa operação:

lab-counter-1
ACTOR_STATE_RUNNING

e um Worker passou de:

ACTORS 0/1

para:

ACTORS 1/1
CPU    1/1
MEMORY 512Mi/1Gi

Nenhum Pod Kubernetes adicional foi criado.


Preservando estado

O Counter Demo possui dois contadores.

Um fica na memória do processo.

O outro fica em um arquivo.

As três primeiras requisições retornaram:

memory: 1   file: 1
memory: 2   file: 2
memory: 3   file: 3

Então suspendi o Actor:

kubectl ate suspend actor lab-counter-1 \
  -a ate-demo-counter

O resultado foi:

ACTOR_STATE_SUSPENDED
WORKER POD <none>

Ao mesmo tempo, os três Workers ficaram novamente disponíveis:

0/1
0/1
0/1

mas os três Pods Kubernetes continuaram executando normalmente.

O template utilizado no experimento estava configurado com:

SNAPSHOT_CONTENT_SCOPE_FULL

para onCommit e onPause.

Ou seja, o snapshot deveria preservar não apenas os arquivos, mas também o estado de execução.


O resultado mais interessante

Depois de suspender o Actor, fiz uma nova requisição HTTP.

O Agent Substrate restaurou o mesmo Actor.

Mas desta vez em outro Worker Pod.

E a resposta foi:

preserved memory count: 4
preserved file counter: 4

Depois de novos ciclos de suspend/resume, o mesmo Actor chegou a ser executado nos três Worker Pods diferentes existentes no laboratório.

Mesmo mudando de Pod:

Actor ID permaneceu igual
estado em memória permaneceu
estado em arquivo permaneceu

Em um dos últimos ciclos medi também o tempo percebido pelo cliente durante a ativação de um Actor suspenso:

HTTP:               200
time_starttransfer:  0.255009 s
time_total:          0.255087 s

A resposta retornou:

preserved memory count: 6
preserved file counter: 6

É importante não tratar esses aproximadamente 255 ms como um benchmark do Agent Substrate.

Foi uma única medição no meu ambiente local e incluiu todo o caminho:

curl
 → port-forward
 → atenet / Envoy
 → localização do Actor
 → restore
 → aplicação
 → resposta HTTP

Mas como prova funcional, o resultado é bastante interessante.


Actor não é Pod

Talvez a principal conclusão deste primeiro laboratório seja essa.

No Kubernetes normalmente pensamos em:

Application
   ↓
Pod

No Agent Substrate encontramos outra camada:

Actor
   ↓
atribuição dinâmica
   ↓
Worker
   ↓
Pod

Durante meu experimento, o mesmo:

lab-counter-1

Executou sequencialmente em Workers diferentes.

Quando suspenso:

Actor → Snapshot

e o Worker voltou a ficar disponível.

Quando chegou uma nova requisição:

Snapshot
   ↓
Actor
   ↓
Worker disponível

A identidade e o estado pertenciam ao Actor.

O Pod fornecia capacidade de execução.

Essa distinção é particularmente interessante para agentes de IA, que frequentemente passam grandes períodos aguardando:

  • interação humana;
  • resposta de ferramentas;
  • eventos externos;
  • novos prompts;
  • aprovação;
  • execução agendada.

Manter um Pod dedicado para cada agente durante todo esse tempo pode ser pouco eficiente.

O modelo Actor/Worker permite pensar em outra relação entre a quantidade de agentes registrados e a capacidade física simultaneamente disponível.


E onde entra o Google AX?

Esse é exatamente o próximo passo do laboratório.

Até aqui testamos:

Kubernetes
      ↓
Agent Substrate
      ↓
Actor

Agora quero adicionar:

AX
      ↓
Task
Workspace
Gateway
Model
      ↓
Agent Substrate
      ↓
Actor
      ↓
Worker
      ↓
Pod

O próprio projeto AX apresenta-se como uma camada declarativa de orquestração de workloads agentic sobre o Agent Substrate.

Então a pergunta continua aberta:

Google AX é realmente uma espécie de Kubernetes para agentes de IA?

O primeiro laboratório ainda não responde a isso.

Mas já revelou algo importante:

Por baixo do AX existe um runtime que trata agentes como entidades stateful cujo lifecycle pode ser desacoplado dos Pods Kubernetes que os executam.

Na próxima parte quero instalar efetivamente o AX e investigar o que acontece quando passamos de:

Actor

para:

Task + Workspace + Gateway + Model

A partir daí poderemos começar a responder a pergunta com arquitetura e experimentação — e não apenas por analogia.


Referências

Google AX — repositório oficial.

Google Cloud — Introducing Agent Executor, Google’s distributed Agent Runtime.

Agent Substrate — documentação e Counter Demo.

Este artigo faz parte de uma série prática sobre arquitetura para sistemas agentic, Agent Substrate, Google AX e workloads de IA stateful.

Prof. Dr. Fabio Gomes Rocha Professor do Programa de Pós-Graduação em Ciências da Computação da UFS Head of Software Arquitecture and Machine Learning - SafeLabs

Publicar comentário