☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta Containers. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Containers. Mostrar todas as mensagens

quinta-feira, 3 de setembro de 2026

Leonardo da Vinci Entra no CPD — O Dia em que o IBM Z Aprendeu Arm sem Esquecer COBOL

 

Bellacosa Mainframe e o ibm z aprendendo Arm o proximo passo nos cpds

☕ Um Café no Bellacosa Mainframe

Leonardo da Vinci Entra no CPD — O Dia em que o IBM Z Aprendeu Arm sem Esquecer COBOL

Ou: como um processador de 2 nm, onze núcleos, três alfabetos de máquina e vinte e dois milhões de desenvolvedores transformaram o mainframe numa oficina renascentista — sem ninguém recompilar a folha de pagamento numa tarde de sexta-feira

Imagine que Leonardo da Vinci, depois de desenhar máquinas voadoras, estudar o corpo humano, projetar pontes e encher cadernos com anotações escritas ao contrário, receba um crachá temporário para visitar um moderno CPD.

Ele atravessa a porta dupla, observa as luzes do IBM Z e pergunta:

— Qual é a função desta grande máquina negra?

O programador COBOL iniciante responde:

— Processar contas bancárias, cartões, seguros, folhas de pagamento, reservas, impostos e quase tudo que não pode dar errado.

Leonardo examina os cabos, aproxima o ouvido do gabinete e conclui:

— Então não é apenas uma máquina. É uma cidade fortificada feita de silício.

Em agosto de 2026, a IBM anunciou um projeto que pode abrir um novo portão nessa cidade: seu primeiro processador de mainframe com duas arquiteturas, preparado para executar nativamente instruções IBM Z e Arm. O futuro chip, destinado a gerações posteriores do IBM Z e LinuxONE, foi anunciado com tecnologia de 2 nanômetros, 11 núcleos acima de 5,7 GHz, aceleradores de inteligência artificial, uma DPU dedicada a I/O e uma grande estrutura de cache.

Mas o que significa colocar Arm no mainframe? COBOL passará a executar em celular? Um aplicativo Android poderá entrar no JES2? O z/OS será substituído? E onde entram x86-64, AArch64 e s390x nessa oficina?

Vamos abrir o capô sob a tutela imaginária de Leonardo da Vinci.



Prólogo — O computador não entende COBOL

Esta revelação costuma assustar o padawan: o processador não entende COBOL, Java, Python ou C.

O processador entende instruções de máquina.

Quando escrevemos:

COMPUTE TOTAL = PRECO * QUANTIDADE

o compilador examina a frase COBOL e produz uma sequência de instruções compatível com a arquitetura de destino. Em um IBM Z, o resultado contém instruções da arquitetura Z. O fonte é legível para humanos; o executável é preparado para o processador e para o ambiente operacional.

Leonardo talvez comparasse isso aos seus projetos. O desenho de uma ponte representa uma ideia. Para construí-la, porém, alguém precisa converter o desenho em medidas, cortes, encaixes e operações compatíveis com os materiais disponíveis.

O código-fonte é o desenho. O compilador é o mestre da oficina. O binário é a coleção de ordens entregues às ferramentas.


1. ISA: o alfabeto secreto do processador

ISA significa Instruction Set Architecture, ou arquitetura do conjunto de instruções. Ela define o contrato entre software e processador:

  • instruções reconhecidas;

  • registradores disponíveis;

  • maneiras de acessar memória;

  • operações matemáticas e lógicas;

  • desvios e chamadas;

  • tratamento de exceções;

  • operações atômicas;

  • estados privilegiados usados pelo sistema operacional.

Três arquiteturas importantes nesta conversa são:

ArquiteturaOnde aparece principalmenteNome visto em ferramentas
x86-64PCs e servidores Intel/AMDx86_64, amd64
AArch64Arm de 64 bits, celulares, Apple Silicon e cloudaarch64, arm64
IBM ZMainframes e LinuxONEs390x em Linux

Elas podem realizar tarefas equivalentes, mas codificam as ordens de maneiras diferentes. É como escrever a mesma receita em português, italiano e japonês: o bolo pode ser o mesmo, mas não se lê um texto japonês aplicando automaticamente as regras do italiano.

Um programa compilado para x86-64 não se transforma em AArch64 apenas porque foi copiado. Da mesma forma, uma imagem arm64 não roda nativamente numa máquina que compreenda somente s390x.

Curiosidade de oficina

AMD64 e x86-64 normalmente designam a mesma arquitetura básica. O nome AMD64 existe porque foi a AMD que criou a extensão de 64 bits do x86 que venceu no mercado; a Intel depois adotou uma implementação compatível, comercialmente chamada Intel 64.

O pequeno detalhe histórico rende um belo easter egg: durante anos muita gente associou “x86” automaticamente à Intel, mas a estrada de 64 bits usada pela maioria dos PCs foi traçada pela concorrente.



2. x86-64: o palácio construído sem demolir as alas antigas

A linhagem x86 começou com o Intel 8086, lançado em 1978, e atravessou diversas gerações. Sua grande força foi preservar compatibilidade.

8086 → 80286 → 80386 → x86 de 32 bits → x86-64

É um palácio ampliado durante décadas. Novas alas foram construídas, corredores foram modernizados, elevadores foram instalados, mas várias portas antigas continuam ali porque alguém ainda pode precisar atravessá-las.

Essa herança aparece nos registradores:

RAX = 64 bits
EAX = 32 bits inferiores
 AX = 16 bits inferiores
 AL = 8 bits inferiores
 AH = outros 8 bits históricos

Também aparece nas instruções de comprimento variável. Uma instrução x86-64 pode ocupar quantidades diferentes de bytes. O processador precisa decodificar onde cada instrução começa, quais prefixos possui, quais operandos utiliza e onde termina.

Historicamente, x86 é classificada como CISC — Complex Instruction Set Computer. Algumas instruções podem realizar operações relativamente complexas ou trabalhar diretamente com valores na memória.

Mas não confunda complexidade da ISA com incompetência. Processadores AMD e Intel modernos são extraordinárias obras de engenharia. Internamente, eles frequentemente decompõem instruções x86 complexas em micro-operações menores, executam-nas fora de ordem, especulam desvios e reorganizam resultados mantendo a aparência exigida pelo programa.

Leonardo reconheceria a técnica: uma alavanca visível ao operador pode acionar uma engrenagem, que aciona três rodas, que movem seis peças. A interface externa parece simples; o mecanismo interno faz uma coreografia.



3. AArch64: uma nova oficina para os 64 bits

AArch64 é o estado de execução de 64 bits introduzido pela arquitetura Armv8-A. Também aparece como ARM64.

Ao contrário do x86-64, que estendeu uma longa linhagem, AArch64 foi desenhada como uma arquitetura de 64 bits mais regular. Suas instruções normalmente possuem 32 bits de comprimento, ou quatro bytes.

Ela oferece 31 registradores gerais visíveis, normalmente chamados X0 a X30. Para acessar os 32 bits inferiores, usa-se W0 a W30.

X0 = registrador de 64 bits
W0 = parte de 32 bits de X0

AArch64 segue a tradição RISC — Reduced Instruction Set Computer — e uma filosofia load/store. Operações aritméticas trabalham principalmente com registradores. Para manipular um valor guardado na memória, normalmente fazemos três movimentos conceituais:

  1. carregar o valor;

  2. executar a operação;

  3. gravar o resultado, se necessário.

Exemplo didático:

ldr x0, [x1]      // traz um valor da memória
add x0, x0, x2    // soma usando registradores
str x0, [x1]      // devolve o resultado à memória

Isso não quer dizer que Arm seja uma arquitetura “simples” ou “fraca”. Apple Silicon, AWS Graviton, Ampere e outros projetos demonstram que Arm pode alimentar computadores pessoais e servidores de alto desempenho.

RISC e CISC explicam estilos arquiteturais, não determinam sozinhos quem vence uma corrida. Frequência, cache, memória, processo de fabricação, unidades vetoriais, quantidade de núcleos, compilador e workload pesam enormemente.

Dica para o padawan

Nunca escreva numa apresentação que “Arm é mais rápido porque é RISC” ou “x86 é melhor porque possui instruções mais poderosas”. Isso seria como afirmar que COBOL sempre vence Java porque COMPUTE parece mais empresarial.

Peça o benchmark, conheça o workload e verifique o custo total.

4. A mesma aplicação, binários diferentes

Considere este pequeno programa em C:

int soma(int a, int b) {
    return a + b;
}

Um compilador para x86-64 poderia gerar, de forma simplificada:

mov eax, edi
add eax, esi
ret

Em AArch64, o mesmo fonte poderia resultar em:

add w0, w0, w1
ret

A finalidade é igual. Os registradores, instruções e bytes produzidos são diferentes.

Daí nasce uma regra essencial:

Fonte portátil não significa binário portátil.

Para portar uma aplicação, talvez baste recompilar. Porém, talvez o programa contenha assembler, bibliotecas fechadas, suposições sobre tamanho de dados, drivers particulares ou dependências não disponíveis. Nesses casos, a travessia torna-se mais trabalhosa.

Em COBOL conhecemos esse problema. Um fonte escrito seguindo padrões pode ser adaptado entre plataformas, mas um executável compilado para z/OS não é simplesmente copiado para IBM i, Windows ou Linux e executado como se nada tivesse acontecido.

5. ISA não é sistema operacional

Mesmo dois computadores que usem a mesma arquitetura podem não executar o mesmo binário.

Compare:

AArch64 + Linux
AArch64 + macOS
AArch64 + Windows

Todos podem usar processadores que entendem AArch64. Entretanto, os programas dependem também de:

  • formato do executável;

  • ABI, a interface binária da aplicação;

  • convenções de chamada;

  • bibliotecas;

  • carregador;

  • chamadas de sistema;

  • serviços do sistema operacional.

Portanto, um programa Linux Arm não se torna automaticamente um aplicativo macOS apenas porque ambos usam Arm.

Leonardo desenharia camadas concêntricas:

Aplicação
Bibliotecas e runtime
Sistema operacional
Virtualização e firmware
ISA
Microarquitetura e silício

O anúncio da IBM começa profundamente nas camadas inferiores, mas seu valor comercial dependerá de todas as camadas superiores.

6. Containers: o contêiner leva a casa, não leva o terreno

Existe um mito segundo o qual um container roda em qualquer lugar. Ele roda em qualquer ambiente compatível, o que é diferente.

Uma imagem OCI pode ser publicada para:

linux/amd64
linux/arm64
linux/s390x
linux/ppc64le

Um fornecedor pode manter o mesmo nome lógico, mas armazenar variantes com binários apropriados. O registry examina a arquitetura solicitada e entrega a imagem correta por meio de um índice ou manifesto multiarch.

