<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yros Aguiar</title>
    <description>The latest articles on DEV Community by Yros Aguiar (@yros_aguiar_e4a99aaab452d).</description>
    <link>https://dev.to/yros_aguiar_e4a99aaab452d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3244177%2F5200e602-b058-4d04-9502-bfb28b929882.jpg</url>
      <title>DEV Community: Yros Aguiar</title>
      <link>https://dev.to/yros_aguiar_e4a99aaab452d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yros_aguiar_e4a99aaab452d"/>
    <language>en</language>
    <item>
      <title>Como minizamos timeouts intermitentes em transações ISO-8583 com ajustes em TCP e buffers no Python</title>
      <dc:creator>Yros Aguiar</dc:creator>
      <pubDate>Wed, 04 Jun 2025 12:36:14 +0000</pubDate>
      <link>https://dev.to/yros_aguiar_e4a99aaab452d/como-minizamos-timeouts-intermitentes-em-transacoes-iso-8583-com-ajustes-em-tcp-e-buffers-no-python-k0f</link>
      <guid>https://dev.to/yros_aguiar_e4a99aaab452d/como-minizamos-timeouts-intermitentes-em-transacoes-iso-8583-com-ajustes-em-tcp-e-buffers-no-python-k0f</guid>
      <description>&lt;p&gt;Durante a operação de um sistema de pagamentos de uma fintech brasileira baseado em transações via protocolo ISO8583 (Maquininhas e Transações fisicas), nossa equipe enfrentou um desafio crítico: &lt;strong&gt;timeouts intermitentes na comunicação com o adquirente&lt;/strong&gt;, afetando a confiabilidade e latência das autorizações.&lt;/p&gt;

&lt;p&gt;Após uma análise detalhada e aplicação de técnicas de debugging em redes e sockets, conseguimos minimizar o problema &lt;strong&gt;com ajustes precisos nas configurações de TCP e buffers do socket Python&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📍 O cenário
&lt;/h2&gt;

&lt;p&gt;Nosso sistema, escrito em Python, se conectava diretamente ao adquirente utilizando uma implementação customizada do protocolo ISO 8583 sobre TCP/IP. Em determinados horários, notamos que as requisições apresentavam &lt;strong&gt;timeouts aparentemente aleatórios&lt;/strong&gt;, mesmo quando o servidor remoto (adquirente) estava saudável e o payload estava correto.&lt;/p&gt;

&lt;p&gt;Esses timeouts, além de prejudicar a taxa de sucesso das transações, também aumentavam a complexidade operacional e exigiam reprocessamentos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é o protocolo ISO 8583?&lt;/strong&gt;&lt;br&gt;
ISO 8583 é um padrão internacional que define como sistemas de transações financeiras eletrônicas (como cartões de crédito, débito e terminais POS/ATM) devem se comunicar.&lt;/p&gt;

&lt;p&gt;Criado originalmente para o setor bancário, ele especifica a estrutura das mensagens, os campos de dados, os tipos de transações (como venda, cancelamento, consulta de saldo) e como essas mensagens devem ser codificadas, transmitidas e interpretadas entre sistemas como adquirentes, emissores, gateways e redes de pagamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais características:&lt;/strong&gt;&lt;br&gt;
Usa o modelo cliente-servidor sobre TCP/IP ou outras camadas.&lt;/p&gt;

&lt;p&gt;Cada mensagem contém um MTI (Message Type Identifier) que define seu propósito (ex: requisição de autorização).&lt;/p&gt;

&lt;p&gt;Os dados são organizados em campos numerados chamados Data Elements (DE).&lt;/p&gt;

&lt;p&gt;Pode ter bitmaps para indicar quais campos estão presentes.&lt;/p&gt;

&lt;p&gt;É um protocolo binário ou ASCII estruturado, dependendo da implementação.&lt;/p&gt;

&lt;p&gt;Exemplo de mensagens:&lt;br&gt;
0100 – Requisição de autorização.&lt;/p&gt;

&lt;p&gt;0110 – Resposta à autorização.&lt;/p&gt;

&lt;p&gt;0200 – Transação financeira (ex: compra).&lt;/p&gt;

&lt;p&gt;0420 – Estorno.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔍 Como debugamos
&lt;/h2&gt;

&lt;p&gt;Nosso processo de investigação seguiu as seguintes etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Habilitamos logs de baixo nível&lt;/strong&gt; no cliente ISO 8583, incluindo logs de envio, recebimento e tempo de resposta.&lt;/li&gt;
&lt;li&gt;Utilizamos ferramentas como &lt;code&gt;tcpdump&lt;/code&gt;, &lt;code&gt;wireshark&lt;/code&gt; e &lt;code&gt;netstat&lt;/code&gt; para observar o comportamento da conexão TCP.&lt;/li&gt;
&lt;li&gt;Monitoramos filas de sistema, utilização de file descriptors e buffers de socket no sistema operacional.&lt;/li&gt;
&lt;li&gt;Correlacionamos os horários de falha com picos de volume e throughput de rede.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com isso, identificamos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;strong&gt;buffer de envio e recepção do socket estava sendo saturado&lt;/strong&gt; em alguns momentos.&lt;/li&gt;
&lt;li&gt;A latência aumentava ligeiramente antes dos timeouts.&lt;/li&gt;
&lt;li&gt;Havia retransmissões TCP e atrasos no ACK durante a transmissão do pacote ISO.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🛠️ A solução: ajustes nos sockets
&lt;/h2&gt;

