<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Paulo Neves on Medium]]></title>
        <description><![CDATA[Stories by Paulo Neves on Medium]]></description>
        <link>https://medium.com/@pzneves?source=rss-444055d23d25------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*WMHorfGMD_qKOfuMdex-0w.jpeg</url>
            <title>Stories by Paulo Neves on Medium</title>
            <link>https://medium.com/@pzneves?source=rss-444055d23d25------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 09:52:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@pzneves/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Kubernetes para Developers]]></title>
            <link>https://medium.com/@pzneves/kubernetes-para-developers-ae2df69ce6f9?source=rss-444055d23d25------2</link>
            <guid isPermaLink="false">https://medium.com/p/ae2df69ce6f9</guid>
            <category><![CDATA[12-factor-app]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Paulo Neves]]></dc:creator>
            <pubDate>Sun, 25 Jan 2026 01:25:41 GMT</pubDate>
            <atom:updated>2026-01-25T01:25:41.243Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KG7WTQC7mghr2jud8CPsxA.png" /></figure><h4>O que muda (mesmo) na nossa aplicação?</h4><p>É manhã de segunda-feira e a euforia do dérbi ganho ainda pulsa nas veias.<br> O café sabe melhor e as conversas de futebol fluem animadas.</p><p>Mal me sento ao computador, surge a notificação fatídica:</p><blockquote><strong><em>“Reunião de Líderes — Assunto: Kubernetes — 10h”</em></strong></blockquote><p>Reunião com o Administrador à segunda-feira de manhã nunca é bom sinal.</p><p>Chega a hora H. O Administrador fala, visivelmente entusiasmado:</p><blockquote>“Este fim de semana visitei uma empresa parceira e tive contacto direto com uma plataforma de e-commerce a operar sobre Kubernetes.<br> É um Ferrari da infraestrutura! <br>Não se preocupem, com a ajuda do ChatGPT já criei na nossa cloud, um cluster kuberntes pronto para usar.<br> Quero agora a nossa solução a funcionar no cluster até ao final do dia.”</blockquote><p>A missão parecia impossível.</p><p>Como líder da equipa de desenvolvimento, a minha mente dispara.<br> “Kubernetes”… já ouvi falar. Lembro-me de um vídeo no YouTube do canal <a href="https://www.youtube.com/linuxtips"><strong>@LINUXTips</strong></a>, mas quase tudo o que vejo na internet fala apenas de infraestrutura, serviços, dns, volumes, etc...</p><p>E a pergunta surge naturalmente:</p><blockquote><strong><em>Afinal… o que é que muda na nossa aplicação?</em></strong></blockquote><p>Vamos desmistificar isto.<br> K8s (o acrónimo de Kubernetes) <strong>não pode ser um bicho de sete cabeças para developers</strong>.</p><h3>Primeiro: o que o Kubernetes não é (para ti, developer)</h3><p>Antes de mais nada, respira fundo.<br> Não é preciso ser SysAdmin nem DevOps Guru para fazer código correr em Kubernetes.</p><h3>Não é um novo ambiente de desenvolvimento</h3><p>Continuas a programar na tua máquina local.<br> O workflow diário <strong>não muda drasticamente</strong>.</p><p>Para validações locais podes usar no teu computador:</p><ul><li>Docker ou Podman</li><li>Para uma experiência mais próxima de produção, podes usar Kubernetes “light” como <strong>Kind</strong> ou <strong>Minikube</strong></li></ul><h3>Não é um novo framework de código</h3><p>Não é preciso reescrever a tua API Java, .NET ou Node.js para “usar Kubernetes”.<br> A aplicação continua a ser… uma aplicação normal.</p><p>👉 <strong>Kubernetes muda mais o “como corre” do que o “como é escrita” a aplicação.</strong></p><h3>O que muda de verdade?</h3><h4>A era dos containers 🐳</h4><p>A maior mudança é a forma como a aplicação é <strong>empacotada e gerida</strong>.<br> A palavra mágica é <strong>containerização</strong>.</p><p>Se ainda não usas Docker, este é o momento certo para aprender.</p><blockquote><em>Recomendo vivamente o curso gratuito </em><a href="https://www.youtube.com/watch?v=Wm99C_f7Kxw&amp;list=PLf-O3X2-mxDn1VpyU2q3fuI6YYeIWp5rR"><strong><em>“Descomplicando Docker”</em></strong></a><em> do canal </em><strong><em>@LINUXTips</em></strong><em> no YouTube, complementado pelo livro com o mesmo nome.</em></blockquote><ul><li>Livro: <a href="https://livro.descomplicandodocker.com.br/">https://livro.descomplicandodocker.com.br/</a>, por <strong><em>@LINUXTips</em></strong></li></ul><p>O Kubernetes é um <strong>orquestrador de containers</strong> — gere onde e como os teus containers correm.</p><h3>Os 6 pontos que todo developer precisa de saber para correr aplicações em Kubernetes</h3><h3>1. O Dockerfile é o teu novo melhor amigo</h3><p>A aplicação precisa viver dentro de uma imagem Docker.<br> Passa a ser responsabilidade do developer criar e manter um <strong>Dockerfile</strong> que garante que a aplicação arranca sempre da mesma forma, em qualquer ambiente.</p><h4>Exemplo de Dockerfile multi-stage</h4><pre># Etapa de build<br>FROM maven:3.9.12-eclipse-temurin-25 AS build<br>WORKDIR /app<br>COPY . .<br>RUN mvn clean package -DskipTests<br><br># Etapa de execução<br>FROM eclipse-temurin:25-jre-noble<br>WORKDIR /opt/app<br>COPY --from=build /app/target/*.jar accountapi.jar<br>EXPOSE 8080<br>CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;/opt/app/accountapi.jar&quot;]</pre><p>👉 Garante que a aplicação arranca com um simples docker run.</p><p>Leitura recomendada:</p><ul><li>Livro “<a href="https://livro.descomplicandodocker.com.br/chapters/chapter_08.html">Descomplicando Docker</a>”, por <strong><em>@LINUXTips</em></strong></li><li><a href="https://medium.com/@habbema/docker-dockerfile-28d89840570b">Docker: Dockerfile</a>, por <a href="https://medium.com/u/938daeba58a6">Hugo Habbema</a></li></ul><h3>2. Configuração via ConfigMaps e Secrets</h3><p>Em muitas aplicações tradicionais, a configuração vem misturada com o código:</p><ul><li>URLs de bases de dados</li><li>utilizadores e passwords</li><li>chaves de API</li><li>portas</li></ul><p>Funciona… <strong>até deixar de funcionar</strong>.</p><p>É daqui que nasceu a famosa frase de developer:</p><blockquote><strong><em>“Na minha máquina funciona.”</em></strong></blockquote><p>No Kubernetes, a aplicação pode:</p><ul><li>arrancar em qualquer nó</li><li>ser reiniciada a qualquer momento</li><li>escalar automaticamente</li></ul><p>A regra de ouro é clara:</p><blockquote><strong><em>Código deve ser imutável. Configuração deve ser externa.</em></strong></blockquote><p>Aqui entram os <strong>ConfigMaps</strong> e <strong>Secrets</strong>.</p><p>Exemplo de ConfigMap:</p><pre>apiVersion: v1<br>kind: ConfigMap<br>metadata:<br>  name: accounts-api-configmap<br>data:<br>  application.properties: |<br>    spring.application.name=AccountsAPI<br>    server.port=8200<br>    spring.data.redis.host=redis-dev<br>    spring.data.redis.port=6379</pre><p>Leitura recomendada:</p><ul><li><a href="https://12factor.net/pt_br/">Os 12 Fatores</a></li><li><a href="https://blog.rafael.bhz.br/posts/what-is-configmap-kubernetes/">O que é ConfigMap no Kubernetes?</a>, por Rafael Fernandes</li></ul><h3>3. Saúde da aplicação: startup, liveness e readiness probes</h3><p>Como é que o Kubernetes sabe se a aplicação está saudável?</p><p>A resposta é simples: <strong>endpoints HTTP </strong>que retornem HTTP 200 quando a aplicação estiver OK.</p><p><strong>Liveness Probe</strong><br> 👉 “A aplicação travou e não consegue recuperar sozinha?”<br>Se este endpoint falhar, o k8s reinicia o container.</p><ul><li>/healthz</li></ul><p><strong>Readiness Probe</strong><br> 👉 “A aplicação está pronta para receber tráfego agora?”<br>Se este endpoint falhar, o k8s para de enviar tráfego temporariamente.</p><ul><li>/ready</li></ul><p><strong>Startup Probe</strong><br> 👉 “A aplicação já terminou de arrancar?”<br>Como o nome diz, este endpoint verifica se a aplicação já arrancou.</p><ul><li>/startup</li></ul><p>Leitura recomendada:</p><p><a href="https://www.linkedin.com/pulse/kubernetes-probes-por-que-um-pod-running-n%C3%A3o-significa-akaike-ed49f/">Kubernetes Probes: por que um Pod “Running” não significa que sua aplicação está saudável</a>, por Ernesto Toshiyuki Akaike</p><h3>4. Logging para stdout</h3><p>Em Kubernetes, os logs devem ir para:</p><ul><li><strong>stdout</strong></li><li><strong>stderr</strong></li></ul><p>Evita escrever logs em ficheiros locais dentro do container.</p><p>O cluster trata da recolha (kubectl logs) e podes também integrar com soluções como:</p><ul><li><a href="https://graylog.org/">Graylog</a></li><li><a href="https://grafana.com/oss/loki/">Grafana Loki</a></li></ul><p>Leitura recomendada:</p><p><a href="https://www.youtube.com/watch?v=aSdsk73_tHE">Live Descomplicando o GRAYLOG</a>, por <a href="https://medium.com/u/a958bab29066">Jeferson Fernando</a> &amp;Maiki</p><h3>5. Ficheiros e armazenamento: repensar o “disco local”</h3><p>Containers são <strong>efémeros</strong>.</p><p>Tudo o que escreves no sistema de ficheiros local <strong>desaparece</strong> quando o container morre.</p><p>Se precisas de persistência deves usar:</p><ul><li>bases de dados externas</li><li>volumes (NFS, CSI)</li><li>object storage (S3, Azure Storage, etc.)</li></ul><p>Nunca guardes uploads de utilizadores no disco local do container.</p><p>Leitura recomendada:</p><p><a href="https://www.linkedin.com/pulse/volumes-e-sua-import%C3%A2ncia-k8s-allan-zanella-2cb7f/">Volumes e sua importância no K8s</a>, por Allan Zanella</p><h3>6. Defina as regras de mapeamento dos endpoints da sua API</h3><p>A aplicação não expõe endpoints diretamente para o exterior.</p><p>Ela corre em pods com IPs internos e efémeros.</p><p>A pergunta é inevitável:</p><blockquote><em>Quando chega um pedido a </em><em>https://api.exemplo.com/users, para onde ele vai?</em></blockquote><blockquote>Como o Kubernetes sabe a que serviço e aplicação pertence a requisição ?</blockquote><p>É aqui que entram o <strong>Ingress </strong>e o<strong> Gateway API</strong></p><p><strong>Ingress</strong> é o mecanismo clássico para expor HTTP/HTTPS da sua aplicação.<br><strong>Gateway API</strong> é a evolução natural. Mais flexível, mais segura e preparada para equipas maiores.</p><p>Mesmo que não sejas tu a escrever os manifestos:</p><ul><li>precisas de saber que endpoints expões</li><li>quais os paths públicos</li><li>como isso impacta o routing e a segurança</li></ul><p>Leitura recomendada:</p><p><a href="https://medium.com/@du.zenardi/do-ingress-ao-gateway-api-automatizando-tls-com-cert-manager-e-lets-encrypt-52a2ee94e81d">Do Ingress ao Gateway API: Automatizando TLS com cert-manager e Let’s Encrypt</a>, por <a href="https://medium.com/u/9ffcfd83486e">Eduardo Zenardi</a><br><a href="https://www.linkedin.com/pulse/ingress-nginx-nipio-teste-de-hostnames-kubernetes-bruno-dos-santos-gtcff/">Ingress Nginx + NIP.IO: Teste de Hostnames no Kubernetes</a>, por Bruno Santos</p><h3>Homelab e CGNAT</h3><p>Se tens interesse em praticar em casa, mas estás com limitações de CGNAT, vale conferir o artigo <em>“</em><a href="https://www.linkedin.com/posts/felipe-soares-0a357821_kubernetes-cloudflare-homelab-activity-7420615617059332097-o1bs/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAASIeXsB-XNFREfOKYrDRQIDnFvqv9oJi48"><em>Expondo meu Homelab atrás de CGNAT sem gastar nada!</em></a><em>”</em> do Felipe Soares.<br> Ele mostra como usar <strong>Cloudflare Tunnel</strong>, <strong>MetalLB</strong>, <strong>NGINX Ingress Controller</strong> e <strong>Pi-hole</strong> para expor serviços de forma segura, prática e próxima de um cenário de produção real.</p><h3>Resumo da ópera 🎭</h3><p>O Kubernetes é um orquestrador poderoso.<br> Escala, recupera falhas e mantém a aplicação a correr.</p><p>Para nós, developers, a mensagem é clara:</p><blockquote><strong><em>Construir aplicações modernas, portáteis e resilientes.</em></strong></blockquote><p>O Administrador quer a solução até ao final do dia?<br> Talvez não hoje.</p><p>Mas seguindo estes 6 pontos, em breve estaremos mesmo a correr num <strong>Ferrari da infraestrutura</strong>.</p><p>Agora, se me dão licença, vou ali criar o Dockerfile e os Health-Check da aplicação .<br> A fofoca do futebol fica para outro dia.⚽️</p><p>#LINUXTips #DescomplicandoKubernetes #Kubernetes #Developer</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ae2df69ce6f9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Medium]]></title>
            <link>https://medium.com/@pzneves/medium-162c3cd0f97d?source=rss-444055d23d25------2</link>
            <guid isPermaLink="false">https://medium.com/p/162c3cd0f97d</guid>
            <dc:creator><![CDATA[Paulo Neves]]></dc:creator>
            <pubDate>Fri, 06 Dec 2013 11:52:35 GMT</pubDate>
            <atom:updated>2013-12-06T11:52:35.181Z</atom:updated>
            <content:encoded><![CDATA[<h4>Medium, um blog, um post ?</h4><p>Na era da internet 3.0, medium chegou como solução de postagem web.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=162c3cd0f97d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>