O container empacota aplicação, bibliotecas e configuração, mas normalmente compartilha o kernel do host e continua dependendo da ISA. Ele leva os móveis e as paredes internas; não leva um planeta novo debaixo da casa.

Passo a passo para verificar uma imagem

  1. Consulte a documentação do fornecedor.

  2. Procure amd64, arm64 ou s390x nas plataformas suportadas.

  3. Examine o manifesto multiarch com uma ferramenta OCI ou Docker.

  4. Confirme que todas as dependências possuem a mesma arquitetura.

  5. Teste em ambiente controlado.

  6. Não confunda “iniciou” com “é oficialmente suportado”.

Essa última diferença evita muitos ABENDs administrativos. Uma aplicação pode funcionar no laboratório e ainda assim não possuir suporte do fabricante para produção.

7. Endianness: quando Leonardo escreve os bytes ao contrário

Leonardo ficou famoso por suas anotações espelhadas. Isso nos oferece uma analogia perfeita para endianness: a ordem em que os bytes de um número aparecem na memória.

Considere 0x12345678:

Big-endian:     12 34 56 78
Little-endian:  78 56 34 12

x86-64 é normalmente little-endian. Linux AArch64 também é normalmente little-endian. Linux s390x tradicionalmente trabalha em big-endian.

Ao trocar JSON, XML, mensagens MQ ou Protocol Buffers corretamente serializados, a camada de comunicação trata a representação. Ao compartilhar estruturas binárias brutas, o programador precisa ter cuidado.

Imagine gravar o tamanho de um pagamento em quatro bytes e o destinatário lê-los na ordem oposta. O valor de um cafezinho pode chegar ao sistema de liquidação vestido de aquisição corporativa.

Easter egg número 1

Se encontrar 0x4C454F perdido num exemplo hexadecimal, converta os bytes para ASCII. Leonardo deixou sua assinatura na oficina.

8. Emulação não é execução nativa

Quando um processador não entende a ISA de um programa, um tradutor pode intervir.

Binário x86-64
      ↓ tradução
Instruções AArch64
      ↓
Processador Arm

Rosetta 2 nos Macs Apple Silicon e mecanismos do Windows on Arm mostram que tradução pode oferecer excelente experiência. QEMU consegue emular diversas arquiteturas. Porém, existe uma camada adicional e nem toda instrução, extensão ou comportamento terá desempenho idêntico ao nativo.

Execução nativa ocorre quando o hardware compreende diretamente a ISA para a qual o binário foi produzido.

É exatamente por isso que o anúncio da IBM chama atenção: a empresa declara que não está colocando núcleos Arm separados nem oferecendo mera emulação. A proposta é integrar a ISA Arm aos próprios núcleos do futuro processador de mainframe.

9. O processador bilíngue da IBM

Segundo a IBM, cada núcleo poderá executar nativamente instruções IBM Z e Arm. Ambientes Linux Arm-native poderão operar simultaneamente com z/OS e Linux on IBM Z.

Isso não significa misturar instruções Arm dentro de um programa COBOL arbitrariamente. Tampouco significa copiar um APK para uma biblioteca de carga e executar:

//LEONARDO JOB CLASS=A,MSGCLASS=X
//STEP01   EXEC PGM=MONALISA
//STEPLIB  DD DSN=ANDROID.ARM64.LOAD,DISP=SHR

O JES2 provavelmente responderia com a serenidade de um monge e a crueldade de um auditor.

O cenário é de ambientes distintos sobre a mesma plataforma:

Processador dual-architecture
├── contexto IBM Z
│   ├── z/OS
│   └── Linux s390x
└── contexto Arm
    └── Linux AArch64

O hardware fala dois idiomas; sistemas operacionais e aplicações ainda ocupam seus ambientes apropriados.

10. O grande prêmio: levar o cálculo até os dados

Mainframes guardam dados críticos de bancos, seguradoras, governos, companhias aéreas e grandes varejistas. Hoje, um componente moderno frequentemente consulta esses dados atravessando redes, gateways e camadas de integração.

Aplicação externa → API → integração → CICS → Db2

Cada seta pode significar latência, criptografia, credenciais, filas, cópias, custo e um novo ponto de falha.

Se um serviço Arm-native puder operar dentro da mesma plataforma física, próximo ao CICS, IMS e Db2, torna-se possível mover parte do processamento até os dados em vez de exportar dados para todo processamento novo.

Exemplo: autorização de cartão

  1. CICS recebe a solicitação.

  2. COBOL valida conta, limite e regras consolidadas.

  3. Db2 fornece histórico relevante.

  4. Um serviço Arm-native executa uma biblioteca de análise comportamental.

  5. Um acelerador de IA calcula a probabilidade de fraude.

  6. O resultado volta à transação.

  7. RACF, criptografia e auditoria protegem e registram o processo.

COBOL não é substituído pela IA. O programa transacional ganha um conselheiro especializado.

O chip anunciado também inclui aceleração de inferência voltada a fraude durante transações e uma DPU dedicada a I/O. Isso combina com a tradição Z de não tratar movimentação de dados como tarefa secundária.

11. DPU: o mestre de logística da oficina

DPU significa Data Processing Unit. Ela pode descarregar tarefas relacionadas à movimentação e ao processamento de dados que, de outra forma, ocupariam os núcleos gerais.

Leonardo provavelmente desenharia a DPU como o encarregado do porto:

  • recebe cargas;

  • organiza filas;

  • movimenta contêineres;

  • controla rotas;

  • deixa o mestre artesão trabalhar na peça principal.

No mainframe, isso é quase uma tradição familiar. A plataforma sempre utilizou inteligência e componentes especializados para I/O, evitando que a CPU central carregue sozinha todos os baldes da cidade.

12. Frequência não é desempenho

O processador foi anunciado com mais de 5,7 GHz. O número impressiona, mas não pode ser usado sozinho para comparar máquinas.

Desempenho depende de:

  • instruções concluídas por ciclo;

  • previsão de desvios;

  • latência e tamanho dos caches;

  • largura de memória;

  • unidades vetoriais;

  • aceleração específica;

  • quantidade de núcleos;

  • sistema operacional;

  • compilador;

  • comportamento do workload.

Um motor girando mais depressa não necessariamente transporta mais carga. Precisamos conhecer torque, transmissão, peso e terreno.

No IBM Z importam também throughput sustentado, disponibilidade, isolamento, capacidade de recuperação e latência previsível. Ganhar uma corrida de dez segundos é diferente de processar milhões de transações diariamente sem derrubar a ponte.

13. O ecossistema Arm entra no castelo

A IBM aponta um universo superior a 22 milhões de desenvolvedores Arm. Esse é um dos argumentos estratégicos mais fortes.

Muitos projetos modernos são publicados primeiro para amd64 e arm64. Algumas bibliotecas, agentes, ferramentas de IA e imagens de containers não chegam a s390x, ou chegam posteriormente.

Ao executar Arm nativamente, o IBM Z pode reduzir a necessidade de portar cada componente antes de usá-lo. Isso poderá ampliar opções para:

  • containers;

  • microsserviços;

  • inferência de IA;

  • agentes de automação;

  • observabilidade;

  • segurança;

  • processamento de eventos;

  • ferramentas cloud-native.

Mas ampliar o mercado também amplia a cadeia de suprimentos. Uma imagem abandonada e repleta de vulnerabilidades não se torna segura apenas porque entrou num mainframe.

Serão indispensáveis:

  • SBOM;

  • assinatura de imagens;

  • verificação de procedência;

  • varredura de vulnerabilidades;

  • controle de privilégios;

  • política de atualização;

  • suporte do fornecedor;

  • observabilidade.

O RACF não asperge água benta sobre um container com senha admin123.

14. As perguntas que ainda não possuem resposta completa

O anúncio descreve uma direção tecnológica, não um manual de planejamento.

Ainda precisamos conhecer detalhes como:

  1. Uma LPAR será definida como Z ou Arm?

  2. PR/SM administrará os dois contextos de que maneira?

  3. z/VM ou KVM hospedarão guests Arm?

  4. Como HMC mostrará capacidade e consumo?

  5. Como serão dumps, traces e contadores de desempenho?

  6. OpenShift agendará pods s390x e arm64 no mesmo conjunto?

  7. Como funcionará compartilhamento de I/O e memória?

  8. Quais sistemas operacionais e versões serão suportados?

  9. Como será o licenciamento?

  10. Workloads Arm afetarão métricas tradicionais de software?

A TechChannel estimou disponibilidade em aproximadamente dois anos com base na cadência da IBM. Isso apontaria para algo por volta de 2028, mas não é uma data oficial de produto. A própria IBM classifica declarações futuras como objetivos sujeitos a alteração.

Dica de arquiteto

Separe sempre três colunas em suas anotações:

CategoriaExemplo
Confirmado2 nm, 11 núcleos, mais de 5,7 GHz e duas ISAs nativas
Objetivo declaradoLinux Arm-native ao lado de z/OS e Linux Z
Ainda não detalhadoLPAR, preços, licenciamento e versões suportadas

Essa disciplina impede que uma promessa de arquitetura seja apresentada ao cliente como feature disponível na próxima terça-feira.

15. Um roteiro de estudos para o programador COBOL

O iniciante não precisa abandonar COBOL e correr desesperadamente para assembler Arm. Pode avançar por etapas.

Etapa 1 — Entenda a pilha

Aprenda a distinguir:

fonte → compilador → objeto → linkedição → executável → sistema operacional → ISA

No mundo z/OS, relacione isso a compile, link-edit/binder, load module ou program object e execução via batch ou subsistema.

Etapa 2 — Reconheça arquiteturas

Memorize os três rótulos:

amd64  = x86-64
arm64  = AArch64
s390x  = IBM Z em Linux

Etapa 3 — Observe imagens multiarch

Escolha uma imagem conhecida, consulte seu manifesto e veja quais plataformas são publicadas. Perceba que o nome lógico pode esconder binários diferentes.

Etapa 4 — Aprenda integração

Estude:

  • APIs REST;

  • JSON;

  • MQ;

  • z/OS Connect;

  • CICS web services;

  • autenticação e autorização.

O futuro profissional valioso será a ponte entre o core e os serviços modernos.

Etapa 5 — Faça um laboratório mental

Desenhe uma aplicação COBOL que consulta Db2 e chama um serviço antifraude. Marque:

  • onde começa a transação;

  • quais dados saem;

  • qual identidade é usada;

  • qual timeout existe;

  • o que acontece se o serviço falhar;

  • como a operação será auditada.

Etapa 6 — Nunca esqueça o rollback