&lt;p&gt;Realizamos os seguintes ajustes no cliente ISO 8583 Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;

&lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Aumentamos os buffers de envio e recepção
&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setsockopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOL_SOCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SO_SNDBUF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setsockopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOL_SOCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SO_RCVBUF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Definimos TCP_NODELAY para evitar delays por Nagle
&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setsockopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IPPROTO_TCP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TCP_NODELAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Reduzimos o timeout para reações rápidas
&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Ajustável conforme SLA do adquirente
&lt;/span&gt;
&lt;span class="c1"&gt;# Conectamos e seguimos com a transmissão
&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;strong&gt;Links úteis sobre ISO 8583:&lt;/strong&gt;&lt;br&gt;
Wikipedia (Inglês)&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/ISO_8583" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/ISO_8583&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ISO 8583 Message Structure&lt;br&gt;
&lt;a href="https://www.ibm.com/docs/en/devops-test-workbench/11.0.2?topic=schemas-iso-8583-overview-structure" rel="noopener noreferrer"&gt;https://www.ibm.com/docs/en/devops-test-workbench/11.0.2?topic=schemas-iso-8583-overview-structure&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ISO 8583 Emulator Server&lt;br&gt;
&lt;a href="https://github.com/yrosaguiar/iso8583-server" rel="noopener noreferrer"&gt;https://github.com/yrosaguiar/iso8583-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repositório Python ISO8583 (PyISO8583)&lt;br&gt;
&lt;a href="https://pypi.org/project/pyiso8583/" rel="noopener noreferrer"&gt;https://pypi.org/project/pyiso8583/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Doc estrutura ISO8583&lt;br&gt;
&lt;a href="https://pyiso8583.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;https://pyiso8583.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🧠 De 3 meses para 20 minutos: GitOps multi-cluster com Oracle APEX e Kubernetes na Oracle Cloud</title>
      <dc:creator>Yros Aguiar</dc:creator>
      <pubDate>Wed, 04 Jun 2025 12:08:44 +0000</pubDate>
      <link>https://dev.to/yros_aguiar_e4a99aaab452d/de-3-meses-para-20-minutos-gitops-multi-cluster-com-oracle-apex-e-kubernetes-na-oracle-cloud-7g3</link>
      <guid>https://dev.to/yros_aguiar_e4a99aaab452d/de-3-meses-para-20-minutos-gitops-multi-cluster-com-oracle-apex-e-kubernetes-na-oracle-cloud-7g3</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Um processo manual e demorado era o principal gargalo de um cliente que operava exclusivamente na Oracle Cloud. Para cada novo cliente final, era necessário provisionar um ambiente completo de forma manual: redes, bancos Oracle e MySQL, aplicação Oracle APEX e APIs PHP e sem migrations. Com uma equipe enxuta, esse processo levava &lt;strong&gt;até 3 meses&lt;/strong&gt;, sendo &lt;strong&gt;mais de 30 dias apenas com infraestrutura&lt;/strong&gt;. Ele não tinha github e as aplicações eram instaladas a partir de um ZIP (isso mesmo) um arquivo ZIP em cada servidor toda vez que criava um ambiente novo, fazia tudo na mão.&lt;/p&gt;

&lt;p&gt;Neste artigo, conto como implementamos uma arquitetura GitOps multi-cluster com &lt;strong&gt;Terraform&lt;/strong&gt;, &lt;strong&gt;Kubernetes&lt;/strong&gt;, &lt;strong&gt;ArgoCD&lt;/strong&gt; e &lt;strong&gt;Oracle Operator&lt;/strong&gt;, que reduziu o provisionamento de novos ambientes para &lt;strong&gt;20 minutos&lt;/strong&gt;, mantendo segurança, versionamento, escalabilidade e total automação.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cenário anterior
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Infraestrutura provisionada manualmente.&lt;/li&gt;
&lt;li&gt;Sem uso de Git, CI/CD ou pipelines.&lt;/li&gt;
&lt;li&gt;Para cada cliente final:

&lt;ul&gt;
&lt;li&gt;Instância separada de banco Oracle (com APEX)&lt;/li&gt;
&lt;li&gt;APIs PHP rodando em máquinas separadas&lt;/li&gt;
&lt;li&gt;Banco MySQL separado&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Processos repetitivos, com alto risco de erro humano e sem rastreabilidade.&lt;/li&gt;

