<?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: Francisco das Chagas</title>
    <description>The latest articles on DEV Community by Francisco das Chagas (@francisco_daschagas).</description>
    <link>https://dev.to/francisco_daschagas</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4155899%2Fcd054459-cacf-4bb6-9e01-7789345d03da.png</url>
      <title>DEV Community: Francisco das Chagas</title>
      <link>https://dev.to/francisco_daschagas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/francisco_daschagas"/>
    <language>en</language>
    <item>
      <title>Migrar para o Envoy Gateway não é trocar YAML</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 01 Oct 2026 22:48:32 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/migrar-para-o-envoy-gateway-nao-e-trocar-yaml-2l02</link>
      <guid>https://dev.to/francisco_daschagas/migrar-para-o-envoy-gateway-nao-e-trocar-yaml-2l02</guid>
      <description>&lt;p&gt;O ingress-nginx não recebe patch de segurança desde março de 2026.&lt;br&gt;
Ele continua funcionando, e é por isso que o risco passa despercebido.&lt;/p&gt;

&lt;p&gt;A saída recomendada pelo próprio Kubernetes é a Gateway API, e o Envoy Gateway é uma das implementações dela. A tentação é tratar a migração como tradução: pegar cada anotação e reescrever no formato novo. Só que a migração não se resume a trocar YAML.&lt;/p&gt;

&lt;p&gt;No nginx, cada app levava a própria regra de IP numa anotação. No Envoy, a regra sobe para uma SecurityPolicy no Gateway compartilhado. Ela muda de dono: sai do time da app e vai para a plataforma. Um erro, que antes afetava uma app, agora afeta todas as rotas.&lt;/p&gt;

&lt;p&gt;Ela também muda de camada. A allowlist por IP é uma decisão de L3 tomada em L7. O proxy filtra o IP que ele acredita ser o do cliente. Se houver SNAT no caminho, todo mundo vira o IP do node. Se o X-Forwarded-For for aceito sem critério, qualquer um escreve o próprio IP.&lt;/p&gt;

&lt;p&gt;Abaixo, os pontos que a documentação confirma e que eu teria errado se só traduzisse as anotações: SNAT, precedência por substituição, CIDR largo copiado e o API gateway que vira o único cliente.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvupl68vk7vcdk7ozq5t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvupl68vk7vcdk7ozq5t.png" alt="Slide 1: Migrar para o Envoy Gateway não é trocar YAML. A regra de acesso muda de dono e de camada." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F501vz7rg7ige5obpfbax.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F501vz7rg7ige5obpfbax.png" alt="Slide 2: A regra mudou de dono. No Envoy, a SecurityPolicy fica no Gateway compartilhado e um erro afeta todas as rotas." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4s2atgpw32gj5uoxc7b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4s2atgpw32gj5uoxc7b.png" alt="Slide 3: IP só é prova onde não pode ser forjado. Em L7, o IP é um dado que alguém informou, o X-Forwarded-For." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5bj5hmywhwvjqx97bne.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5bj5hmywhwvjqx97bne.png" alt="Slide 4: SNAT apaga o cliente. Com externalTrafficPolicy Cluster, o IP do cliente vira o IP do node." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F17n24dg6a2wglwz37acb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F17n24dg6a2wglwz37acb.png" alt="Slide 5: A política da rota substitui a do Gateway. Sem mergeType, quem chega com token passa de qualquer IP." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvn0btf044oc1e3sla710.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvn0btf044oc1e3sla710.png" alt="Slide 6: A faixa /8 que devia ser /16. 255 blocos /16 de terceiros liberados por uma lista antiga." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi60n8m7a0efp5aqiah52.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi60n8m7a0efp5aqiah52.png" alt="Slide 7: Com um API gateway na frente, o cliente é ele. Liberar esse IP libera todo mundo que passa por ele." width="800" height="450"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56412q4csfp0vji5pb7c.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56412q4csfp0vji5pb7c.png" alt="Slide 8: Checklist de validação antes do canário." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qual regra de acesso sumiu, ou abriu demais, numa migração que parecia só de ferramenta no seu ambiente?&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/" rel="noopener noreferrer"&gt;Kubernetes Blog, aposentadoria do Ingress NGINX (11/11/2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway-api.sigs.k8s.io/" rel="noopener noreferrer"&gt;Gateway API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/tasks/security/restrict-ip-access/" rel="noopener noreferrer"&gt;Envoy Gateway, restringir acesso por IP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/tasks/traffic/client-traffic-policy/" rel="noopener noreferrer"&gt;Envoy Gateway, Client Traffic Policy (X-Forwarded-For, Proxy Protocol)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/concepts/gateway_api_extensions/security-policy" rel="noopener noreferrer"&gt;Envoy Gateway, SecurityPolicy (precedência e mergeType)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/api/extension_types/" rel="noopener noreferrer"&gt;Envoy Gateway, API extension types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/" rel="noopener noreferrer"&gt;ingress-nginx, Annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/" rel="noopener noreferrer"&gt;Kubernetes, preservar o IP de origem do cliente&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/load-balancer-standard" rel="noopener noreferrer"&gt;Microsoft Learn, Standard Load Balancer no AKS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>security</category>
    </item>
    <item>
      <title>Três ferramentas, nenhuma resposta</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 01 Oct 2026 22:48:29 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/tres-ferramentas-nenhuma-resposta-1og4</link>
      <guid>https://dev.to/francisco_daschagas/tres-ferramentas-nenhuma-resposta-1og4</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qy5poxukeutl9zpqpp7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qy5poxukeutl9zpqpp7.png" alt="Mesa dividida: à esquerda, três telas com alertas críticos e anotações soltas; à direita, uma única plataforma de observabilidade com métricas, traces e logs" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hoje toda conversa de operação termina em "qual IA a gente coloca aqui?".&lt;/p&gt;

&lt;p&gt;Vou começar esta série por outra pergunta: quantas das suas ferramentas você consegue provar que funcionam?&lt;/p&gt;

&lt;p&gt;Nós tínhamos três. Logs numa, métricas em outra, APM numa terceira.&lt;/p&gt;

&lt;p&gt;Quando alguma coisa quebrava, a resposta não estava em nenhuma delas.&lt;/p&gt;

&lt;p&gt;Não faltava ferramenta. Faltava garantia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a aplicação parava de mandar log para o cluster e ninguém percebia;&lt;/li&gt;
&lt;li&gt;quando o log chegava, não trazia a informação necessária;&lt;/li&gt;
&lt;li&gt;a retenção dependia de uma rotina de limpeza configurada à mão, e nem sempre funcionava: guardávamos meses de dados quando o combinado eram semanas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eram três lugares para procurar e nenhum dono. Em gestão de risco, isso tem nome: controle que só existe no papel. A auditoria marca "temos monitoramento", mas no dia do incidente ninguém confia nele.&lt;/p&gt;

&lt;p&gt;A saída não foi comprar uma quarta ferramenta. Foi juntar logs, métricas e traces num lugar só (open source, com OpenTelemetry) e usar menos coisa, não mais.&lt;/p&gt;

&lt;p&gt;Nos próximos posts, vou contar o que isso revelou, com números: o que funcionou, o que custou, onde a IA ajudou e onde errou.&lt;/p&gt;

&lt;p&gt;Comece pela pergunta do início: das ferramentas de observabilidade que você paga hoje, quantas você já testou num incidente real?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>devops</category>
      <category>opentelemetry</category>
    </item>
  </channel>
</rss>