Se a análise Arm demorar ou ficar indisponível, a transação deve saber se recusa, aprova com limites ou encaminha para revisão. Modernização sem tratamento de falha é apenas uma demonstração com gravata.

16. O que isso representa para a carreira mainframe

O anúncio não reduz o valor do especialista Z; ele aumenta o território que esse profissional pode conectar.

As empresas precisarão de pessoas que compreendam simultaneamente:

COBOL + CICS + IMS + Db2 + RACF
                 ↕
Linux + Arm + containers + APIs + IA

O profissional raro não será necessariamente quem sabe decorar toda instrução de três arquiteturas. Será quem entende os contratos entre elas, reconhece riscos e desenha uma solução suportável.

O padawan COBOL deve aprender a conversar com desenvolvedores cloud sem desprezar o legado e sem aceitar que toda arquitetura nova seja automaticamente revolucionária.

Leonardo dominava pintura, anatomia, mecânica e hidráulica não porque confundia as disciplinas, mas porque sabia enxergar relações entre elas.

Esse é o modelo do novo arquiteto de mainframe.

17. Easter eggs da sala de máquinas

Alguns pequenos segredos para quem chegou até aqui:

  • Leonardo escrevia parte de suas notas de maneira espelhada; por isso ele foi escolhido como tutor da seção de endianness.

  • “A máquina voadora” simboliza tecnologias que podem ser tecnicamente brilhantes e ainda depender de materiais, operação e contexto para funcionar comercialmente.

  • O programa MONALISA no JCL não existe — ao menos até algum chimpanzé do Bellacosa Mainframe registrá-lo num PDS.

  • Se a futura plataforma receber um serviço chamado VITRUVIAN, verifique se ele escala proporcionalmente ou apenas posa dentro de um círculo.

  • O verdadeiro boss final não apareceu no silício: chama-se licenciamento.


Conclusão — O códice do mainframe bilíngue

x86-64, AArch64 e s390x são alfabetos de máquina diferentes. Um mesmo código-fonte pode ser compilado para mais de um deles, mas os binários produzidos não são intercambiáveis. Containers carregam aplicações e dependências, porém continuam presos à arquitetura e ao kernel compatível. Emulação traduz; execução nativa entrega as instruções diretamente ao hardware apropriado.

O projeto da IBM é histórico porque pretende colocar duas ISAs dentro dos próprios núcleos do futuro processador: IBM Z e Arm. Isso poderá permitir ambientes Linux AArch64 ao lado de z/OS e Linux s390x, aproximando software moderno dos dados e das transações centrais.

Não significa que z/OS executará qualquer aplicativo Arm, que COBOL será substituído ou que todas as dificuldades de integração desaparecerão. Sistemas operacionais, ABIs, bibliotecas, segurança, virtualização, endianness, suporte e licenciamento continuarão importando.

A grande mudança é outra:

Durante décadas, o software precisou aprender o idioma do mainframe. Agora o próprio mainframe está aprendendo um novo idioma sem esquecer aquele que protegeu sua história.

Leonardo fecha o caderno, observa o IBM Z e faz seu último desenho: de um lado, um programa COBOL sustentando as contas do banco; do outro, um serviço Arm trazendo IA e software cloud-native. Entre ambos, uma ponte feita de APIs, segurança, virtualização e disciplina operacional.

Antes de sair, ele escreve no quadro — desta vez da esquerda para a direita:

ISA NÃO É SISTEMA OPERACIONAL.
CONTAINER NÃO É EMULADOR.
FREQUÊNCIA NÃO É DESEMPENHO.
MODERNIZAÇÃO NÃO É APAGAR O PASSADO.

O programador iniciante pergunta:

— Mestre Leonardo, então qual é a verdadeira inovação?

Ele aponta para a máquina e responde:

— Não obrigar o passado e o futuro a disputarem a mesma cadeira. Construir uma mesa grande o suficiente para que ambos trabalhem juntos.

No fundo do CPD, alguém submete um job. O JES2 aceita. O serviço Arm responde. O Db2 confirma o COMMIT.

E, por uma vez, ninguém recebeu S0C7 por tentar interpretar os bytes ao contrário.


Fontes consultadas



terça-feira, 11 de agosto de 2026

Kubernetes para COBOLzeiros: o Guia do Mochileiro das Galáxias para quem saiu do JES2, encontrou um Pod e perguntou onde diabos colocaram o JCL

 

Bellacosa Mainframe apresenta kubernetes para coboleiros

☕ Um Café no Bellacosa Mainframe

Kubernetes para COBOLzeiros: o Guia do Mochileiro das Galáxias para quem saiu do JES2, encontrou um Pod e perguntou onde diabos colocaram o JCL

🚀 Pods, Deployments, Services, YAML, containers, RBAC, storage, GitOps e a estranha descoberta de que o mundo cloud-native passou décadas reinventando problemas que o velho operador do mainframe já conhecia — só que agora tudo tem nomes novos, logos simpáticos e pode desaparecer antes do café esfriar

Há uma frase impressa em letras grandes e amistosas na capa do Guia do Mochileiro das Galáxias:

NÃO ENTRE EM PÂNICO.

Se Douglas Adams tivesse vivido tempo suficiente para trabalhar com Kubernetes, provavelmente acrescentaria uma segunda:

E NÃO APAGUE O NAMESPACE prod.

Porque Kubernetes tem uma característica curiosa.

Quando você olha pela primeira vez, encontra palavras como:

Pod, Deployment, ReplicaSet, Service, Ingress, ConfigMap, Secret, StatefulSet, DaemonSet, Helm, Operator, CRD.

O COBOLzeiro veterano olha aquilo e pensa:

— Meu Deus. Inventaram outra computação.

Não inventaram.

Mudaram a arquitetura, mudaram a escala, mudaram a implementação, inventaram abstrações extremamente poderosas e deram nomes diferentes a problemas que, em muitos casos, nós já enfrentávamos quando o terminal ainda era verde.

Precisamos executar programas.

Precisamos saber onde executá-los.

Precisamos distribuir recursos.

Precisamos armazenar configurações.

Precisamos controlar acesso.

Precisamos monitorar aplicações.

Precisamos guardar dados.

Precisamos recuperar processos que morreram.

Precisamos instalar novas versões sem transformar terça-feira à noite numa reunião extraordinária com 27 pessoas.

E, acima de tudo:

precisamos impedir que alguma coisa quebrou às 02:47 da manhã sem ninguém saber por quê.

Então pegue sua toalha, seu café e talvez aquele manual de JCL que você insiste em manter na gaveta.

Hoje vamos viajar para Kubernetes.


1. Antes de Kubernetes havia... computadores

Vamos começar pelo começo.

Um programador COBOL iniciante conhece aproximadamente este universo:

Programa COBOL
      |
      v
Compilação
      |
      v
LOAD MODULE
      |
      v
JCL
      |
      v
JES
      |
      v
Execução

Naturalmente estou simplificando.

Mas existe uma ideia importante:

o programa precisa de um ambiente para executar.

Ele precisa de CPU, memória, arquivos, bibliotecas, configuração, permissões e recursos.

Isso nunca desapareceu.

No universo moderno surgiu outro problema.

Imagine uma aplicação desenvolvida em determinado ambiente:

Aplicação
+
bibliotecas
+
runtime
+
dependências
+
configuração

Na máquina do desenvolvedor funciona perfeitamente.

Vai para outro servidor:

ABEND GALÁCTICO

— Mas na minha máquina funciona!

Essa frase provavelmente causou mais sofrimento humano que Vogons lendo poesia.

Uma das respostas modernas para esse problema foram os containers.


2. Container: coloque a aplicação numa caixinha

De maneira bastante simplificada, um container empacota a aplicação e aquilo de que ela precisa para executar de forma consistente.

Pense:

+----------------------+
|      CONTAINER       |
|                      |
| aplicação            |
| runtime              |
| bibliotecas          |
| dependências         |
|                      |
+----------------------+

Isso melhora enormemente a portabilidade.

Mas imediatamente surge outro problema.

Você possui:

1 container

Tudo maravilhoso.

Depois:

10 containers

Administrável.

Depois:

100 containers

Interessante.

Depois:

3.000 containers

Alguém pergunta:

— Quem administra isso?

Silêncio na sala.

É nesse momento que Kubernetes entra pela porta.


3. Kubernetes não é simplesmente um “Docker grandão”

Essa comparação ajuda durante cinco minutos e depois começa a atrapalhar.

Kubernetes é uma plataforma para orquestração de workloads containerizadas.

A palavra mágica é:

ORQUESTRAÇÃO

Imagine uma orquestra com 200 músicos.

O maestro não toca simultaneamente todos os instrumentos.

Ele coordena o conjunto.

Kubernetes tenta responder perguntas como:

  • onde uma aplicação será executada?

  • quantas cópias dela devem existir?

  • o que fazer quando uma morre?

  • como encontrar essas cópias?

  • como distribuir tráfego?

  • como atualizar uma versão?

  • como fornecer configuração?

  • como controlar recursos?

  • como armazenar dados persistentes?

  • quem pode alterar o quê?

Isso já começa a parecer menos alienígena para alguém vindo de ambientes corporativos.


4. A ideia que muda tudo: estado desejado

Aqui está provavelmente o conceito mais importante de Kubernetes.

Você declara aquilo que deseja.

Por exemplo:

replicas: 3

Traduzindo para português de máquina do café:

“Senhor Kubernetes, eu gostaria que existissem três instâncias dessa aplicação.”

Ele observa:

DESEJADO = 3
ATUAL    = 3

Tudo certo.

Então uma delas morre:

DESEJADO = 3
ATUAL    = 2

Kubernetes percebe:

— Isso não está certo.

E tenta retornar para:

3

Esse processo é chamado, em essência, de reconciliação.

Podemos imaginar:

Estado desejado
      |
      v
Estado atual
      |
      v
São iguais?
  /       \
SIM       NÃO
 |         |
OK      corrigir
           |
           +------+
                  |
                  v
              observar
              novamente

Kubernetes é, em grande parte, uma enorme máquina dizendo:

“O universo não está como deveria estar. Vou tentar consertá-lo.”

É uma ambição que normalmente encontramos apenas em sistemas distribuídos, religiões e departamentos de arquitetura corporativa.


5. Control Plane: conheça o cérebro da criatura

Um cluster Kubernetes pode ser imaginado assim:

                 KUBERNETES CLUSTER
                        |
           +------------+------------+
           |                         |
     CONTROL PLANE              WORKER NODES
           |                         |
     API Server                    Pods
     Scheduler                     kubelet
     Controllers                   runtime
     etcd                          network

O Control Plane administra o estado do cluster.

E um dos personagens principais é:

kube-apiserver

Quando você executa:

kubectl get pods