&lt;li&gt;Time pequeno sobrecarregado, gerando atrasos e impossibilidade de escalar.&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Arquitetura atual
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔷 Cluster HUB (Infraestrutura Central)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ArgoCD (para App of Apps)&lt;/li&gt;
&lt;li&gt;Github for SCM and Workflows&lt;/li&gt;
&lt;li&gt;Terraform para criação da infra OCI.&lt;/li&gt;
&lt;li&gt;Grafana e Prometheus (observabilidade centralizada)&lt;/li&gt;
&lt;li&gt;Bitwarden Vault (gestão de segredos)&lt;/li&gt;
&lt;li&gt;Pritunl VPN (acesso seguro)&lt;/li&gt;
&lt;li&gt;Ingress NGINX&lt;/li&gt;
&lt;li&gt;Cert Manager&lt;/li&gt;
&lt;li&gt;External DNS&lt;/li&gt;
&lt;li&gt;External Secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Clusters UAT e PRD (Workloads por cliente)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aplicações por cliente isoladas via &lt;strong&gt;namespace&lt;/strong&gt; e/ou NodeGroups&lt;/li&gt;
&lt;li&gt;Operadores e serviços &lt;strong&gt;compartilhados&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Ingress NGINX&lt;/li&gt;
&lt;li&gt;Cert Manager&lt;/li&gt;
&lt;li&gt;Oracle Operator&lt;/li&gt;
&lt;li&gt;KEDA&lt;/li&gt;
&lt;li&gt;External DNS&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Cada namespace contém:

&lt;ul&gt;
&lt;li&gt;Aplicação Oracle APEX&lt;/li&gt;
&lt;li&gt;APIs PHP&lt;/li&gt;
&lt;li&gt;MySQL (quando necessário)&lt;/li&gt;
&lt;li&gt;Configurações personalizadas via Kustomize&lt;/li&gt;
&lt;li&gt;Regras de RBAC, quotas e secrets isolados&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Blueprint GitOps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub é o &lt;strong&gt;source of truth&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cada cliente é provisionado em um &lt;strong&gt;namespace dedicado&lt;/strong&gt; no cluster UAT e PRD.&lt;/li&gt;
&lt;li&gt;O ArgoCD, rodando no HUB, aplica os manifestos em cada cluster com base em blueprints.&lt;/li&gt;
&lt;li&gt;O uso de &lt;strong&gt;Kustomize&lt;/strong&gt; permite modificar variáveis específicas por cliente.&lt;/li&gt;
&lt;li&gt;Todo provisionamento é feito via GitOps, com histórico e rollback garantidos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Como funciona a entrega de um novo cliente?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Um novo cliente é fechado pelo time comercial.&lt;/li&gt;
&lt;li&gt;Um novo namespace é criado via commit em repositório Git.&lt;/li&gt;
&lt;li&gt;O ArgoCD sincroniza os blueprints no cluster correto (UAT ou PRD).&lt;/li&gt;
&lt;li&gt;Oracle Operator cria o banco  Oracle e configura o Oracle APEX automaticamente.&lt;/li&gt;
&lt;li&gt;APIs PHP e banco MySQL são criados com Helm/Kustomize.&lt;/li&gt;
&lt;li&gt;DNS, certificados SSL, segredos e regras de RBAC são aplicados.&lt;/li&gt;
&lt;li&gt;Em 20 minutos o ambiente está pronto e funcionando.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resultados
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Antes&lt;/th&gt;
&lt;th&gt;Depois&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tempo de provisionamento&lt;/td&gt;
&lt;td&gt;Até 3 meses&lt;/td&gt;
&lt;td&gt;20 minutos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalabilidade&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Automática&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segurança e rastreabilidade&lt;/td&gt;
&lt;td&gt;Inexistente&lt;/td&gt;
&lt;td&gt;Total com GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erros operacionais&lt;/td&gt;
&lt;td&gt;Frequentes&lt;/td&gt;
&lt;td&gt;Quase nulos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibilidade e monitoramento&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Grafana/Prometheus/KEDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custo humano por entrega&lt;/td&gt;
&lt;td&gt;Elevado&lt;/td&gt;
&lt;td&gt;Quase nulo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;🎯 Vantagens&lt;br&gt;
Reutilização de padrões: Um único modelo serve como base para múltiplos clientes.&lt;/p&gt;

&lt;p&gt;Velocidade e previsibilidade: Tudo padronizado, validado e rastreável via Git.&lt;/p&gt;

&lt;p&gt;Escalabilidade: Provisionar centenas de ambientes é questão de scripts e commits.&lt;/p&gt;
&lt;h2&gt;
  
  
  Segurança: RBAC, quotas e secrets configurados automaticamente.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Lições aprendidas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes pode funcionar muito bem com Oracle APEX com o uso correto de operadores.&lt;/li&gt;
