Google AX: o Kubernetes dos agentes de IA? Parte 2 — Tasks, estado, Workspaces e execução real sobre o Agent Substrate

Google AX: o Kubernetes dos agentes de IA? Parte 2 — Tasks, estado, Workspaces e execução real sobre o Agent Substrate

Na primeira parte desta série, montei um laboratório local com Kubernetes, Google AX e Agent Substrate para entender uma pergunta aparentemente simples:

Google AX pode ser considerado uma espécie de Kubernetes para agentes de IA?

A resposta começou a aparecer logo no primeiro laboratório.

AX não substitui Kubernetes. Ele adiciona uma camada declarativa voltada a workloads agentic, enquanto o Agent Substrate introduz abstrações como Actors, Workers, snapshots e mecanismos de suspend/resume sobre a infraestrutura do Kubernetes.

Nesta segunda parte, fui além da instalação.

O objetivo foi colocar essas abstrações sob carga experimental:

  • criar Tasks reais;
  • observar a relação entre Task, Actor, Worker e Pod;
  • suspender e retomar execução;
  • preservar estado;
  • migrar Actors entre Workers;
  • testar Gateway e egress;
  • utilizar Workspaces persistentes;
  • conectar um LLM local;
  • e, finalmente, executar um workload de IA utilizando dados reais.

O resultado revelou não apenas capacidades interessantes, mas também algumas diferenças importantes entre o modelo declarativo da plataforma e o comportamento observado na implementação utilizada no laboratório.

Baseline do laboratório

Para tornar os resultados reproduzíveis, trabalhei com versões fixadas.

AX:

e6211f84a9e30dd309304167b8f1d51cbdaf8dab

Agent Substrate:

672533541dbfcd29084e4de2475267088bda3651

Kubernetes:

v1.37.0

O laboratório foi executado sobre Kind, com Workers utilizando gVisor.

Essa informação é particularmente importante porque AX e Agent Substrate ainda estão em rápida evolução. O próprio projeto AX alerta que seus conceitos, protocolos e especificações continuam sendo refinados e podem sofrer breaking changes antes de uma versão estável.

Portanto, sempre que eu falar sobre um comportamento observado neste artigo, estou me referindo a essa baseline específica.

De Task para Actor

A documentação do AX define Task como a menor unidade isolada de execução.

Uma Task declara elementos como:

  • imagem;
  • comando;
  • recursos;
  • variáveis de ambiente;
  • Workspaces;
  • configuração de rede.

AX transforma essa intenção declarativa em recursos executáveis sobre o Agent Substrate.

No laboratório, a sequência ficou clara:

AX Task
   ↓
ActorTemplate
   ↓
Actor
   ↓
Worker
   ↓
Kubernetes Pod

Essa relação é importante porque um Actor não é simplesmente um nome alternativo para um Pod.

O Agent Substrate mantém Actors como unidades lógicas de execução que podem ser suspensas e posteriormente retomadas em Workers diferentes. Os Workers, por sua vez, são implementados sobre Pods Kubernetes.

E foi exatamente isso que conseguimos observar.

Actor ≠ Pod

Em experimentos anteriores, criei um Actor com estado em memória e em filesystem.

Depois de múltiplos ciclos de suspend/resume, o mesmo Actor apareceu executando em diferentes Workers.

A identidade lógica permaneceu constante.

O Pod que o executava, não.

Isso levou a uma das conclusões centrais desta série:

No Agent Substrate, o Actor possui identidade, lifecycle e estado independentes do Worker Pod que momentaneamente o executa.

Esse é um afastamento importante da forma como normalmente pensamos sobre workloads no Kubernetes.

No Kubernetes tradicional, o Pod costuma ser a unidade central de execução.

No Agent Substrate, o Worker Pod funciona mais como uma capacidade computacional disponível para receber Actors.

Podemos pensar conceitualmente assim:

Actor = identidade lógica + lifecycle + estado

Worker = capacidade de execução disponível

Pod = infraestrutura Kubernetes que hospeda o Worker

Snapshot DATA e persistência do Workspace

O experimento seguinte investigou o estado persistente.

Criamos dois arquivos:

/workspace/lab2-persistence.txt
/tmp/lab2-ephemeral.txt