não está indo de porta em porta perguntar aos containers:

— Boa tarde, senhor Pod, o senhor está vivo?

Você fala com a API do Kubernetes.

Conceitualmente:

VOCÊ
 |
kubectl
 |
 v
API SERVER
 |
 +-- autenticação
 +-- autorização
 +-- validação
 +-- recursos do cluster

Esse detalhe revela uma característica fundamental:

Kubernetes é profundamente API-driven.


6. etcd: o sujeito que sabe das coisas

O etcd é um armazenamento distribuído chave-valor usado pelo Kubernetes para guardar dados essenciais sobre o estado do cluster.

Imagine que alguém diga:

— Temos backup dos servidores.

Ótimo.

— E do etcd?

Silêncio.

Uma mosca passa.

O operador começa lentamente a beber o café.

Informações críticas do estado do cluster dependem dele. Portanto backup e recuperação do etcd são assuntos sérios.

Primeira regra da produção:

Backup que nunca teve restauração testada é uma crença religiosa.


7. Scheduler: o JES encontrou um primo distante

Você solicita uma workload.

Existem vários Nodes:

NODE-A
NODE-B
NODE-C
NODE-D

Onde ela será executada?

O Scheduler participa dessa decisão.

Ele considera recursos e restrições como:

CPU
memória
afinidade
anti-afinidade
taints
tolerations
restrições de placement

O COBOLzeiro começa a sorrir.

— Espere... alguém recebe uma carga de trabalho, olha recursos e decide onde executar?

Sim.

— Então é JES?

NÃO.

Guarde a toalha.

As tecnologias, arquiteturas e responsabilidades são diferentes.

Mas existe um parentesco conceitual extremamente útil para aprender.

O truque para um profissional experiente aprender tecnologia nova não é fingir que tudo é completamente novo.

É perguntar:

“Qual problema antigo essa abstração está tentando resolver de uma maneira nova?”


8. Worker Node: onde a marmota realmente trabalha

O Control Plane coordena.

Os Worker Nodes executam as workloads.

Dentro deles encontramos componentes como o kubelet, runtime de containers e elementos relacionados a networking.

Podemos imaginar:

WORKER NODE
 |
 +-- kubelet
 |
 +-- runtime
 |
 +-- POD
 |    |
 |    +-- container
 |
 +-- POD
      |
      +-- container

E aqui encontramos talvez a palavra mais famosa do Kubernetes.


9. POD — não é ervilha espacial

O Kubernetes não trabalha simplesmente administrando containers isoladamente.

Uma unidade fundamental de execução é o:

Pod

Normalmente encontramos:

Pod
 |
 +-- Container

Mas um Pod pode possuir mais de um container quando existe uma razão arquitetural para isso:

Pod
 |
 +-- aplicação
 |
 +-- container auxiliar

Containers no mesmo Pod compartilham aspectos importantes de seu ambiente.

Portanto:

POD != CONTAINER

Grave isso.

Pode parecer uma distinção acadêmica no primeiro dia.

No vigésimo ela salva sua compreensão do ambiente.


10. E o Pod morreu

Aqui acontece uma transformação filosófica interessante para quem passou décadas tratando servidores como indivíduos.

No mundo tradicional:

“Esse é o servidor XPTO01. Cuide dele.”

No Kubernetes, muita infraestrutura é tratada como efêmera.

O Pod morreu?

Pode surgir outro.

Hoje:

Pod A
10.20.1.17

Amanhã:

Pod A = morto

Pod B
10.20.4.38

Por isso construir dependências baseadas diretamente na identidade transitória de um Pod seria uma péssima ideia.

Precisamos de abstrações.


11. ReplicaSet: quero três vivos

Imagine:

Desejado = 3 Pods

Temos:

Pod
Pod
Pod

Um desaparece:

Pod
X
Pod

O ReplicaSet ajuda a manter:

3

criando outro.

Aqui reencontramos nosso velho amigo:

estado desejado.


12. Deployment: agora precisamos atualizar tudo

Na prática, para aplicações comuns, normalmente trabalhamos com um Deployment, que administra ReplicaSets e facilita rollouts.

Imagine:

Deployment
    |
ReplicaSet V1
    |
 +-- Pod
 +-- Pod
 +-- Pod

Sai versão nova.

Em vez de:

PARE TUDO!

podemos fazer uma substituição progressiva:

V1  V1  V1

V2  V1  V1

V2  V2  V1

V2  V2  V2

Isso é tremendamente importante em ambientes modernos onde deploys podem ocorrer com frequência.

E quando algo dá errado?

Rollback passa a fazer parte da conversa.


13. Service: “mas qual IP eu chamo?”

Lembra que Pods podem desaparecer?

Temos:

Frontend
    |
    ???
    |
Backend Pods

Como o frontend encontra o backend se os Pods mudam?

Usamos uma abstração chamada:

Service

CLIENTE
   |
   v
SERVICE
   |
   +---- Pod
   |
   +---- Pod
   |
   +---- Pod

O Service fornece um ponto lógico estável para acessar um conjunto de Pods selecionados.

Aqui existe uma das ideias mais bonitas do cloud-native:

colocar identidade lógica estável diante de componentes fisicamente transitórios.


14. ConfigMap: não coloque o universo dentro do programa

Aplicações precisam de configurações:

LOG_LEVEL=INFO
LANGUAGE=PT_BR
API_HOST=...

Você poderia colocar tudo dentro da imagem.

Mas então qualquer mudança exigiria outra construção da imagem.

ConfigMaps permitem separar parte da configuração da aplicação.

É uma evolução daquele princípio antigo:

programa é uma coisa; parâmetros do ambiente são outra.

COBOLzeiro conhece essa conversa há décadas, mesmo usando mecanismos completamente diferentes.


15. Secret: o nome promete mais do que parece

Temos informações sensíveis:

senha
token
chave
certificado

Kubernetes possui o objeto Secret.

Mas cuidado com uma armadilha clássica:

Um objeto chamado Secret não significa automaticamente “segredo absolutamente protegido contra tudo”.

Segurança adequada envolve também:

  • RBAC;

  • criptografia em repouso;

  • proteção do etcd;

  • controle de Service Accounts;

  • secret managers;

  • rotação;

  • auditoria;

  • mínimo privilégio.

Colocar a senha em Secret e declarar vitória é como escrever:

//PASSWORD DD *
SUPERSECRETA123
/*

e colocar uma etiqueta dizendo CONFIDENCIAL.

A etiqueta não é o controle de segurança.


16. Storage: containers morrem; saldo bancário não deveria

Containers são naturalmente descartáveis.

Dados empresariais frequentemente não são.

Imagine:

Banco de dados
     |
 container
     |
   morreu

Kubernetes responde:

— Sem problemas, fazemos outro!

O DBA responde:

— E MEUS DADOS?

E nesse instante nasce uma reunião.

Para persistência encontramos conceitos como:

PersistentVolume
PersistentVolumeClaim
StorageClass

Simplificando:

POD
 |
PVC
 |
PV
 |
STORAGE REAL

O Pod pode ser transitório.

O armazenamento precisa seguir regras diferentes.


17. StatefulSet: quando identidade importa

Deployments funcionam muito bem quando as instâncias podem ser relativamente intercambiáveis.

Mas nem toda workload funciona assim.

Algumas precisam de identidade previsível:

db-0
db-1
db-2

e armazenamento associado.

Aparece então o:

StatefulSet

Ele é especialmente relevante para workloads stateful e sistemas distribuídos que precisam de identidade e ordenação mais previsíveis.

Isso não significa:

“StatefulSet transforma magicamente qualquer banco em banco cloud-native.”

Se fosse tão fácil, DBA seria uma profissão de seis minutos.


18. DaemonSet: um para cada Node

Imagine um agente de monitoramento que precisa existir em todos os Nodes:

NODE A → agente
NODE B → agente
NODE C → agente
NODE D → agente

O DaemonSet serve muito bem para esse padrão.

Aplicações típicas incluem agentes de:

  • observabilidade;

  • logging;

  • segurança;

  • networking.

Quando surge outro Node, a intenção pode ser automaticamente refletida nele.

Estado desejado novamente.

Kubernetes é quase obsessivo.


19. Jobs e CronJobs: o COBOLzeiro reconhece um parente

Nem tudo precisa ficar executando eternamente.

Temos tarefas:

INÍCIO
 |
PROCESSAMENTO
 |
FIM

Kubernetes possui Jobs.

E para tarefas periódicas:

CronJobs

O COBOLzeiro imediatamente pergunta:

— Então isso é batch?

Em espírito, estamos no mesmo bairro.

Mas não na mesma casa.

Um Job Kubernetes não substitui automaticamente décadas de ecossistema batch corporativo, scheduling, dependências, restart/recovery, controles operacionais e processamento transacional.

Ainda assim, a analogia ajuda enormemente:

Job → trabalho finito

CronJob → trabalho agendado

20. Requests e Limits: WLM manda lembranças

Aqui chegamos a uma área deliciosa para quem conhece mainframe.

Uma workload pode declarar algo semelhante a:

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "1"
    memory: "1Gi"

Simplificando, requests ajudam a expressar recursos necessários para scheduling; limits impõem tetos de utilização conforme o recurso.

A pergunta filosófica é antiga:

Temos recursos finitos e consumidores potencialmente infinitos. Quem recebe quanto?

O mainframe possui décadas de engenharia sofisticadíssima em workload management.

Kubernetes aborda isso dentro de seu próprio modelo.

Não diga:

Kubernetes WLM = IBM WLM

Não são equivalentes.

Diga:

Ambos enfrentam aspectos do velho problema de administrar recursos compartilhados e workloads concorrentes.

Essa comparação ensina.

A equivalência enganaria.


21. Agora chegamos ao inferno: produção

Até aqui tudo funciona.

Tutorial:

pod/myapp created

Aluno:

— Kubernetes é fácil!

Produção:

CrashLoopBackOff

Aluno:

— Chamem um adulto.

E aqui começa o verdadeiro treinamento.

Você precisa conhecer:

  • logs;

  • events;

  • probes;

  • métricas;

  • CPU;

  • memória;

  • DNS;

  • networking;

  • storage;

  • permissões;

  • dependências;

  • configuração.

Porque:

CrashLoopBackOff

não significa:

“Execute o comando secreto número 17.”

Significa que existe um comportamento de reinício repetido a investigar.

A causa pode ser:

configuração errada
dependência indisponível
credencial
permissão
OOM
bug
porta
DNS
storage
probe

É quase o nosso querido:

S0C7

O código oferece uma pista.

Mas experiência transforma a pista em investigação.


22. Observabilidade: o cluster precisa falar

Imagine:

Usuário
  |
Ingress
  |
Service
  |
Pod
  |
Aplicação
  |
API
  |
Banco

Usuário diz:

“Está lento.”

Maravilha.

Onde?

Precisamos de diferentes sinais:

METRICS
LOGS
TRACES
EVENTS

Não basta saber que um Pod está Running.

Um processo pode estar vivo e a aplicação completamente inútil.

É por isso que existem conceitos como:

liveness probe e readiness probe.

De forma simplificada:

Liveness:
"Você ainda está vivo?"

Readiness:
"Você está pronto para receber tráfego?"

São perguntas diferentes.

Um sujeito pode estar vivo às seis da manhã e absolutamente não estar pronto para receber tráfego.

Eu sou prova disso antes do café.


23. RBAC: RACF olha pela janela

RBAC significa Role-Based Access Control.

A pergunta é familiar:

QUEM
 |
pode fazer
 |
O QUÊ
 |
sobre QUAL RECURSO?

Exemplo:

PROGRAMADOR
 |
 +--> visualizar Pods       SIM
 +--> consultar logs        SIM
 +--> destruir cluster      NÃO, ESPERAMOS

Quem conhece RACF encontra aqui outra ponte conceitual.

RBAC não é RACF.

Mas autorização baseada em identidades, recursos, permissões e mínimo privilégio definitivamente não nasceu ontem.


24. NetworkPolicy: “você não precisa conversar com ele”

Imagine:

FRONTEND
    |
BACKEND
    |
DATABASE

O frontend precisa realmente acessar diretamente o banco?

Talvez não.

Então podemos desejar:

Frontend ---> Backend     OK
Frontend -X-> Database    NÃO

Backend ----> Database    OK

Network Policies permitem controlar fluxos de rede entre workloads quando suportadas adequadamente pelo ambiente de networking.

Aqui começamos a caminhar em direção a arquiteturas mais próximas do princípio de:

negue aquilo que não é necessário.


25. Helm: porque 47 YAMLs também cansam

No início temos:

deployment.yaml

Depois:

deployment.yaml
service.yaml
configmap.yaml
ingress.yaml
secret.yaml
pvc.yaml
...

Em determinado momento alguém pergunta:

— Não poderíamos empacotar isso?

Entra Helm.

Helm trabalha com Charts, templates e valores configuráveis.

Conceitualmente:

Chart
 |
 +-- templates
 |
 +-- values
 |
 +-- metadata

E aqui ocorre um ritual iniciático cloud-native:

  1. você aprende YAML;

  2. aprende templates;

  3. aprende templates que produzem YAML;

  4. recebe uma mensagem de erro;

  5. olha para o teto;

  6. reconsidera decisões profissionais;

  7. resolve;

  8. coloca no LinkedIn.


26. CRD: “eu também posso inventar objetos?”

Sim.

Uma das capacidades mais interessantes do Kubernetes são as Custom Resource Definitions.

Originalmente você trabalha com recursos como:

Pod
Service
Deployment

Com CRDs podemos estender a API com recursos específicos.

Conceitualmente:

Database
Certificate
KafkaCluster
Backup
MeuObjetoCorporativo

Isso revela que Kubernetes é mais que um mero lançador de containers.

Ele oferece uma espécie de framework declarativo extensível para sistemas de controle.

Essa mudança mental é importante.


27. Operator: o runbook ganhou pernas

Imagine o velho especialista.

Ele sabe:

SE A acontecer
   verifique B

SE B estiver assim
   execute C

SE C falhar
   tente D

Décadas de conhecimento operacional.

Um Operator tenta codificar conhecimento operacional específico usando o modelo de controllers e reconciliação do Kubernetes.

Simplificando:

Conhecimento operacional
          |
          v
       código
          |
          v
      Operator
          |
          v
observa → decide → reconcilia

É como se parte do runbook ganhasse vida.

Não elimina o especialista.

Muda o lugar onde parte do conhecimento dele vive.


28. CI/CD: ninguém deveria levar o deploy num disquete

O próximo passo natural é automação.

Temos:

Código
 |
Git
 |
Build
 |
Teste
 |
Imagem
 |
Registry
 |
Deploy
 |
Kubernetes

Entramos no território de CI/CD.

E depois aparece GitOps.

Em vez de alguém alterar manualmente produção:

OPERADOR
 |
kubectl
 |
PRODUÇÃO

podemos trabalhar com um modelo no qual o Git representa o estado desejado relevante:

Developer
   |
   v
  Git
   |
Pull Request
   |
Review
   |
   v
GitOps Controller
   |
   v
Cluster

Isso melhora possibilidades de:

  • rastreabilidade;

  • auditoria;

  • revisão;

  • versionamento;

  • recuperação;

  • consistência.

Mas lembre-se:

automatizar processo ruim produz desastre em velocidade industrial.


29. O que aquele roadmap deveria mostrar antes do Kubernetes

Aqui está minha principal crítica à figura.

Eu colocaria uma Fase Zero:

FASE ZERO

Linux
  |
processos
  |
filesystem
  |
CPU/memória
  |
networking
  |
TCP/IP
  |
DNS
  |
HTTP
  |
TLS
  |
containers
  |
images
  |
runtime
  |
KUBERNETES

Por quê?

Porque Kubernetes não aboliu o sistema operacional.

Nem aboliu rede.

Nem DNS.

Especialmente DNS.

Existe um antigo espírito maligno vagando pelos datacenters dizendo:

“It's always DNS.”

Quando você acha que não é DNS, eventualmente descobre que era DNS usando bigode falso.


30. Networking merece uma fase própria

Eu ampliaria o roadmap para incluir profundamente:

IP
CIDR
TCP
UDP
DNS
NAT
routing
TLS
Load Balancing
ClusterIP
NodePort
LoadBalancer
Ingress
CNI
NetworkPolicy

Porque um dos incidentes mais frustrantes é:

Pod: Running
Application: Healthy
Service: Exists

Usuário: NÃO FUNCIONA.

Então começa a expedição arqueológica.


31. Segurança de supply chain também precisa entrar

Em 2026 não basta perguntar:

“A imagem funciona?”

Precisamos perguntar:

Quem construiu essa imagem?
De onde veio?
Qual imagem base foi usada?
Possui vulnerabilidades?
Tem SBOM?
Foi assinada?
Quem pode publicar?
Foi adulterada?

Ou seja, o roadmap moderno precisa incluir:

  • scanning;

  • provenance;

  • SBOM;

  • assinatura;

  • admission policies;

  • least privilege;

  • gestão de secrets;

  • identidade de workloads;

  • atualização segura.

O container é conveniente justamente porque carrega muita coisa consigo.

E tudo aquilo que carregamos conosco também pode carregar problemas.


32. E o mainframe no meio dessa galáxia?

Aqui existe uma oportunidade fantástica para o COBOLzeiro.

Não pense:

Kubernetes
VERSUS
Mainframe

Pense:

                 INTERNET
                    |
              KUBERNETES
                    |
              APIs / serviços
                    |
          +---------+---------+
          |                   |
       CLOUD              MAINFRAME
                           |
                   +-------+-------+
                   |       |       |
                  CICS    IMS     Db2
                   |
                 COBOL

Kubernetes não precisa destruir o mainframe para justificar sua existência.

Um banco pode perfeitamente ter sistemas transacionais críticos em IBM Z enquanto utiliza Kubernetes para APIs, integração, canais digitais, serviços distribuídos, observabilidade e outras workloads.

O mundo corporativo real é híbrido.

A Millennium Falcon também não foi construída inteira pela mesma consultoria.

Provavelmente por isso funcionava.


33. O laboratório que eu faria para um COBOLzeiro

Aqui está o caminho prático.

Não faça 25 tutoriais desconectados.

Construa uma aplicação e faça-a evoluir.

Chamaremos:

BELLACOSA INTERGALACTIC BANK

Versão 1:

Frontend

Versão 2:

Frontend
   |
Backend

Versão 3:

Frontend
   |
Service
   |
Backend

Versão 4:

Ingress
   |
Frontend
   |
Service
   |
Backend
   |
Database

Depois acrescente:

ConfigMap
Secrets
PVC
Requests
Limits
Probes
RBAC
NetworkPolicy
Monitoring
Logging

Depois:

CI/CD

Depois:

GitOps

E somente então:

Helm
Operators
CRDs

Não tente aprender a galáxia inteira antes de visitar a Lua.


34. Agora destrua tudo

Esta é a etapa que falta em muitos cursos.

Faça o Pod morrer.

kubectl delete pod ...

Observe o que acontece.

Coloque memória insuficiente.

Quebre uma configuração.

Use uma imagem inexistente.

Quebre uma readiness probe.

Remova uma permissão.

Altere uma NetworkPolicy.

Crie problema de storage.

Observe:

Pending
ImagePullBackOff
CrashLoopBackOff
OOMKilled
Forbidden
Readiness probe failed

Para cada incidente pergunte:

O QUE aconteceu?

POR QUE aconteceu?

QUAL componente percebeu?

QUAL estado era desejado?

QUAL estado existia?

QUEM tentou reconciliar?

ONDE encontro evidência?

COMO evitar novamente?

Esse exercício ensina dez vezes mais do que decorar cinquenta comandos.


35. O COBOLzeiro possui uma vantagem escondida

O programador COBOL iniciante talvez olhe Kubernetes e pense que está começando do zero.

Não está.

Se ele está aprendendo o ecossistema mainframe simultaneamente, já está entrando em contato com perguntas universais:

Como programas são executados?

Como recursos são alocados?

Como identidade funciona?

Como permissões são verificadas?

Como dados persistem?

Como jobs são agendados?

Como falhas são diagnosticadas?

Como mudanças chegam à produção?

Como recuperamos alguma coisa que quebrou?

Essas perguntas atravessaram gerações de computadores.

As respostas mudaram.

As perguntas continuam surpreendentemente parecidas.


36. A tabela de tradução intergaláctica

Não como equivalência técnica, mas como pontes mentais:

Universo MainframeUniverso KubernetesIdeia em comum
JES/schedulingScheduler/Jobsexecução organizada de workloads
JCL/parâmetrosmanifests/configuraçãodeclarar como executar
PROCtemplates/Helmreutilização
RACFRBACautorização
WLMrequests/limits/schedulinggestão de recursos
Started Tasksserviços/workloads contínuasprocessos duradouros
Scheduler batchCronJobexecução periódica
datasets/storagePV/PVCpersistência
Sysplex/HAcluster/replicasdisponibilidade
SMF/RMF/logsmetrics/logs/tracesobservabilidade
RunbookOperatorconhecimento operacional

Novamente:

não são equivalentes.

Essa tabela é mapa turístico, não especificação de arquitetura.

Se você tentar usar um mapa turístico para fazer cirurgia, o resultado será digno dos Vogons.


37. Do iniciante ao arquiteto

Existe uma progressão interessante.

Nível 1

O aluno pergunta:

“Como crio um Pod?”

Nível 2

Pergunta:

“Como faço três réplicas?”

Nível 3

Pergunta:

“Por que esse Pod morreu?”

Nível 4

Pergunta:

“Por que ele continua morrendo?”

Nível 5

Pergunta:

“Por que nossa arquitetura permitiu que a morte desse Pod afetasse usuários?”

Nível 6

Pergunta:

“Como eliminamos essa classe inteira de falhas?”

Essa é a transformação.

COMANDO
   ↓
OBJETO
   ↓
PLATAFORMA
   ↓
OPERAÇÃO
   ↓
ARQUITETURA
   ↓
ENGENHARIA DE RESILIÊNCIA

38. Easter Egg: Kubernetes e o número 42

No Guia do Mochileiro das Galáxias, a resposta para a Grande Questão da Vida, do Universo e Tudo Mais é:

42

Depois descobriram que ninguém sabia exatamente qual era a pergunta.

Kubernetes possui uma versão corporativa disso.

O arquiteto pergunta:

— Quantas réplicas precisamos?

Consultor:

— Três.

— Por quê?

— Alta disponibilidade.

— Baseado em qual cálculo?

— ...

— Tráfego?

— ...

— SLO?

— ...

— capacidade?

— ...

— histórico de falhas?

— ...

— teste de carga?

— ...

Três virou o 42 da arquitetura cloud-native.

😆

A lição é excelente:

uma resposta tecnicamente plausível sem a pergunta correta continua sendo apenas uma resposta procurando uma justificativa.


39. Outra curiosidade: Kubernetes significa timoneiro

O nome vem do grego e remete à ideia de timoneiro/piloto.

Daí também o famoso leme no logotipo.

E isso é poeticamente perfeito.

Kubernetes não é o navio.

Não é a carga.

Não é o oceano.

Ele ajuda a conduzir a embarcação.

Só existe um detalhe que nenhum tutorial coloca em letras suficientemente grandes:

você ainda precisa saber navegar.

Kubernetes não elimina a necessidade de conhecer Linux, redes, storage, segurança, aplicações e sistemas distribuídos.

Na realidade, em ambientes complexos ele pode exigir que você compreenda um pouco de todos eles simultaneamente.


40. O segredo final do roadmap

A imagem original termina aproximadamente com a ideia:

consistência + prática = especialista Kubernetes.

Eu acrescentaria algumas variáveis:

TEORIA
   +
PRÁTICA
   +
ERRO
   +
OBSERVAÇÃO
   +
TROUBLESHOOTING
   +
DOCUMENTAÇÃO
   +
CURIOSIDADE
   +
INCIDENTES
   +
CAFÉ
   =
EXPERIÊNCIA

Principalmente os erros.

Porque executar:

kubectl get pods

é fácil.

Interpretar:

NAME             READY   STATUS
app-7d98         0/1     CrashLoopBackOff

é outra história.

E descobrir que o Pod não era a causa, que a aplicação estava falhando porque não conseguia alcançar uma dependência, que a dependência estava inacessível por causa de uma alteração de rede introduzida no deploy anterior...

Aí temos engenharia.


☕ Epílogo — O COBOLzeiro pega sua toalha

Nosso programador começou a viagem olhando para um roadmap colorido e pensando:

“Pod? Helm? Ingress? CRD? Operator? Eu só queria aprender Kubernetes.”

Agora ele sabe que Kubernetes não é uma coleção de palavras estranhas.

É uma resposta moderna para um conjunto de problemas profundamente antigos:

executar, distribuir, controlar, proteger, observar, recuperar e evoluir software.

O mainframe resolveu muitos desses problemas dentro de seu próprio universo durante décadas.

Unix resolveu outros.

Cloud resolveu outros.

Containers mudaram novamente a unidade de distribuição.

Kubernetes apareceu para coordenar esse novo zoológico.

E talvez essa seja a maior lição para um programador COBOL entrando no mundo cloud-native:

não jogue fora aquilo que você aprendeu.

Traduza.

Quando encontrar RBAC, lembre-se das perguntas que RACF ensinou a fazer.

Quando encontrar requests e limits, pense nas questões que WLM levanta.

Quando encontrar Jobs, recorde o mundo batch.

Quando encontrar observabilidade, pense em RMF, SMF, logs e diagnóstico.

Quando encontrar Operators, pense no velho runbook do especialista que sabia exatamente o que fazer quando determinada luz vermelha acendia.

Não porque essas tecnologias sejam iguais.

Mas porque a história da computação é cheia de novas respostas para perguntas antigas.

E algum dia, provavelmente às 03:17 da manhã, você encontrará isto:

CrashLoopBackOff

O jovem aprendiz perguntará:

— Mestre, qual comando resolve isso?

Você tomará um gole de café, olhará calmamente para o terminal e responderá:

Nenhum. Primeiro precisamos descobrir o que aconteceu.

Nesse instante terá ocorrido algo muito mais importante que aprender Kubernetes.

Você terá aprendido a pensar como alguém de produção.

E, como diria o Guia do Mochileiro das Galáxias, enquanto o cluster inteiro estiver pegando fogo:

+---------------------------------------+
|                                       |
|          NÃO ENTRE EM PÂNICO          |
|                                       |
|      kubectl get events               |
|                                       |
|          E LEVE UMA TOALHA            |
|                                       |
+---------------------------------------+

☕🚀

Bem-vindo ao Kubernetes, COBOLzeiro.

A galáxia continua distribuída, eventualmente consistente, estranhamente documentada e, por algum motivo que ninguém conseguiu explicar satisfatoriamente, ainda depende de DNS.

sexta-feira, 10 de julho de 2026

Kubernetes sem Mistérios : Os 50 Erros que Derrubam Clusters em Produção (e que um Profissional IBM Z já Aprendeu a Evitar Há Décadas)

Bellacosa Mainframe apresenta kubernetes sem misterios



☕ Um Café no Bellacosa Mainframe

Kubernetes sem Mistérios 

Os 50 Erros que Derrubam Clusters em Produção (e que um Profissional IBM Z já Aprendeu a Evitar Há Décadas)

Existe uma curiosidade interessante.

Muitos profissionais enxergam Kubernetes como uma tecnologia revolucionária.

Ela realmente é.

Mas existe outra forma de enxergá-la.

Para quem trabalhou anos em Mainframe, Kubernetes parece muito mais uma redescoberta de conceitos que IBM já aplicava há décadas.

Disponibilidade.

Balanceamento.

Isolamento.

Escalonamento.

Segurança.

Observabilidade.

Recuperação.

Controle de acesso.

Versionamento.

Rollback.

Tudo isso sempre existiu.

A diferença é que hoje esses conceitos aparecem usando containers, pods e YAML.

No IBM Z eles aparecem como:

  • JES2

  • WLM

  • RACF

  • Sysplex

  • CICS

  • Db2

  • GDG

  • VSAM

  • SMF

  • RMF

O objetivo continua exatamente o mesmo:

Fazer sistemas críticos permanecerem funcionando.


O grande problema

Criar um cluster Kubernetes é extremamente fácil.

Rodar um cluster durante cinco anos, sem interrupções relevantes, é extremamente difícil.

Quase todos os grandes incidentes em produção acontecem por pequenas decisões aparentemente inocentes.

É exatamente isso que o infográfico demonstra.


BLOCO 1

Cluster & Infrastructure

Erro 1

Um único Worker Node

Imagine um banco inteiro rodando em apenas um IBM Z.

Parece absurdo.

No Kubernetes isso acontece o tempo inteiro.

Node A

APP1
APP2
APP3
APP4

Se esse servidor falhar...

Tudo cai.


No Mainframe isso seria equivalente a:

  • um único CPC

  • sem Parallel Sysplex

  • sem GDPS

  • sem redundância

Alta disponibilidade simplesmente deixa de existir.


Erro 2

Não proteger o Control Plane

O Control Plane é o cérebro.

Ele contém:

  • API Server

  • Scheduler

  • Controller Manager

  • ETCD

Sem ele...

O cluster fica "cego".

Os containers podem continuar rodando por algum tempo.

Mas nada novo consegue ser criado.

É parecido com perder o JES2 Master.


Erro 3

Não fazer backup do ETCD

O ETCD guarda praticamente todo o estado do cluster.

É equivalente ao:

  • catálogo do sistema

  • SYS1

  • repositórios de configuração

Sem ETCD...

Você perdeu:

  • Deployments

  • Services

  • Secrets

  • ConfigMaps

  • RBAC

  • Namespaces

Ou seja...

Perdeu o cluster.


Erro 4

Misturar Desenvolvimento e Produção

Esse é um erro clássico.

Imagine colocar:

PIX
Internet Banking
Folha de Pagamento

junto com

Sistema de Testes

No mesmo cluster.

Um teste mal executado pode consumir:

CPU

Memória

IO

Rede

e afetar produção.


Mainframe resolveu isso há décadas.

LPARs.

WLM.

Classes de serviço.

Ambientes isolados.


BLOCO 2

Resource Management

Aqui aparece um dos assuntos mais importantes.

Recursos.

No Kubernetes nada funciona "no automático".


Requests

Requests significam:

"O mínimo que preciso."

Exemplo

CPU: 500m

Memory: 1GB

O Scheduler utiliza isso para decidir onde colocar o Pod.

Sem requests...

Ele simplesmente chuta.


É semelhante ao WLM tentando distribuir workload sem conhecer prioridades.


Limits

Agora vem outra história.

Limits representam o máximo permitido.

CPU

2 cores

RAM

4GB

Se ultrapassar...

O processo sofre throttling.

Ou pode ser encerrado.


OOMKilled

Talvez o erro mais famoso.

Quando um container usa mais memória que o permitido.

O Kernel Linux faz:

OOM Killer

e encerra o processo.

No Mainframe seria parecido com:

Storage exhaustion

ou

S878


HPA

Horizontal Pod Autoscaler.

Ele aumenta o número de Pods.

Mas cuidado.

Escalar uma aplicação ruim apenas cria mais instâncias lentas.

É parecido com colocar mais CICS Regions para um programa que possui SQL ruim.

O gargalo continua existindo.


BLOCO 3

Deployment

Aqui surgem alguns erros extremamente comuns.


Nunca usar latest

Jamais.

image: latest

Parece prático.

Mas amanhã...

"latest"

é outra versão.

Você perdeu reprodutibilidade.


Sempre utilize

1.2.7

2.1.0

5.8.12

ou melhor ainda

Digest SHA256.


Isso lembra muito o mundo Mainframe.

Nunca executamos:

PROD.COBOL

Sabemos exatamente qual Load Module foi promovido.


Readiness Probe

O Pod iniciou.

Mas será que ele está pronto?

Não necessariamente.

Uma aplicação Java pode precisar:

30 segundos.

Sem Readiness.

O Kubernetes envia tráfego imediatamente.

Resultado:

Erro.


Liveness Probe

Verifica se o processo continua vivo.

Se travar...

O Kubernetes reinicia.

É semelhante ao Automation do SA z/OS detectando um address space congelado.


Startup Probe

Ideal para aplicações pesadas.

Sem ela...

O Kubernetes mata a aplicação antes dela terminar de iniciar.


Rolling Update

Jamais atualizar todos os Pods simultaneamente.

Sempre:

1
2
3
4

Nunca:

100%

de uma vez

É exatamente o conceito de deploy gradual utilizado por bancos.


BLOCO 4

Networking

Aqui muitos iniciantes sofrem.


Network Policies

Sem elas...

Todo Pod conversa com qualquer Pod.

Isso é perigosíssimo.

Imagine um malware chegando.

Ele consegue acessar praticamente tudo.


É equivalente a um RACF onde todos possuem ALTER em todos os datasets.

Impensável.


DNS

Muitos problemas parecem ser de aplicação.

Na verdade são DNS.

service

↓

CoreDNS

↓

IP

Uma falha aqui afeta milhares de Pods.


NodePort

Expor NodePort diretamente para Internet.

Nunca.

Use:

Ingress

Load Balancer

API Gateway

WAF


TLS

Sem TLS.

Todo tráfego pode ser interceptado.

No Mainframe isso seria equivalente a utilizar TN3270 sem criptografia.


BLOCO 5

Storage & Security

Aqui aparecem erros gravíssimos.


Rodar como Root

Nunca.

Um container comprometido ganha acesso privilegiado.

Use:

runAsNonRoot

readOnlyRootFilesystem

drop capabilities

Secrets em ConfigMaps

Erro extremamente comum.

ConfigMap não criptografa.

Secrets devem permanecer em:

Secret

Vault

KMS

External Secrets


RBAC

Sem RBAC.

Todos administram tudo.

Imagine um operador podendo:

Excluir produção.

Criar usuários.

Modificar políticas.

É por isso que RACF existe.

RBAC é o RACF do Kubernetes.


BLOCO 6

Observabilidade

Talvez o capítulo mais importante.


Sem logs...

Não existe troubleshooting.


Sem métricas...

Não existe capacity planning.


Sem tracing...

Não existe análise distribuída.


Sem dashboards...

Não existe visão operacional.


Ferramentas normalmente utilizadas

Logs

  • ELK

  • OpenSearch

  • Loki

Métricas

  • Prometheus

Dashboards

  • Grafana

Tracing

  • Jaeger

  • Tempo

  • Zipkin

Alertas

  • Alertmanager


Isso lembra muito:

RMF

SMF

OMEGAMON

NetView

Tivoli

Z APM Connect


BLOCO 7

Operação

Aqui aparecem erros humanos.

E a maioria dos grandes incidentes nasce justamente deles.


Deploy manual

Nunca.

Sempre:

Git

Pipeline

Automação


GitOps

O Git torna-se a verdade absoluta.

Toda alteração passa por:

Commit

Review

Pipeline

Deploy

Rollback


É semelhante ao ChangeMan, ISPW ou Endevor.

Nada muda diretamente na produção.


Não testar recuperação

Backup sem restore não vale nada.

Todo DR precisa ser testado.

No IBM Z isso sempre foi obrigatório.

GDPS.

Recovery.

Image Copy.

Log Apply.


Não auditar segurança

Novas vulnerabilidades surgem diariamente.

Imagens precisam ser continuamente escaneadas.


Os "novos" erros 

Os últimos slides ampliam ainda mais a lista.

Entre eles destacam-se:

  • Não definir ResourceQuota.

  • Não usar LimitRange.

  • Ignorar Namespaces.

  • Expor aplicações diretamente.

  • Não realizar backup periódico do ETCD.

  • Não otimizar custos.

  • Não separar ambientes.

  • Não validar probes continuamente.

  • Não monitorar consumo financeiro do cluster.

Esses erros normalmente não derrubam o ambiente no primeiro dia, mas aumentam gradualmente a complexidade operacional e o risco de incidentes.


O grande paralelo com IBM Z

O aspecto mais interessante desse material é perceber que praticamente todos os "50 erros do Kubernetes" já possuem um equivalente consolidado no ecossistema IBM Z:

KubernetesIBM Z / Mainframe
RBACRACF
SchedulerWLM
Rolling UpdatePromoção controlada (Endevor/ISPW/ChangeMan)
ReplicaSetParallel Sysplex
ETCDCatálogos e repositórios críticos do sistema
ObservabilidadeRMF, SMF, OMEGAMON
Health ChecksSA z/OS, NetView
GitOpsGestão de configuração e promoção de software
SecretsRACF + ICSF + cofres corporativos
AutoscalingBalanceamento e classes de serviço do WLM

A tecnologia mudou, mas os princípios permanecem.


A maior lição para um Padawan COBOL

Quem está começando em Kubernetes costuma imaginar que dominar YAML, Pods e Deployments basta para operar um ambiente de produção. Na realidade, isso representa apenas uma pequena parte do trabalho.

Os profissionais mais experientes pensam primeiro em engenharia operacional. Antes de criar um único Deployment, eles definem como recuperar o cluster após uma falha, como limitar recursos para evitar que uma aplicação afete outra, como monitorar métricas, como proteger segredos, como automatizar implantações, como auditar mudanças e como garantir que qualquer alteração possa ser revertida rapidamente.

Essa é exatamente a mentalidade que sempre existiu no IBM Z. Durante décadas, bancos, seguradoras e governos construíram sistemas que precisavam permanecer disponíveis 24 horas por dia. Kubernetes não substitui esses princípios; ele os reapresenta em uma nova arquitetura baseada em containers.

No Bellacosa Mainframe, essa é talvez a maior mensagem deste material: um bom engenheiro de Kubernetes não é aquele que conhece mais comandos kubectl, mas aquele que projeta plataformas resilientes, observáveis, seguras e previsíveis. A verdadeira maturidade está menos na tecnologia utilizada e muito mais na disciplina de engenharia aplicada a ela.

domingo, 5 de julho de 2026

Kubernetes Autoscaling Muito Além do HPA

 

Bellacosa Mainframe e o kubernetes autoscaling

☕ Um Café no Bellacosa Mainframe

Kubernetes Autoscaling Muito Além do HPA

O Que Todo Programador COBOL Padawan Precisa Saber Sobre HPA, VPA, Cluster Autoscaler e Como os Grandes Bancos Escalam Milhões de Transações Sem Desperdiçar Recursos

"No Mainframe aprendemos que desempenho nunca foi apenas velocidade. Sempre foi equilíbrio entre capacidade, disponibilidade, custo e confiabilidade. Kubernetes apenas reinventou esse conceito para a era da nuvem."


Introdução

Existe uma pergunta que praticamente todo desenvolvedor faz quando começa a estudar Kubernetes:

"Se meu sistema receber mais acessos, o Kubernetes cria novos Pods automaticamente?"

A resposta é:

Depende.

E é justamente esse "depende" que confunde milhares de profissionais todos os anos.

Quando um Programador COBOL começa a estudar Kubernetes, normalmente imagina que existe apenas um mecanismo responsável por aumentar a capacidade da aplicação.

Na prática, isso está longe da realidade.

Na verdade, Kubernetes possui diversos mecanismos diferentes de escalabilidade, cada um resolvendo um problema específico.

Alguns aumentam a quantidade de Pods.

Outros aumentam CPU e memória.

Outros adicionam novos servidores inteiros ao cluster.

Cada um trabalha em uma camada diferente da infraestrutura.

É exatamente como acontece em um grande banco.

Quando o Internet Banking começa a ficar lento, ninguém simplesmente compra um novo servidor.

Antes disso existem diversas decisões:

  • aumentar regiões CICS?

  • criar novos servidores WebSphere?

  • ajustar WLM?

  • aumentar memória?

  • ativar Capacity on Demand?

  • adicionar uma nova LPAR?

No Kubernetes acontece exatamente a mesma filosofia.

Neste artigo vamos entender profundamente como funcionam:

  • Horizontal Pod Autoscaler (HPA)

  • Vertical Pod Autoscaler (VPA)

  • Cluster Autoscaler (CA)

Sempre fazendo paralelos com IBM Z, COBOL, CICS, Batch, WLM e arquitetura corporativa.


Antes de falar sobre Autoscaling...

Precisamos entender um conceito fundamental.

O verdadeiro objetivo não é aumentar recursos.

É utilizar exatamente os recursos necessários.

Essa diferença parece pequena.

Mas muda completamente a forma de projetar sistemas.

Imagine um supermercado.

Às 3 horas da manhã existem apenas cinco clientes.

Às 18 horas existem dois mil clientes.

Você contrataria:

  • 200 caixas funcionando o dia inteiro?

Claro que não.

Também não deixaria apenas dois caixas funcionando às 18 horas.

A solução inteligente é adaptar a quantidade de caixas conforme o movimento.

É exatamente isso que Kubernetes faz.


O grande problema dos sistemas tradicionais

Durante décadas o modelo foi simples.

Comprar servidores suficientes para suportar o pior cenário.

Imagine uma aplicação bancária.

Segunda-feira:

CPU: 12%

Terça-feira:

CPU: 18%

Quarta-feira:

CPU: 22%

Na Black Friday:

CPU: 98%

O servidor foi comprado pensando apenas nesse último dia.

Resultado:

Durante praticamente todo o ano:

  • CPU parada

  • memória parada

  • discos subutilizados

  • energia desperdiçada

  • dinheiro desperdiçado

Cloud Computing mudou completamente essa lógica.

Agora infraestrutura pode crescer e diminuir automaticamente.


Elasticidade x Escalabilidade

Esses conceitos costumam ser confundidos.

Escalabilidade

É a capacidade do sistema suportar mais carga.

Exemplo:

Um servidor suporta:

500 usuários

Depois de melhorias:

5.000 usuários

Ele ficou mais escalável.


Elasticidade

É a capacidade de crescer e diminuir automaticamente.

Hoje:

2 Pods

Daqui cinco minutos:

20 Pods

Mais tarde:

4 Pods

Tudo sem intervenção humana.

Isso é elasticidade.

É justamente o coração do Kubernetes.


Os três tipos de escalabilidade

A maioria das pessoas acredita que existe apenas um tipo.

Na realidade existem três.

Escalabilidade Horizontal

Adicionar mais instâncias.

Exemplo:

Antes

2 Pods

Depois

8 Pods

Cada Pod continua igual.

Apenas existem mais deles.


Escalabilidade Vertical

Não aumenta quantidade.

Aumenta potência.

Antes

CPU 500m

Memória 512Mi

Depois

CPU 2

Memória 4Gi

Mesmo Pod.

Mais poderoso.


Escalabilidade da Infraestrutura

Agora nem estamos falando da aplicação.

Estamos falando do próprio cluster.

Antes

3 Workers

Depois

10 Workers

Agora existe espaço para muito mais Pods.


HPA — Horizontal Pod Autoscaler

Este é o autoscaler mais famoso.

Seu trabalho é extremamente simples.

Responder uma única pergunta.

Existem Pods suficientes?

Observe o que ele NÃO pergunta.

  • Existe CPU suficiente?

  • Existe memória suficiente?

  • Existem servidores suficientes?

Nada disso.

Ele pensa apenas em quantidade de Pods.


Como o HPA funciona?

Imagine uma API.

Ela começou o dia assim.

2 Pods

CPU média:

20%

Tudo funcionando.

Então começa uma campanha de marketing.

A CPU sobe para:

92%

O HPA verifica que sua meta era:

70%

Então ele faz um cálculo.

Simplificando:

Novos Pods =
Pods atuais ×
(CPU Atual / CPU Desejada)

Se havia:

4 Pods

CPU:

84%

Meta:

70%

Resultado:

4 × 84 ÷ 70

≈ 4,8

O Kubernetes arredonda.

Agora teremos:

5 Pods

Se a carga continuar aumentando:

6

8

12

20 Pods

Tudo automático.


Mas o HPA não olha apenas CPU

Esse é um erro muito comum.

Na realidade ele pode observar praticamente qualquer métrica.

Exemplos.

CPU

Memória

Requests por segundo

Tempo médio de resposta

Fila Kafka

RabbitMQ

Prometheus

Número de usuários

Sessões abertas

Mensagens pendentes

Quantidade de pedidos

Pix aguardando processamento

Fila de cartões

Custom Metrics

Isso significa que o HPA pode crescer baseado na necessidade real do negócio.

Imagine um banco.

Talvez CPU nem seja importante.

O importante pode ser:

Fila PIX > 2000

Nesse momento:

Criar novos Pods.

Muito mais inteligente.


Como o HPA conversa com Kubernetes?

O fluxo é relativamente simples.

Usuário

Ingress

Service

Pods

Kubelet mede CPU

Metrics Server coleta

API Server publica

HPA consulta

ReplicaSet aumenta Pods

Deployment cria novas réplicas

Tudo acontece continuamente.

Sem intervenção humana.


HPA não fica escalando o tempo todo

Imagine esta situação.

CPU:

69%

71%

69%

70%

71%

69%

Sem mecanismos de estabilização.

Teríamos:

8 Pods

9 Pods

8 Pods

9 Pods

8 Pods

Isso seria um desastre.

Por isso existem diversos mecanismos internos.

Cooldown.

Stabilization Window.

Tolerance.

Scale Policies.

Esses mecanismos evitam oscilações desnecessárias.


HPA possui limitações

Ele não faz milagres.

Imagine.

Seu cluster possui apenas:

2 Workers

Cada Worker possui:

8 CPUs

Todos estão completamente ocupados.

O HPA decide criar:

30 Pods

Mas onde eles serão executados?

Resposta.

Em lugar nenhum.

Eles ficam:

Pending

É aqui que entra outro personagem.


VPA — Vertical Pod Autoscaler

Agora o problema mudou completamente.

Não queremos mais criar novos Pods.

Queremos melhorar os Pods existentes.

Imagine.

Seu Deployment foi criado assim.

requests:
 cpu: 100m
 memory: 128Mi

Na prática ele utiliza:

CPU

850m

Memória

950Mi

Resultado.

CPU Throttling.

OOMKilled.

Baixo desempenho.

O VPA observa isso.


Como o VPA aprende?

Ao contrário do HPA.

Ele analisa histórico.

Dias.

Semanas.

Meses.

Depois calcula recomendações.

Exemplo.

Atual.

CPU

100m

Recomendado.

900m

Atual.

256Mi

Recomendado.

1Gi

Isso reduz desperdício.

E melhora desempenho.


Os modos do VPA

Off

Apenas recomenda.

Muito usado em produção.

Você recebe um relatório.

Mas nenhuma alteração acontece.


Auto

Atualiza automaticamente.

Se necessário reinicia Pods.

É extremamente poderoso.


Initial

Aplica apenas durante a criação.

Excelente para aplicações críticas.


Por que o VPA reinicia Pods?

Muitos iniciantes estranham isso.

O motivo é simples.

CPU e memória fazem parte da especificação do Pod.

Depois que o container está em execução.

Esses parâmetros normalmente não podem ser alterados.

Então o Kubernetes cria um novo Pod.

Com os novos valores.


O que o VPA não faz?

Não cria novos Pods.

Não cria servidores.

Não aumenta Workers.

Não substitui HPA.

São ferramentas complementares.


Cluster Autoscaler

Agora chegamos à infraestrutura.

Imagine.

Seu HPA criou:

50 Pods

Mas existem apenas:

3 Workers

Todos lotados.

Resultado.

Pods Pending

O Scheduler tenta.

Não consegue.

Agora entra o Cluster Autoscaler.


O trabalho do Cluster Autoscaler

Ele pergunta.

Existe algum Pod que não consegue ser agendado?

Se existir.

Ele conversa com o provedor de nuvem.

AWS.

Azure.

Google.

OpenShift.

VMware.

E solicita novos Workers.

Depois que os novos servidores entram no cluster.

O Scheduler distribui os Pods.


Fluxo completo

Usuários aumentam.

CPU aumenta.

HPA cria Pods.

Pods ficam Pending.

Cluster Autoscaler detecta.

Cloud cria Workers.

Workers entram.

Scheduler agenda Pods.

Aplicação volta ao normal.

Tudo automático.


Como o Cluster Autoscaler decide remover servidores?

Ele também reduz custos.

Imagine.

Domingo.

Pouquíssimos acessos.

Existem:

15 Workers

Mas apenas:

3

são necessários.

O Cluster Autoscaler verifica.

Os Pods podem ser movidos?

Se sim.

Executa.

Drain.

Eviction.

Delete Node.

Resultado.

Economia de infraestrutura.


Comparando HPA, VPA e Cluster Autoscaler

Imagine um supermercado.

HPA

Contrata mais caixas.

Mais pessoas atendendo clientes.


VPA

Entrega computadores mais rápidos para cada caixa.

Cada funcionário trabalha melhor.


Cluster Autoscaler

Constrói uma nova loja.

Agora existe espaço para muito mais caixas.

São três problemas diferentes.


Um exemplo real de um grande banco

Imagine um aplicativo bancário.

Às 8h da manhã.

Começam os acessos.

Primeiro.

O HPA aumenta.

6 Pods

↓

20 Pods

Depois percebe-se que cada Pod está consumindo muito mais memória.

O VPA recomenda.

512Mi

↓

2Gi

Agora não existe mais capacidade física.

O Cluster Autoscaler adiciona.

8 Workers

↓

16 Workers

O usuário final nem percebe.

Essa é a magia da elasticidade.


Analogia com IBM Mainframe

Quem trabalha com IBM Z perceberá rapidamente várias semelhanças.

HPA

Lembra aumentar regiões CICS.

Ou criar mais servidores Liberty.

Mais instâncias.

Mesmo programa COBOL.


VPA

Lembra ajustar REGION.

Heap Java.

Parâmetros WLM.

Mais recursos para uma região existente.


Cluster Autoscaler

Lembra.

Adicionar novas LPARs.

Capacity on Demand.

Expandir Parallel Sysplex.

Mais infraestrutura.

A filosofia é praticamente idêntica.


Quando utilizar cada um?

Use HPA.

Quando existem picos de acesso.

APIs REST.

Microsserviços.

Front-end.

Aplicações stateless.


Use VPA.

Quando deseja otimizar CPU e memória.

Eliminar desperdício.

Evitar OOMKilled.

Melhorar desempenho.


Use Cluster Autoscaler.

Quando a infraestrutura precisa crescer automaticamente.

Principalmente em Cloud.

AWS.

Azure.

Google Cloud.

OpenShift.


O futuro: KEDA e Event-Driven Autoscaling

Os mecanismos que estudamos são apenas a base. Em arquiteturas modernas, surge um quarto componente importante: o KEDA (Kubernetes Event-Driven Autoscaling).

Enquanto o HPA reage principalmente a métricas como CPU e memória, o KEDA reage a eventos.

Imagine um sistema de processamento de boletos. Não importa a CPU; o importante é saber quantos boletos aguardam processamento em uma fila do IBM MQ ou do Kafka.

Se houver 10 mensagens, um Pod é suficiente.

Se houver 10.000 mensagens, o KEDA pode solicitar ao HPA dezenas de Pods para processar a fila rapidamente.

Esse modelo aproxima o Kubernetes dos conceitos de processamento orientado a filas, muito conhecidos por profissionais de Mainframe que trabalham com IBM MQ, CICS Trigger Transactions e Batch.


Conclusão

Quando começamos a estudar Kubernetes, é comum acreditar que autoscaling significa apenas "criar mais Pods". Porém, vimos que a realidade é muito mais rica. O ecossistema foi projetado para atacar diferentes gargalos de forma especializada:

  • HPA responde ao aumento da carga criando ou removendo Pods.

  • VPA ajusta CPU e memória para que cada Pod tenha os recursos ideais.

  • Cluster Autoscaler adiciona ou remove nós do cluster conforme a capacidade física necessária.

  • KEDA amplia essa inteligência ao escalar aplicações com base em eventos e filas.

Para um Programador COBOL Padawan, essa arquitetura não deve ser vista como algo completamente novo. Ela representa a evolução de princípios que sempre existiram no mundo corporativo: distribuir carga, otimizar recursos, garantir disponibilidade e controlar custos.

No IBM Z, esses objetivos eram alcançados com WLM, Parallel Sysplex, Capacity on Demand, regiões CICS, tuning de DB2 e planejamento de capacidade. No Kubernetes, os mesmos princípios são implementados de forma declarativa, automática e integrada à nuvem.

A tecnologia mudou. As ferramentas evoluíram. Mas a missão continua exatamente a mesma: entregar sistemas resilientes, escaláveis e eficientes, capazes de atender milhões de usuários sem desperdiçar recursos. É essa mentalidade de engenharia que transforma um desenvolvedor em um verdadeiro arquiteto de soluções modernas.


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...