&lt;li&gt;GitOps traz velocidade, previsibilidade e confiança no processo.&lt;/li&gt;
&lt;li&gt;Multi-cluster com Hub-and-Spoke ajuda a separar responsabilidades e reduzir risco.&lt;/li&gt;
&lt;li&gt;Ter um cluster HUB para ferramentas e clusters para workloads melhora a gestão de recursos.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CI para APIs PHP com testes e deploys contínuos.&lt;/li&gt;
&lt;li&gt;Portal de autoatendimento para novos ambientes.&lt;/li&gt;
&lt;li&gt;Monitoramento por tenant com dashboards dinâmicos.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔍 Diagrama da Arquitetura
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0p8ap23drhgdcyrnvij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0p8ap23drhgdcyrnvij.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  GitOps Approach com Blueprints
&lt;/h2&gt;

&lt;p&gt;📘 O que são Blueprints em GitOps?&lt;br&gt;
No seu projeto, Blueprints são modelos declarativos versionados que definem a estrutura de provisionamento de um cliente dentro do Kubernetes. Eles são armazenados em Git e utilizados como fonte de verdade pelo ArgoCD para criar namespaces, bancos de dados, aplicações e serviços — tudo sob demanda, de forma padronizada.&lt;/p&gt;

&lt;p&gt;🧱 O papel dos Blueprints na arquitetura&lt;br&gt;
Cada Blueprint inclui:&lt;br&gt;
Estrutura de namespace (com labels, quotas, RBAC)&lt;/p&gt;

&lt;p&gt;Manifests para aplicações (Oracle APEX, APIs PHP)&lt;/p&gt;

&lt;p&gt;Definição de PVCs e limites de recursos&lt;/p&gt;

&lt;p&gt;Configuração de bancos de dados via Oracle Operator e MySQL&lt;/p&gt;

&lt;p&gt;Secrets e ConfigMaps necessários&lt;/p&gt;

&lt;p&gt;Integração com Cert Manager, External DNS, KEDA etc.&lt;/p&gt;

&lt;p&gt;Exemplo de organização:&lt;/p&gt;

&lt;p&gt;clientes/&lt;br&gt;
├── cliente-xpto/&lt;br&gt;
│   ├── namespace.yaml&lt;br&gt;
│   ├── apex-db.yaml&lt;br&gt;
│   ├── php-api-deployment.yaml&lt;br&gt;
│   ├── mysql-db.yaml&lt;br&gt;
│   ├── ingress.yaml&lt;br&gt;
│   ├── kustomization.yaml&lt;/p&gt;

&lt;p&gt;🔁 &lt;strong&gt;Fluxo GitOps com Blueprints&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Time comercial fecha com um novo cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time de operações clona o blueprint base e adapta o nome do cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um commit é feito no Git com o novo blueprint sob gitops/clientes/xpto/uat ou gitops/clientes/xpto/prd (esses são os overlays) que apontam para uma base com os objetos do k8s gitops/clientes/base/&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O ArgoCD (que vive no cluster HUB) detecta o novo caminho e aplica o conteúdo no cluster correto (UAT ou PRD).&lt;/p&gt;

&lt;p&gt;Em poucos minutos, o namespace, banco, aplicação e todos os recursos estão provisionados.&lt;/p&gt;

&lt;p&gt;🎯 Vantagens&lt;br&gt;
Reutilização de padrões: Um único modelo serve como base para múltiplos clientes.&lt;/p&gt;

&lt;p&gt;Velocidade e previsibilidade: Tudo padronizado, validado e rastreável via Git.&lt;/p&gt;

&lt;p&gt;Escalabilidade: Provisionar centenas de ambientes é questão de scripts e commits.&lt;/p&gt;

&lt;p&gt;Segurança: RBAC, quotas e secrets configurados automaticamente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Oracle DB Operator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O OracleDB Operator é um operador Kubernetes de código aberto criado para facilitar o provisionamento, gerenciamento e operação de bancos de dados Oracle dentro de clusters Kubernetes, seguindo os padrões do modelo Kubernetes Operator Pattern.&lt;/p&gt;

&lt;p&gt;Ele abstrai a complexidade da instalação e administração do Oracle Database, permitindo que você crie e gerencie instâncias de banco de dados Oracle diretamente a partir de manifests YAML versionados, como parte de um fluxo GitOps com ferramentas como ArgoCD e Kustomize.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oracle/oracle-database-operator" rel="noopener noreferrer"&gt;https://github.com/oracle/oracle-database-operator&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blogs.oracle.com/coretec/post/oracle-database-now-containernative" rel="noopener noreferrer"&gt;https://blogs.oracle.com/coretec/post/oracle-database-now-containernative&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Principais Funcionalidades&lt;/strong&gt;&lt;br&gt;
Provisionamento automático de Oracle Database:&lt;/p&gt;