Depois suspendemos a Task.

O AX gerou um snapshot com:

SNAPSHOT_CONTENT_SCOPE_DATA

Após o resume, a Task voltou para outro Worker.

O resultado foi:

/workspace/lab2-persistence.txt    preservado
/tmp/lab2-ephemeral.txt           ausente

O comportamento mostrou uma distinção importante entre storage durável associado ao Actor e filesystem temporário da execução.

Mais tarde repetimos o mesmo experimento com um repositório Git completo.

O Actor estava inicialmente no Worker:

10.244.0.25

Depois do suspend/resume:

10.244.0.26

Mesmo assim:

Git HEAD:
7358c4e49fe8d45c04418aeefdf4ef46c90bb207

foi preservado.

Também criamos um arquivo com checksum SHA-256 antes da suspensão.

Depois do restore:

.lab2-workspace-persistence.txt: OK

Portanto:

Actor
   ↓
DATA snapshot
   ↓
suspend
   ↓
Worker liberado
   ↓
resume
   ↓
outro Worker
   ↓
Workspace restaurado

Esse foi um dos resultados mais fortes do laboratório.

Golden snapshot + estado específico do Actor

O ActorTemplate possuía também um golden snapshot FULL.

Ao retomar um Actor com snapshot DATA, o Substrate pôde combinar:

Golden snapshot
        +
Actor DATA

Conceitualmente:

Golden
  └── estado base da execução

Actor DATA
  └── estado durável específico daquela instância

Isso permitiu restaurar o ambiente de execução e, simultaneamente, recuperar o Workspace específico do Actor.

A arquitetura abre possibilidades interessantes para workloads agentic que passam longos períodos ociosos.

Em vez de manter cada agente permanentemente ativo em um Pod, o sistema pode preservar seu estado e reativá-lo quando necessário.

Essa é justamente uma das ideias centrais do Agent Substrate: multiplexar um conjunto potencialmente muito maior de Actors sobre um conjunto menor de Workers.

Gateway: intenção declarativa não é necessariamente enforcement

Outro experimento envolveu Gateway.

Declaramos uma allowlist permitindo apenas:

example.com:443

AX reconciliou corretamente a configuração e criou a EgressPolicy correspondente.

O tráfego também passou pelo dataplane autenticado do Agent Substrate.

Conseguimos observar a identidade do ator sendo utilizada no egress.

Porém, os testes mostraram que destinos fora da allowlist continuavam acessíveis.

Além disso, na baseline utilizada, o campo de porta presente na declaração AX não era propagado integralmente para a política resultante.

A conclusão precisa ser cuidadosa:

Na baseline utilizada, Gateway representou intenção declarativa de egress e participou do dataplane autenticado, mas não entregou enforcement de destino e porta equivalente ao que a API declarativa sugeria.

Esse é um exemplo importante de engenharia de plataforma:

API declarativa
       ≠
estado reconciliado
       ≠
enforcement efetivo

Essas três camadas precisam ser testadas separadamente.

O problema mais interessante: Workspace Git e readiness

O experimento com Workspace provavelmente revelou o achado arquitetural mais interessante do Lab 02.

A documentação atual descreve Workspace como uma abstração capaz de materializar repositórios Git e outras dependências antes de liberar a Task para execução.

Declaramos:

kind: Workspace

spec:
  git:
    - repo: https://github.com/gomesrocha/br-financial-ai.git
      branch: main

Esperávamos:

Actor inicia
   ↓
Git clone/fetch
   ↓
Workspace pronto
   ↓
readyz
   ↓
Task executa

Mas o que aconteceu foi diferente.

O Git falhou repetidamente com:

GnuTLS, handshake failed:
The TLS connection was non-properly terminated.

Inicialmente isso parecia um problema comum de TLS.

Não era.

Ao investigar o código da baseline do Agent Substrate, encontramos a sequência real:

preparar identidade/certificado
        ↓
configurar redirect de rede
        ↓
iniciar workload
        ↓
runner prepara Workspace
        ↓
aguardar /readyz
        ↓
ativar egress

O problema fica evidente:

Workspace Git precisa de rede
        ↓
readiness depende do Workspace
        ↓
egress depende do readiness

Ou, resumindo:

Workspace
   ↓
