<?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: Pedro Oliveira</title>
    <description>The latest articles on DEV Community by Pedro Oliveira (@pramos).</description>
    <link>https://dev.to/pramos</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%2F3778530%2F8adc1f8f-3bad-45e1-897a-e5e9073b2ae8.jpeg</url>
      <title>DEV Community: Pedro Oliveira</title>
      <link>https://dev.to/pramos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pramos"/>
    <language>en</language>
    <item>
      <title>Kubernetes sem Cloud Provider (Parte 1): CNI, Storage Dinâmico, Ingress e Arquitetura Terraform</title>
      <dc:creator>Pedro Oliveira</dc:creator>
      <pubDate>Wed, 18 Feb 2026 02:40:16 +0000</pubDate>
      <link>https://dev.to/pramos/kubernetes-sem-cloud-provider-parte-1-cni-storage-dinamico-ingress-e-arquitetura-terraform-eof</link>
      <guid>https://dev.to/pramos/kubernetes-sem-cloud-provider-parte-1-cni-storage-dinamico-ingress-e-arquitetura-terraform-eof</guid>
      <description>&lt;p&gt;Durante muito tempo — e ainda hoje em muitos cenários on-premises — o Kubernetes foi (e é) executado sem integrações nativas de cloud provider. Antes de EKS, GKE e AKS se tornarem padrão, era responsabilidade do operador configurar explicitamente rede, armazenamento, ingress, identidade e registry.&lt;/p&gt;

&lt;p&gt;Este artigo é a primeira parte de uma série onde documento a construção de um cluster executando sobre &lt;code&gt;Kubernetes in Docker (KinD)&lt;/code&gt;, focando em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de CNI (rede de pods)&lt;/li&gt;
&lt;li&gt;Provisionamento dinâmico de storage com CSI&lt;/li&gt;
&lt;li&gt;Configuração de Ingress&lt;/li&gt;
&lt;li&gt;Estruturação e automação completa via Terraform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;A parte de TLS com Vault e cert-manager ficará para o próximo artigo, pois ainda estou finalizando essa integração.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🎯 Motivação
&lt;/h1&gt;

&lt;p&gt;Em ambientes gerenciados, temos automaticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CNI integrada à VPC&lt;/li&gt;
&lt;li&gt;Provisionamento dinâmico de discos&lt;/li&gt;
&lt;li&gt;Load Balancers&lt;/li&gt;
&lt;li&gt;Integrações de identidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas nada disso é inerente ao Kubernetes. São componentes adicionais configurados pelo provedor.&lt;/p&gt;

&lt;p&gt;A proposta deste projeto foi remover essas abstrações e implementar manualmente as capacidades essenciais de um cluster funcional.&lt;/p&gt;

&lt;p&gt;Você não precisa saber mecânica para dirigir.&lt;br&gt;
Mas quando o carro para no meio da estrada, esse conhecimento faz diferença.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧱 Arquitetura do Projeto
&lt;/h1&gt;

&lt;p&gt;O cluster foi criado com KinD e inicialmente não possuía:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CNI funcional&lt;/li&gt;
&lt;li&gt;Provisionador de storage&lt;/li&gt;
&lt;li&gt;Ingress Controller&lt;/li&gt;
&lt;li&gt;Integrações externas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A partir disso, foram adicionados os seguintes componentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Rede — CNI com Calico
&lt;/h2&gt;

&lt;p&gt;Para permitir comunicação entre pods e nós, foi instalado o:&lt;br&gt;
&lt;code&gt;Calico&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Funções habilitadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atribuição de IPs aos pods&lt;/li&gt;
&lt;li&gt;Encapsulamento VXLAN&lt;/li&gt;
&lt;li&gt;Network Policies&lt;/li&gt;
&lt;li&gt;Comunicação inter-node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem CNI, pods não se comunicam — esse é o primeiro requisito real para um cluster utilizável.&lt;/p&gt;

&lt;h2&gt;
  
  
  💾 Storage Dinâmico — OpenEBS
&lt;/h2&gt;

&lt;p&gt;Para substituir o papel que discos gerenciados fariam em cloud, implementei:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OpenEBS&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Com isso foi possível:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar StorageClasses&lt;/li&gt;
&lt;li&gt;Provisionar PVCs dinamicamente&lt;/li&gt;
&lt;li&gt;Utilizar backend baseado em armazenamento local&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso reproduz o comportamento esperado por aplicações stateful em qualquer ambiente Kubernetes.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Estrutura Terraform — Organização Modular
&lt;/h1&gt;