&lt;p&gt;Versões suportadas: Oracle 12c, 19c, 21c (depende da imagem base utilizada).&lt;/p&gt;

&lt;p&gt;Instalação com persistência via PVC.&lt;/p&gt;

&lt;p&gt;Pode ser configurado com parâmetros de memória, CPU e configurações avançadas.&lt;/p&gt;

&lt;p&gt;Criação de usuários e schemas&lt;/p&gt;

&lt;p&gt;Possibilidade de definir usuários padrão, senhas e permissões no próprio YAML.&lt;/p&gt;

&lt;p&gt;Suporte a Oracle APEX&lt;/p&gt;

&lt;p&gt;Automatiza a instalação e configuração do APEX como aplicação web embutida.&lt;/p&gt;

&lt;p&gt;Backup e restore&lt;/p&gt;

&lt;p&gt;O operator inclue suporte para agendar backups automatizados via cron.&lt;/p&gt;

&lt;p&gt;Monitoramento e liveness/readiness probes&lt;/p&gt;

&lt;p&gt;Exposição de métricas via Prometheus &lt;/p&gt;

&lt;p&gt;🧩 &lt;strong&gt;Recursos Customizados (CRDs)&lt;/strong&gt;&lt;br&gt;
O Operator cria alguns CRDs (Custom Resource Definitions) como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: db.oracle.com/v1alpha1
kind: OracleDatabase
metadata:
  name: cliente-x-db
spec:
  edition: "enterprise"
  version: "19c"
  apex:
    enabled: true
    adminPassword: "SenhaSuperSegura"
  storage:
    size: 50Gi
  resources:
    requests:
      memory: "4Gi"
      cpu: "2"
    limits:
      memory: "8Gi"
      cpu: "4"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse YAML cria uma nova instância de Oracle DB com APEX habilitado, configurado automaticamente.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;GitOps e ArgoCD&lt;/strong&gt;&lt;br&gt;
Integrar o OracleDB Operator com ArgoCD permite que:&lt;/p&gt;

&lt;p&gt;A criação de novos bancos seja desencadeada por um commit Git.&lt;/p&gt;

&lt;p&gt;A configuração dos bancos, APEX, usuários e permissões fiquem versionadas.&lt;/p&gt;

&lt;p&gt;A infraestrutura de dados se beneficie de auditoria, rollback, CI/CD e reprodutibilidade.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Benefícios para Arquiteturas Multi-Tenant&lt;/strong&gt;&lt;br&gt;
Em arquiteturas como a sua (multi-tenant com namespaces por cliente), o OracleDB Operator permite:&lt;/p&gt;

&lt;p&gt;Criar uma instância de banco para cada cliente isoladamente.&lt;/p&gt;

&lt;p&gt;Controlar o ciclo de vida de cada banco via YAML.&lt;/p&gt;

&lt;p&gt;Compartilhar o operador no cluster, mantendo instâncias separadas por namespace.&lt;/p&gt;

&lt;p&gt;Reduzir drasticamente o tempo de entrega e o risco de erros humanos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprints Structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gitops
├── applicationsets
│   ├── infrastructure
│   │   └── helm-addons
│   │       ├── airflow
│   │       ├── keda
│   │       ├── prometheus
│   │       ├── uptimerobot
│   │       └── vaultwarden
│   │           └── repo
│   ├── template
│   └── workloads
├── bootstrap
│   └── projects
└── kustomize
    ├── infrastructure
    │   ├── cert-manager
    │   │   ├── hub
    │   │   ├── prd
    │   │   └── uat
    │   ├── cluster-addons
    │   │   ├── prd
    │   │   └── uat
    │   ├── external-dns
    │   │   ├── hub
    │   │   ├── prd
    │   │   └── uat
    │   ├── grafana
    │   ├── imc
    │   ├── ingress-nginx
    │   ├── operators
    │   │   ├── mysql
    │   │   └── oracledb
    │   ├── prometheus
    │   └── rabbitmq
    └── workloads
        ├── base
        │   ├── apex
        │   ├── api-1
        │   ├── api-2
        │   └── xpto-scripts
        │       └── backup-cli
        └── environments
            ├── demo
            │   ├── prd
            │   └── uat
            ├── client-1
            │   ├── prd
            │   └── uat
            ├── client-2
            │   ├── prd
            │   └── uat
            ├── client-3
            │   ├── prd
            │   └── uat
            └── test
                └── uat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Customer environment Application Set Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: demo
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
    - list:
        elements:
          - cluster: xpto-uat
            url: "https://168.77.99.106:6443"
            values:
              project: xpto-uat
              environment: uat

          - cluster: xpto-prd
            url: "https://144.23.199.200:6443"
            values:
              project: xpto-prd
              environment: prd

  template:
    metadata:
      name: "xpto-demo-{{.values.environment}}"
    spec:
      project: "{{.values.project}}"
      sources:
        - path: gitops/kustomize/workloads/environments/demo/{{.values.environment}}
          repoURL: git@github.com:xpto/devops.git
          targetRevision: HEAD
      destination:
        server: "{{.url}}"
        namespace: demo
      syncPolicy:
        retry:
          backoff:
            duration: 5s
            factor: 2
            maxDuration: 3m0s
          limit: 2
        syncOptions:
          - ApplyOutOfSyncOnly=false
          - CreateNamespace=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ArgoCD Prints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq5yt2j2xrabxf90gc2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq5yt2j2xrabxf90gc2g.png" alt="Image description" width="691" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffokp5vi5vv5m7za4xx9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffokp5vi5vv5m7za4xx9z.png" alt="Image description" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você curtiu esse conteúdo ou está pensando em migrar workloads para Kubernetes, me chama no LinkedIn 👋&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Como migrei Azure Functions e Container Apps para Kubernetes (GKE) usando GitOps</title>
      <dc:creator>Yros Aguiar</dc:creator>
      <pubDate>Wed, 04 Jun 2025 10:43:34 +0000</pubDate>
      <link>https://dev.to/yros_aguiar_e4a99aaab452d/como-migrei-azure-functions-e-container-apps-para-kubernetes-gke-usando-gitops-pdd</link>
      <guid>https://dev.to/yros_aguiar_e4a99aaab452d/como-migrei-azure-functions-e-container-apps-para-kubernetes-gke-usando-gitops-pdd</guid>
      <description>&lt;p&gt;Recentemente, conduzi um projeto de migração que uniu eficiência, modernização e &lt;strong&gt;redução total de custos&lt;/strong&gt;. A missão era clara: &lt;strong&gt;mover todas as Azure Functions e Container Apps de um cliente para Kubernetes&lt;/strong&gt;, sem reescrever código, e usando apenas recursos gratuitos disponíveis via créditos GCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 O desafio