readyz
   ↓
egress
   ↓
Workspace

Um ciclo de bootstrap.

Antes da ativação do egress, o tráfego já era redirecionado para o túnel local, mas a ativação ainda não havia ocorrido.

A conexão era encerrada localmente.

Do ponto de vista do Git, isso aparecia como uma conexão TLS encerrada incorretamente.

Depois que o Actor finalmente chegava ao estado Ready, o mesmo:

git fetch

Executado manualmente, funcionava normalmente. A partir daí formulamos uma regra arquitetural simples:

Readiness pode depender de egress. Portanto, egress não pode depender do readiness.

WorkspaceReady=True, mas Workspace incompleto

Havia ainda outro problema.

Mesmo depois de falharem as tentativas de Git, o runner tratava aquela falha como não fatal.

Resultado:

WorkspaceReady=True
Ready=True
TaskRunning

mesmo sem o repositório estar materializado corretamente.

A command da Task também havia falhado.

Mesmo assim, a Task continuava aparecendo como Running.

Isso nos levou a outra distinção:

Task Running
     ≠
command executada com sucesso

WorkspaceReady
     ≠
Workspace semanticamente válido

E apareceu algo ainda mais sutil.

O ActorTemplate conseguiu produzir um golden snapshot daquele ambiente.

Ou seja:

snapshot tecnicamente válido
        ≠
estado semanticamente correto

Esse tipo de diferença é particularmente relevante em arquiteturas de agentes, pois checkpoints e snapshots podem preservar perfeitamente um estado já incorreto.

Corrigindo o Workspace depois do readiness

Para isolar o problema, mantivemos o mesmo Actor e materializamos o repositório somente depois que ele estava Ready.

Funcionou imediatamente.

O commit utilizado foi:

7358c4e49fe8d45c04418aeefdf4ef46c90bb207

Depois criamos evidências dentro do próprio Workspace, suspendemos a Task e produzimos um novo snapshot DATA.

Ao retomar:

Worker anterior: 10.244.0.25
Worker novo:     10.244.0.26

E mesmo assim:

HEAD preservado       ✅
arquivo preservado    ✅
SHA-256 preservado    ✅

Portanto, havia duas conclusões diferentes:

Materialização Git declarativa no bootstrap
❌ falhou nessa baseline

Persistência do Workspace depois de materializado
✅ funcionou

É importante não misturar as duas.

Um workload real de IA

Depois de validar Task, Actor, Workspace, snapshots e rede, faltava uma coisa.

Executar algo realmente útil.

Usei um projeto real de estudo:

br-financial-ai

O Actor leu o README.md diretamente do Workspace persistente e enviou um trecho de 6.000 caracteres para um servidor Ollama local utilizando:

host.docker.internal:11434

O caminho foi aproximadamente:

AX Task
   ↓
Actor
   ↓
gVisor
   ↓
atunnel
   ↓
egress autenticado
   ↓
Ollama
   ↓
LLM

A resposta foi então persistida novamente no /workspace.

Ou seja, não estávamos mais executando apenas um teste sintético.

Tínhamos:

dados reais
   ↓
Workspace persistente
   ↓
Actor isolado
   ↓
modelo de IA
   ↓
resultado persistido

Infraestrutura funcionando não significa IA funcionando bem

O primeiro modelo utilizado foi:

llama3.2:latest

Ele concluiu a inferência.

Tempo observado:

~23,96 segundos

A infraestrutura funcionou perfeitamente.

Porém, havia uma regra extremamente simples no prompt:

Liste exatamente três componentes.

O modelo retornou cinco.

Além disso, introduziu, na resposta, uma afirmação sobre “aprendizado de máquina” que não constava dos 6.000 caracteres fornecidos como contexto.

Portanto:

infraestrutura       PASS
inferência           PASS
persistência         PASS
instruction-following FAIL
grounding probe       FAIL

Essa talvez seja uma das lições mais importantes deste laboratório:

Sucesso operacional de um agente não implica sucesso semântico.

Llama 3.2 3B versus Llama 3.1 8B