&lt;p&gt;O repositório do módulo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pedrohro1992/tf-module-kind-cluster.git" rel="noopener noreferrer"&gt;https://github.com/pedrohro1992/tf-module-kind-cluster.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O módulo  &lt;code&gt;tf-module-kind-blueprint&lt;/code&gt; atua como um módulo agregador.&lt;/p&gt;

&lt;p&gt;Essa técnica é conhecida como:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Module Composition Pattern (ou Aggregator Module Pattern)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nesse modelo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O módulo raiz não implementa recursos diretamente&lt;/li&gt;
&lt;li&gt;Ele compõe módulos especializados&lt;/li&gt;
&lt;li&gt;Centraliza variáveis e dependências&lt;/li&gt;
&lt;li&gt;Expõe uma interface limpa para consumo
Cada componente (CNI, OpenEBS, NGINX Ingress) está encapsulado em seu próprio módulo Terraform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vantagens arquiteturais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separação clara de responsabilidades&lt;/li&gt;
&lt;li&gt;Modularidade&lt;/li&gt;
&lt;li&gt;Reutilização&lt;/li&gt;
&lt;li&gt;Organização escalável&lt;/li&gt;
&lt;li&gt;Manutenção facilitada&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧩 Desafios Técnicos
&lt;/h1&gt;

&lt;p&gt;Alguns pontos relevantes durante a implementação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coordenação entre providers (Kubernetes e Helm)&lt;/li&gt;
&lt;li&gt;Garantia de ordem correta de dependências&lt;/li&gt;
&lt;li&gt;Idempotência dos módulos&lt;/li&gt;
&lt;li&gt;Encadeamento de outputs&lt;/li&gt;
&lt;li&gt;Inicialização do provider Kubernetes apenas após cluster estar disponível&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automatizar componentes de infraestrutura dentro de um cluster recém-criado exige atenção especial ao ciclo de vida dos recursos.&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚠️ Disclaimer
&lt;/h1&gt;

&lt;p&gt;Tenho um senso de humor peculiar.&lt;/p&gt;

&lt;p&gt;O nome fictício da “empresa” usada como estudo de caso no código é:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cacetinho-SA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim, há referências a isso no código.&lt;br&gt;
É intencional. 😄&lt;/p&gt;

&lt;p&gt;💽 &lt;strong&gt;PVC&lt;/strong&gt; provisionado dinamicamente pelo OpenEBS&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%2Fj9oasy9zgmagfdk8mz5h.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%2Fj9oasy9zgmagfdk8mz5h.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔮 Próximos Passos
&lt;/h3&gt;

&lt;p&gt;Nos próximos artigos da série:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de Identity Provider&lt;/li&gt;
&lt;li&gt;OIDC e Workload Identity&lt;/li&gt;
&lt;li&gt;DNS automático do Ingress com ExternalDNS&lt;/li&gt;
&lt;li&gt;TLS automático no Ingress com:&lt;/li&gt;
&lt;li&gt;cert-manager&lt;/li&gt;
&lt;li&gt;HashiCorp Vault como CA&lt;/li&gt;
&lt;li&gt;Evolução para Gateway API&lt;/li&gt;
&lt;li&gt;Service Mesh multi-cluster com Istio&lt;/li&gt;
&lt;li&gt;Empacotamento como Composition Function no Crossplane&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(E provavelmente mais algumas ideias que surgirem no caminho.)&lt;/p&gt;




&lt;h1&gt;
  
  
  📌 Conclusão
&lt;/h1&gt;

&lt;p&gt;Rodar Kubernetes sem cloud provider não é algo exótico — foi assim que muitos clusters rodaram por anos, e ainda rodam em ambientes bare-metal, edge e data centers privados.&lt;/p&gt;

&lt;p&gt;Cloud providers apenas empacotam e integram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CNI&lt;/li&gt;
&lt;li&gt;CSI&lt;/li&gt;
&lt;li&gt;Ingress&lt;/li&gt;
&lt;li&gt;Identidade&lt;/li&gt;
&lt;li&gt;PKI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementar manualmente essas camadas muda completamente o nível de entendimento sobre a plataforma.&lt;/p&gt;

&lt;p&gt;Este projeto não foi apenas sobre “fazer funcionar”, mas sobre compreender o que está acontecendo por baixo das abstrações.&lt;/p&gt;

&lt;p&gt;No próximo artigo, entro na camada de identidade e TLS — que está se mostrando um desafio interessante.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>platformengineering</category>
      <category>terraform</category>
    </item>
  </channel>
</rss>