&lt;/h2&gt;

&lt;p&gt;O cliente rodava sua stack em Azure Functions Premium + Azure Container Apps. O custo médio mensal era de &lt;strong&gt;£6.000&lt;/strong&gt; e os créditos da Azure estavam acabando.&lt;/p&gt;

&lt;p&gt;A stack era baseada em &lt;strong&gt;eventos de Storage Blob&lt;/strong&gt; que disparavam o processamento de arquivos. Nossa meta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduzir drasticamente os custos;&lt;/li&gt;
&lt;li&gt;Manter o código das functions intacto;&lt;/li&gt;
&lt;li&gt;Tornar a arquitetura multi-cloud e agnóstica;&lt;/li&gt;
&lt;li&gt;Utilizar créditos disponíveis no GCP;&lt;/li&gt;
&lt;li&gt;Manter a experiência serverless com escalabilidade automática.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Solução
&lt;/h2&gt;

&lt;p&gt;Optei por mover toda a stack para &lt;strong&gt;Kubernetes&lt;/strong&gt;, utilizando o &lt;a href="https://keda.sh" rel="noopener noreferrer"&gt;KEDA&lt;/a&gt; como motor de escalabilidade baseada em eventos — que, aliás, &lt;strong&gt;é usado internamente pela própria Microsoft para escalar Azure Functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Toda a infraestrutura foi provisionada com &lt;strong&gt;Terraform&lt;/strong&gt;, e a estratégia de implantação seguiu uma abordagem &lt;strong&gt;GitOps baseada em Blueprints&lt;/strong&gt;, com &lt;strong&gt;ArgoCD&lt;/strong&gt; estruturado como &lt;strong&gt;App of Apps&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Etapas do projeto
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Containerização das Azure Functions&lt;/strong&gt;
Apenas criei &lt;code&gt;Dockerfile&lt;/code&gt;s compatíveis com o runtime de Azure Functions.
➕ &lt;strong&gt;Nenhuma modificação no código-fonte&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app &amp;amp;&amp;amp; \
mkdir -p /home/site/wwwroot &amp;amp;&amp;amp; \
dotnet publish *.csproj --output /home/site/wwwroot

FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true

ENV TZ=Europe/London
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone

EXPOSE 80 10000 10001 10002

COPY --from=installer-env /home/site/wwwroot /home/site/wwwroot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provisionamento&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Terraform:&lt;/strong&gt; Toda a parte de recursos de cloud — K8s clusters, VPC, Nat Gateways, etc, helm do ArgoCD e External secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitOps com ArgoCD App of Apps:&lt;/strong&gt; External DNS, Metrics Server, Ingress nginx, ArgoCD, Prometheus, Grafana, Github Actions Controller, KEDA, Metabase, Cert Manager, Reloader, SonarQube&lt;/p&gt;