Para verificar se o problema estava relacionado apenas à infraestrutura, mantivemos praticamente tudo constante:

  • mesmo Actor;
  • mesmo Workspace;
  • mesmo commit;
  • mesmos 6.000 caracteres;
  • mesmo prompt;
  • mesma temperatura;
  • mesmo limite de geração;
  • mesmo Ollama.

Mudamos o modelo.

Segundo teste:

llama3.1:latest

Resultado:

Llama 3.2 3B

tempo: ~23,96 s
componentes pedidos: 3
componentes retornados: 5
contrato: FAIL
grounding probe: FAIL

Contra:

Llama 3.1 8B

tempo: ~85,25 s
componentes pedidos: 3
componentes retornados: 3
contrato: PASS
grounding probe: PASS

Isso não demonstra que modelos maiores sejam sempre melhores.

Também não é um benchmark de desempenho entre Llama 3.1 e 3.2. Os estados de carregamento e as características dos modelos não eram idênticos. Mas demonstra algo arquiteturalmente relevante:

Mantendo a infraestrutura constante, mudar o modelo mudou materialmente o comportamento da aplicação.

Portanto, em sistemas agentic:

modelo

Não é apenas uma dependência externa.

Ele é parte da arquitetura, a escolha afeta:

  • latência;
  • consumo de recursos;
  • instruction following;
  • grounding;
  • confiabilidade;
  • custo;
  • experiência do usuário.

Então AX é o Kubernetes dos agentes?

Depois destes dois laboratórios, minha resposta está ficando mais precisa.

Não considero correto afirmar que AX substitui Kubernetes.

Ele depende de Kubernetes.

Uma representação melhor seria:

Aplicação / Agente
        ↓
Framework agentic
        ↓
AX
        ↓
Agent Substrate
        ↓
Kubernetes
        ↓
Infraestrutura

Kubernetes continua cuidando da infraestrutura computacional e dos Workers.

Agent Substrate introduz abstrações específicas para workloads stateful e frequentemente ociosos.

AX adiciona uma experiência declarativa de alto nível, com primitivas como Tasks, Workspaces, Gateways e Models.

A analogia “Kubernetes dos agentes” é, portanto, útil para suscitar a discussão.

Mas tecnicamente eu prefiro outra formulação:

AX parece caminhar para uma camada declarativa de orquestração de workloads agentic construída sobre uma infraestrutura Kubernetes especializada pelo Agent Substrate.

Essa diferença é importante.

O que o Lab 02 demonstrou

Ao final dos experimentos:

Task orchestration             ✅
Actor lifecycle                ✅
suspend/resume                 ✅
DATA snapshots                 ✅
Workspace persistence          ✅
Worker migration               ✅
gVisor isolation               ✅
authenticated egress           ✅
Ollama local                   ✅
workload real de IA            ✅
avaliação determinística       ✅

Mas também encontramos:

Gateway allowlist enforcement       ⚠️
Git Workspace bootstrap             ⚠️
WorkspaceReady sem materialização   ⚠️
TaskRunning sem command bem-sucedida⚠️
golden snapshot de estado degradado ⚠️
SSH interativo para workload longo  ⚠️
qualidade dependente do modelo      ⚠️

E talvez essa seja justamente a parte mais interessante de estudar tecnologias ainda jovens.

A documentação nos mostra a abstração desejada.

O laboratório mostra o comportamento real.

E arquitetura acontece justamente no espaço entre os dois.

Próximo passo

Na terceira parte quero avançar para uma primitive que deliberadamente deixei de fora deste laboratório:

Model.

Até aqui, o Ollama funcionou como um serviço externo consumido pela Task.

No próximo laboratório, a ideia é trabalhar com a integração nativa do AX e um modelo Gemini, investigando:

  • Model como recurso declarativo;
  • secrets;
  • parâmetros de inferência;
  • consumo do modelo por Tasks;
  • lifecycle do agente;
  • chamadas a ferramentas;
  • estado persistente;
  • falhas e retries;
  • e o que muda quando deixamos de executar apenas uma inferência e passamos a executar um agente propriamente dito.

A documentação atual descreve Model como uma configuração nomeada contendo provider, identificador do modelo, parâmetros e referência ao Secret do Kubernetes.

Será o próximo passo da pergunta que iniciou esta série:

Até onde AX realmente consegue funcionar como uma plataforma operacional para agentes autônomos?

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