&lt;h3&gt;
  
  
  O Bootstrap do ambiente
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No Ambiente HUB&lt;/strong&gt;&lt;br&gt;
O Terraform cria o rede, cluster, e componentes de Rede, instala o ArgoCD e external secrets,e cria a app of apps no ArgoCD, após isso todo o restante é configurado&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nos Ambientes de Workloads&lt;/strong&gt;&lt;br&gt;
O Terraform cria os componentes de Rede e o Cluster, quando é realizado o Sync no App of Apps do Workload, toda a estrutura é configurada no cluster.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se utilizar Crossplane compositions ao inves de terraform o Bootstrap fica no GitOps e ArgoCD pra tudo dos workloads, inclusive os resources de cloud.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passos
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ambiente inicial na Azure (AKS)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para validação inicial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subi cluster AKS;&lt;/li&gt;
&lt;li&gt;Implantei ArgoCD e criei um approach App of Apps;&lt;/li&gt;
&lt;li&gt;Configurei pipelines CI/CD no github&lt;/li&gt;
&lt;li&gt;Instalei e configure o KEDA integrado com Azure Storage Queue;&lt;/li&gt;
&lt;li&gt;Usei blueprint GitOps para controlar todos os manifests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migração para GCP (GKE)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Após validação, repliquei a infraestrutura no &lt;strong&gt;GKE&lt;/strong&gt;, utilizando os &lt;strong&gt;créditos do GCP&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
✅ Resultado: &lt;strong&gt;stack completa rodando sem custo mensal&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Triggers com KEDA&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O KEDA escutava o &lt;strong&gt;Azure Blob Storage&lt;/strong&gt; diretamente, usando &lt;code&gt;ScaledObject&lt;/code&gt; com &lt;code&gt;blobTrigger&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manutenção do Azure Storage (baixo custo)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O Blob Storage permaneceu na Azure por questões de integração legada, mas gerando menos de &lt;strong&gt;£10 por mês&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitOps com ArgoCD + App of Apps&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A estrutura baseada em &lt;strong&gt;blueprints versionados em Git&lt;/strong&gt; permitiu replicar ambientes de forma segura, auditável e reproduzível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escalabilidade inteligente&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A combinação &lt;strong&gt;KEDA + GKE Cluster Autoscaler&lt;/strong&gt; garantiu escalabilidade automática e econômica, mantendo o comportamento serverless.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kzdgsi1nf7gzoeugn3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kzdgsi1nf7gzoeugn3h.png" alt="Image description" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gitops Approach
&lt;/h3&gt;

&lt;p&gt;Blueprints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que são GitOps Blueprints (e como usei em um projeto real)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se você já trabalhou com &lt;strong&gt;GitOps&lt;/strong&gt;, deve ter percebido que chega um momento em que começa a repetir estruturas e configurações entre ambientes (dev, prd, stg...).&lt;br&gt;&lt;br&gt;
É aí que entram os &lt;strong&gt;GitOps Blueprints&lt;/strong&gt;: modelos reutilizáveis de infraestrutura e aplicações, versionados em Git, que te ajudam a &lt;strong&gt;padronizar e automatizar&lt;/strong&gt; o provisionamento completo de clusters Kubernetes (ou similares).&lt;/p&gt;




&lt;h3&gt;
  
  
  🔧 O que é um GitOps Blueprint?
&lt;/h3&gt;

&lt;p&gt;Um &lt;strong&gt;GitOps Blueprint&lt;/strong&gt; é como um &lt;em&gt;template de infraestrutura + aplicações&lt;/em&gt; que pode ser reaplicado em diferentes ambientes ou clusters com poucas mudanças.&lt;/p&gt;

&lt;p&gt;Basicamente, você define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Componentes base&lt;/strong&gt; (KEDA, Prometheus, Grafana, etc);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurações parametrizáveis&lt;/strong&gt; via Helm ou Kustomize;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estrutura de ambientes&lt;/strong&gt; (ex: DEV, PRD, QA);&lt;/li&gt;
&lt;li&gt;E deixa tudo versionado no Git.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A automação fica por conta de ferramentas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://argo-cd.readthedocs.io/en/stable/" rel="noopener noreferrer"&gt;ArgoCD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fluxcd.io" rel="noopener noreferrer"&gt;FluxCD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Terraform (opcional, para provisionamento de infra)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 Quando usar?
&lt;/h3&gt;

&lt;p&gt;Você deve usar &lt;strong&gt;GitOps Blueprints&lt;/strong&gt; quando:&lt;/p&gt;

&lt;p&gt;✅ Precisa criar múltiplos ambientes com a mesma stack;&lt;br&gt;&lt;br&gt;
✅ Quer aplicar boas práticas de IaC e GitOps;&lt;br&gt;&lt;br&gt;
✅ Busca portabilidade entre clouds (Azure, GCP, AWS);&lt;br&gt;&lt;br&gt;
✅ Precisa versionar tudo que está sendo implantado no cluster;&lt;br&gt;&lt;br&gt;
✅ Trabalha com &lt;strong&gt;multi-tenant&lt;/strong&gt; ou &lt;strong&gt;multi-cluster&lt;/strong&gt; setups.&lt;/p&gt;




&lt;p&gt;Utilizei applicationsets do ArgoCD podendo usar kustomize, helm ou manifestos raw na mesma aplicação argo, utilizando o approach multiple sources&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main App of Apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfbkeqxpx77bzd4agsu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfbkeqxpx77bzd4agsu8.png" alt="Image description" width="740" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure app of Apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7bydiylzs6fygi0utsn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7bydiylzs6fygi0utsn.png" alt="Image description" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workloads App of Apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx64rc7e48xq3oage1e0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx64rc7e48xq3oage1e0o.png" alt="Image description" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📁 Estrutura de repositório GitOps Blueprints
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform
 ├──hub (Terraform code para o HUB)
 └──workloads (Terraform code para os Workloads usando TF Workspaces)
gitops
 ├── applicationsets (argo applicationsets for infrastructure)
 │   ├── infrastructure-azure (applicationsets for Azure)
 │   ├── infrastructure-gcp (applicationsets for GCP)
 │   └── workloads (argo applicationsets for workloads)
 ├── helm-chart (generic template helm chart)
 │   └── templates
 │       └── tests
 └── kustomize
     └── infrastructure
         ├── cert-manager (cert manager overlays)
         │   |── gcp
         │   |   ├── dev
         │   |   ├── hub
         │   |   └── prd
         │   └── azure
         │       ├── dev
         │       ├── hub
         │       └── prd
         ├── external-dns (external DNS overlays)
         │   ├── azure
         │   │   ├── dev
         │   │   ├── hub
         │   │   └── prd
         │   └── gcp
         │       ├── dev
         │       ├── hub
         │       └── prd
         ├── ingress-nginx (Ingress nginx overlays)
         ├── metabase (metabase objects)
         ├── metrics-server (Metrics Server overlays)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ArgoCD applicationset usado para instalar o KEDA em multiplos ambientes
&lt;/h3&gt;

&lt;p&gt;O uso do applicationset ajuda a manter a aplicação instalada em multiplos ambientes e cluster, um applicationset pode ser usado para instalar uma ou várias aplicações em multiplas clouds e workloads&lt;/p&gt;

&lt;p&gt;&lt;a href="https://argo-cd.readthedocs.io/en/latest/user-guide/application-set/" rel="noopener noreferrer"&gt;https://argo-cd.readthedocs.io/en/latest/user-guide/application-set/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facv4wvufeus2o9zfki18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facv4wvufeus2o9zfki18.png" alt="Image description" width="371" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftymdrr9q4v93o00myuoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftymdrr9q4v93o00myuoa.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaled Object
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://keda.sh/docs/2.15/reference/scaledobject-spec/" rel="noopener noreferrer"&gt;https://keda.sh/docs/2.15/reference/scaledobject-spec/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4v3fmjwroaemx59r2m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4v3fmjwroaemx59r2m3.png" alt="Image description" width="268" height="521"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💰 Resultado final
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Antes (Azure)&lt;/th&gt;
&lt;th&gt;Depois (Kubernetes + GKE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custo mensal&lt;/td&gt;
&lt;td&gt;£6.000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0&lt;/strong&gt; (via créditos GCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reescrita de código&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Não foi necessário&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalabilidade&lt;/td&gt;
&lt;td&gt;Azure Premium Plans&lt;/td&gt;
&lt;td&gt;KEDA + GKE Autoscaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orquestração&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;GitOps com ArgoCD + Blueprints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisionamento&lt;/td&gt;
&lt;td&gt;Manual/Portal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% Terraform&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependência de cloud&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Ambiente agnóstico&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimativa pós-créditos&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;~$2.000/mês&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🧠 Lições aprendidas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O KEDA é confiável, maduro e &lt;strong&gt;realmente pronto para produção&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Arquitetura cloud-native com &lt;strong&gt;GitOps e Terraform&lt;/strong&gt; permite &lt;strong&gt;portabilidade real entre clouds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Kubernetes &lt;strong&gt;não precisa ser caro&lt;/strong&gt;: com estratégia e créditos certos, ele pode custar zero.&lt;/li&gt;
&lt;li&gt;Muitos sistemas legados podem ser migrados &lt;strong&gt;sem reescrita de código&lt;/strong&gt; — só mudando a forma como são executados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blueprints + ArgoCD&lt;/strong&gt; oferecem governança e replicabilidade de ambientes em escala.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Se Usarmos um Crossplane o blueprints fica totalmente resiliente e o provisionamento fica muito rápido, ficando uma estrutura totalmente GitOps&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Se você curtiu esse conteúdo ou está pensando em migrar workloads para Kubernetes, me chama no &lt;a href="https://www.linkedin.com/in/yros-aguiar-6a893b32/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; 👋  &lt;/p&gt;







</description>
      <category>kubernetes</category>
      <category>gke</category>
      <category>gitops</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
