<?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: DeividFerraz</title>
    <description>The latest articles on DEV Community by DeividFerraz (@deividferraz).</description>
    <link>https://dev.to/deividferraz</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%2F3443356%2F08429b32-7087-4e4f-a2a3-1fceb2ae4f5d.jpeg</url>
      <title>DEV Community: DeividFerraz</title>
      <link>https://dev.to/deividferraz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deividferraz"/>
    <language>en</language>
    <item>
      <title>Services no Kubernetes</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Mon, 06 Apr 2026 02:07:57 +0000</pubDate>
      <link>https://dev.to/deividferraz/services-no-kubernetes-4khc</link>
      <guid>https://dev.to/deividferraz/services-no-kubernetes-4khc</guid>
      <description>&lt;p&gt;🚀 O que eu aprendi sobre Kubernetes Service (e por que isso finalmente fez sentido pra mim)&lt;/p&gt;

&lt;p&gt;Depois de apanhar um pouco tentando entender como minha API realmente “se comunica” dentro do cluster, finalmente caiu a ficha sobre o papel do Service no Kubernetes.&lt;/p&gt;

&lt;p&gt;Se você também já ficou confuso com Pods mudando de IP, balanceamento e tipos de Service… esse resumo pode te ajudar 👇&lt;/p&gt;

&lt;p&gt;🧠 Primeiro insight (o mais importante)&lt;br&gt;
👉 Pods são efêmeros&lt;/p&gt;

&lt;p&gt;Eles sobem e caem&lt;/p&gt;

&lt;p&gt;O IP muda o tempo todo&lt;/p&gt;

&lt;p&gt;👉 Service resolve isso&lt;/p&gt;

&lt;p&gt;Dá um IP fixo + DNS estável&lt;/p&gt;

&lt;p&gt;E ainda faz load balancing automaticamente&lt;/p&gt;

&lt;p&gt;⚙️ Como o Service realmente funciona&lt;br&gt;
O Service não “conhece” ReplicaSet, Deployment nem nada disso.&lt;/p&gt;

&lt;p&gt;Ele só faz:&lt;/p&gt;

&lt;p&gt;selector:&lt;br&gt;
  app: minha-api&lt;br&gt;
E pensa:&lt;/p&gt;

&lt;p&gt;“Vou mandar tráfego pra qualquer Pod com essa label”&lt;/p&gt;

&lt;p&gt;💥 Pronto. É assim que ele encontra os Pods.&lt;/p&gt;

&lt;p&gt;⚖️ Load Balancing&lt;br&gt;
Se você tem 3 Pods:&lt;/p&gt;

&lt;p&gt;Pod A (IP 10.0.0.1)&lt;br&gt;
Pod B (IP 10.0.0.2)&lt;br&gt;
Pod C (IP 10.0.0.3)&lt;br&gt;
O Service faz:&lt;/p&gt;

&lt;p&gt;Cliente → Service → distribui entre A, B, C&lt;br&gt;
👉 Você não precisa saber os IPs 👉 Você não precisa atualizar nada manualmente&lt;/p&gt;

&lt;p&gt;🔌 Sobre portas&lt;br&gt;
ports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;port: 80
targetPort: 3000
port → porta do Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;targetPort → porta do container&lt;/p&gt;

&lt;p&gt;💡 Dica: use named ports pra deixar mais claro:&lt;/p&gt;

&lt;p&gt;ports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;port: 80
targetPort: http
Um ponto importante. Esse (http) é apenas o nome dado para a porta na sessão de containers.ports dentro do yaml do POD, ou no meu caso do ReplicaSet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🌐 Os 2 tipos mais usados na prática&lt;br&gt;
🔵 1. ClusterIP (padrão)&lt;br&gt;
👉 Usado para comunicação interna&lt;/p&gt;

&lt;p&gt;type: ClusterIP&lt;br&gt;
✔️ Só funciona dentro do cluster ✔️ Ideal para microservices ✔️ Mais seguro&lt;/p&gt;

&lt;p&gt;Exemplo real:&lt;/p&gt;

&lt;p&gt;backend falando com banco&lt;/p&gt;

&lt;p&gt;API interna chamando outro serviço&lt;/p&gt;

&lt;p&gt;🟢 2. LoadBalancer&lt;br&gt;
👉 Usado para expor para fora&lt;/p&gt;

&lt;p&gt;type: LoadBalancer&lt;br&gt;
✔️ Cria um IP externo ✔️ Acessível via internet ✔️ Ideal para APIs públicas&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;sua API que será consumida por frontend ou terceiros&lt;/p&gt;

&lt;p&gt;🧠 Boas práticas que aprendi&lt;br&gt;
✅ Use labels consistentes (app, tier, etc.) ✅ Prefira ClusterIP por padrão (segurança) ✅ Só use LoadBalancer quando precisar expor ✅ Use named ports pra facilitar manutenção ✅ Sempre confira os endpoints se algo não funcionar.&lt;/p&gt;

&lt;p&gt;🔥 Resumo mental&lt;br&gt;
Pod = efêmero &lt;/p&gt;

&lt;p&gt;Service = estável &lt;/p&gt;

&lt;p&gt;Labels = conexão 🔗&lt;/p&gt;

&lt;p&gt;Service = load balancer automático ⚖️&lt;/p&gt;

&lt;p&gt;💬 Conclusão&lt;br&gt;
O Service não é só “um detalhe” do Kubernetes.&lt;/p&gt;

&lt;p&gt;Ele é o que transforma:&lt;/p&gt;

&lt;p&gt;👉 containers isolados em 👉 um sistema distribuído que funciona de verdade&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚨 CrashLoopBackOff no Kubernetes: o que é e por que acontece?</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Mon, 30 Mar 2026 04:14:55 +0000</pubDate>
      <link>https://dev.to/deividferraz/crashloopbackoff-no-kubernetes-o-que-e-e-por-que-acontece-4bkn</link>
      <guid>https://dev.to/deividferraz/crashloopbackoff-no-kubernetes-o-que-e-e-por-que-acontece-4bkn</guid>
      <description>&lt;p&gt;Quem trabalha com Kubernetes cedo ou tarde encontra esse status no terminal:&lt;/p&gt;

&lt;p&gt;CrashLoopBackOff&lt;/p&gt;

&lt;p&gt;Ele aparece quando um container dentro do Pod falha repetidamente e o Kubernetes passa a reiniciá-lo com um tempo de espera progressivo entre as tentativas. Esse status é mostrado pelo kubectl para indicar exatamente esse ciclo de falha + reinício + espera.&lt;/p&gt;

&lt;p&gt;🔁 Como funciona na prática&lt;/p&gt;

&lt;p&gt;Quando a aplicação quebra, o Kubernetes não reinicia o container infinitamente sem pausa.&lt;/p&gt;

&lt;p&gt;Ele aplica um backoff exponencial, com atrasos como:&lt;/p&gt;

&lt;p&gt;10s → 20s → 40s → 80s...&lt;/p&gt;

&lt;p&gt;Esse tempo cresce até um limite máximo de 5 minutos entre as tentativas de reinício. Se a aplicação continuar falhando, o Kubernetes continua tentando, mas respeitando esse teto.&lt;/p&gt;

&lt;p&gt;🛡️ Qual é a finalidade do CrashLoopBackOff?&lt;/p&gt;

&lt;p&gt;A ideia não é “travar” o Pod por acaso. O objetivo é:&lt;/p&gt;

&lt;p&gt;evitar reinícios inúteis sem parar&lt;br&gt;
reduzir consumo desnecessário de recursos no node e no cluster&lt;br&gt;
dar tempo para diagnóstico&lt;br&gt;
deixar claro que a aplicação está falhando repetidamente&lt;/p&gt;

&lt;p&gt;Ou seja: o CrashLoopBackOff é uma forma de proteger a infraestrutura e, ao mesmo tempo, evidenciar que algo está errado na aplicação.&lt;/p&gt;

&lt;p&gt;⏱️ E os 10 minutos?&lt;/p&gt;

&lt;p&gt;Existe um ponto importante aqui: se o container conseguir ficar 10 minutos rodando sem falhar, o Kubernetes zera o contador do backoff. Então, se ele voltar a quebrar depois disso, a próxima espera volta a começar do início, em vez de continuar num intervalo alto.&lt;/p&gt;

&lt;p&gt;⚙️ O papel do restartPolicy&lt;/p&gt;

&lt;p&gt;O comportamento também depende da política de reinício do Pod:&lt;/p&gt;

&lt;p&gt;Always: sempre tenta reiniciar&lt;br&gt;
OnFailure: reinicia apenas se houver erro&lt;br&gt;
Never: não reinicia automaticamente&lt;/p&gt;

&lt;p&gt;O valor padrão em Pods é Always.&lt;/p&gt;

&lt;p&gt;✅ E quando o Pod termina com sucesso?&lt;/p&gt;

&lt;p&gt;Isso também pode gerar reinício, dependendo da política usada.&lt;/p&gt;

&lt;p&gt;Se um container termina com sucesso, mas o Pod está com restartPolicy: Always, ele pode ser iniciado novamente. Só que esse não costuma ser o modelo ideal para tarefas que têm começo, meio e fim.&lt;/p&gt;

&lt;p&gt;🧩 Quando usar Job em vez de Pod?&lt;/p&gt;

&lt;p&gt;Para tarefas que executam e terminam, o recurso mais adequado normalmente é um Job.&lt;/p&gt;

&lt;p&gt;O Job existe justamente para workloads finitas e aceita apenas restartPolicy: Never ou OnFailure no template do Pod. Quando a tarefa termina com sucesso, o Job considera a execução concluída.&lt;/p&gt;

&lt;p&gt;🎯 Resumindo&lt;/p&gt;

&lt;p&gt;O CrashLoopBackOff não é só um erro visual no terminal.&lt;br&gt;
Ele é um mecanismo do Kubernetes para:&lt;/p&gt;

&lt;p&gt;desacelerar reinícios de uma aplicação quebrada&lt;br&gt;
evitar desperdício de recursos&lt;br&gt;
facilitar diagnóstico&lt;br&gt;
proteger o node e o cluster&lt;/p&gt;

&lt;p&gt;Em resumo: se o Pod falha repetidamente, o Kubernetes não reinicia “na marra” para sempre ele controla esse comportamento de forma inteligente.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>etcd: a camada de armazenamento do Kubernetes</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Mon, 23 Mar 2026 17:55:05 +0000</pubDate>
      <link>https://dev.to/deividferraz/etcd-a-camada-de-armazenamento-do-kubernetes-2kk4</link>
      <guid>https://dev.to/deividferraz/etcd-a-camada-de-armazenamento-do-kubernetes-2kk4</guid>
      <description>&lt;p&gt;Boa tarde, Pessoal. 👋&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;etcd: a camada de armazenamento do Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estudando Kubernetes, comecei a olhar com mais atenção para alguns componentes que quase não aparecem no uso do dia a dia, mas são fundamentais para o funcionamento do cluster. Um deles é o etcd.&lt;/p&gt;

&lt;p&gt;Quando estamos em ambientes gerenciados, principalmente em nuvem, é muito fácil focar só em Deployment, Service, Ingress, escalabilidade e esquecer da base que sustenta o estado do cluster. Mas entender isso ajuda bastante a enxergar melhor o funcionamento do Kubernetes por trás dos panos.&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;📌 O que é o etcd?&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;O etcd é um banco de dados distribuído do tipo chave-valor que o Kubernetes usa para armazenar o estado do cluster.&lt;/p&gt;

&lt;p&gt;É nele que ficam registradas informações como:&lt;/p&gt;

&lt;p&gt;• Pods&lt;/p&gt;

&lt;p&gt;• Services&lt;/p&gt;

&lt;p&gt;• Deployments&lt;/p&gt;

&lt;p&gt;• ConfigMaps&lt;/p&gt;

&lt;p&gt;• Secrets&lt;/p&gt;

&lt;p&gt;• Namespaces&lt;/p&gt;

&lt;p&gt;• entre outros objetos do plano de controle&lt;/p&gt;

&lt;p&gt;Ou seja, boa parte do que existe no cluster, em algum momento, depende do etcd para ter esse estado armazenado.&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;⚙️ Como ele participa da arquitetura do Kubernetes&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;Na prática, a comunicação acontece principalmente por meio do kube-apiserver. É ele que recebe as requisições, faz a validação, processa as informações e consulta ou grava esses dados no etcd.&lt;/p&gt;

&lt;p&gt;Isso ajuda a entender melhor o papel do etcd: mesmo sem aparecer tanto no uso diário, ele é uma peça central da arquitetura.&lt;/p&gt;

&lt;p&gt;Em ambientes com alta disponibilidade, o etcd pode rodar em múltiplos nós, formando um cluster distribuído. Isso aumenta a resiliência e reduz o risco de indisponibilidade em caso de falha de uma instância.&lt;/p&gt;

&lt;p&gt;Por isso, a saúde do etcd impacta diretamente a saúde do cluster.&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;💾 E o backup, como funciona?&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;Como o etcd armazena o estado do cluster, manter backups regulares é essencial para recuperação em cenários de desastre, como perda de nós do plano de controle ou corrupção de dados.&lt;/p&gt;

&lt;p&gt;A forma mais comum de fazer isso é por meio de snapshot.&lt;/p&gt;

&lt;p&gt;Esse snapshot registra o conteúdo do banco naquele momento e pode ser usado depois em uma restauração.&lt;/p&gt;

&lt;p&gt;Um detalhe importante: não é necessário parar o kube-apiserver para gerar esse backup.&lt;/p&gt;

&lt;p&gt;O etcd permite criar snapshot a partir de um membro em execução usando o comando etcdctl snapshot save. Ou seja, esse processo pode ser feito com o serviço ativo.&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;🧩 Exemplo de comando: doc: Operando clusters etcd para Kubernetes | Kubernetes&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;🔎 O que esse comando faz: Leia a doc: &lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;🛠️ Exemplo prático: Leia a doc também: &lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;━━━━━━━━━━━━━━━━━━&lt;/p&gt;

&lt;p&gt;Depois de gerar o backup, ainda é possível validar o snapshot com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;etcdutl --write-out=table snapshot status /backup/etcd-snapshot.db&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Kubernetes #DevOps #Cloud #SRE #Containers
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Deploy aplicação no cluster do aks 🚀</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Tue, 17 Mar 2026 19:25:04 +0000</pubDate>
      <link>https://dev.to/deividferraz/deploy-aplicacao-no-cluster-do-aks-52il</link>
      <guid>https://dev.to/deividferraz/deploy-aplicacao-no-cluster-do-aks-52il</guid>
      <description>&lt;p&gt;Eae pessoal! 👋&lt;/p&gt;

&lt;p&gt;Hoje vou compartilhar com vocês uma forma simples e eficiente de criar um pipeline em YAML no Azure DevOps para publicar uma aplicação no AKS (Azure Kubernetes Service).🚀 &lt;/p&gt;

&lt;p&gt;Contexto:&lt;/p&gt;

&lt;p&gt;Aqui na empresa, já temos um repositório central com templates prontos de pipeline + Helm, o que acelera muito o processo de criação de novas APIs e jobs.&lt;/p&gt;

&lt;p&gt;Neste post, vou mostrar como usamos esse template.&lt;/p&gt;

&lt;p&gt;👉 Em um próximo, posso mostrar como fazer tudo do zero.&lt;/p&gt;

&lt;p&gt;🧩 Estrutura do pipeline&lt;/p&gt;

&lt;p&gt;A ideia é bem simples:&lt;/p&gt;

&lt;p&gt;Criamos um repositório do projeto&lt;/p&gt;

&lt;p&gt;Adicionamos um azure-pipelines.yml mínimo&lt;/p&gt;

&lt;p&gt;Referenciamos um template centralizado&lt;/p&gt;

&lt;p&gt;Ou seja:&lt;/p&gt;

&lt;p&gt;👉 O projeto praticamente não precisa de configuração — a inteligência já está no template.&lt;/p&gt;




&lt;p&gt;📦 Pipeline do projeto &lt;/p&gt;

&lt;p&gt;No YAML do projeto, definimos apenas o essencial:&lt;/p&gt;

&lt;p&gt;branch&lt;/p&gt;

&lt;p&gt;dockerFilePath&lt;/p&gt;

&lt;p&gt;dockerBuildContext&lt;/p&gt;

&lt;p&gt;Todo o restante vem do template e de arquivos como o values.yaml.&lt;/p&gt;

&lt;p&gt;💡 Isso reduz drasticamente erros e padroniza deploys.&lt;/p&gt;




&lt;p&gt;⚙️ O papel do template (Helm + Pipeline)&lt;/p&gt;

&lt;p&gt;O template é o coração da solução.&lt;/p&gt;

&lt;p&gt;Ele é responsável por:&lt;/p&gt;

&lt;p&gt;Build da imagem Docker&lt;/p&gt;

&lt;p&gt;Push para o container registry&lt;/p&gt;

&lt;p&gt;Deploy no AKS via Helm&lt;/p&gt;

&lt;p&gt;Configuração de ambiente (Dev/Prod)&lt;/p&gt;

&lt;p&gt;Integração com variáveis e secrets&lt;/p&gt;

&lt;p&gt;👉 Ou seja: ao rodar o pipeline, toda a infraestrutura é provisionada automaticamente e a aplicação já sobe no cluster do AKS.&lt;/p&gt;




&lt;p&gt;🧠 Por que usar Helm + Templates?&lt;/p&gt;

&lt;p&gt;A principal vantagem é abstrair a infraestrutura do desenvolvedor.&lt;/p&gt;

&lt;p&gt;O dev:&lt;/p&gt;

&lt;p&gt;Não precisa acessar o portal do Azure&lt;/p&gt;

&lt;p&gt;Não precisa configurar Kubernetes manualmente&lt;/p&gt;

&lt;p&gt;Só precisa garantir que o projeto está correto&lt;/p&gt;




&lt;p&gt;⚠️ Boas práticas ao criar templates Helm&lt;/p&gt;

&lt;p&gt;Aqui vai um ponto importante 👇&lt;/p&gt;

&lt;p&gt;O poder do template depende de como você o constrói. Algumas boas práticas:&lt;/p&gt;

&lt;p&gt;🔹 Padronize nomes e labels (facilita observabilidade)&lt;/p&gt;

&lt;p&gt;🔹 Separe configs por ambiente (dev, staging, prod)&lt;/p&gt;

&lt;p&gt;🔹 Use values.yaml bem estruturado&lt;/p&gt;

&lt;p&gt;🔹 Evite hardcode de credenciais (use secrets/Key Vault)&lt;/p&gt;

&lt;p&gt;🔹 Permita override de variáveis importantes&lt;/p&gt;

&lt;p&gt;🔹 Versione o chart Helm&lt;/p&gt;

&lt;p&gt;🔹 Adicione health checks (liveness/readiness probes)&lt;/p&gt;

&lt;p&gt;🔹 Defina requests/limits de CPU e memória&lt;/p&gt;

&lt;p&gt;Um bom template evita retrabalho e reduz incidentes em produção.&lt;/p&gt;

&lt;p&gt;--- 🧪 Resultado&lt;/p&gt;

&lt;p&gt;Com esse modelo, precisamos basicamente informar:&lt;/p&gt;

&lt;p&gt;Caminho do Dockerfile&lt;/p&gt;

&lt;p&gt;Contexto de build&lt;/p&gt;

&lt;p&gt;Branch&lt;/p&gt;

&lt;p&gt;E pronto 🚀&lt;/p&gt;

&lt;p&gt;O pipeline cuida de todo o resto e a aplicação já sobe no cluster do AKS.&lt;/p&gt;

&lt;p&gt;Imagem de exemplo prático no meu linkedin: &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7439753064225366016/?originTrackingId=WQDMTOfIYxXFTM3qmKO3KA%3D%3D" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7439753064225366016/?originTrackingId=WQDMTOfIYxXFTM3qmKO3KA%3D%3D&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cicd</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>🚀 Pods no Kubernetes (com 2 containers no mesmo Pod):</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Tue, 23 Sep 2025 22:21:53 +0000</pubDate>
      <link>https://dev.to/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-55i9</link>
      <guid>https://dev.to/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-55i9</guid>
      <description>&lt;p&gt;Continuação...&lt;/p&gt;

&lt;p&gt;2) Services (um para cada porta do mesmo Pod):&lt;br&gt;
apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
 name: api3a-svc&lt;br&gt;
 namespace: prod&lt;br&gt;
spec:&lt;br&gt;
 selector: { app: api3, svc-api3a: "true" }&lt;/p&gt;

&lt;h2&gt;
  
  
   ports: [{ port: 80, targetPort: 8080 }]
&lt;/h2&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
 name: api3b-svc&lt;br&gt;
 namespace: prod&lt;br&gt;
spec:&lt;br&gt;
 selector: { app: api3, svc-api3b: "true" }&lt;br&gt;
 ports: [{ port: 80, targetPort: 8081 }]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⁉️Service não “aponta para container”; ele seleciona Pods por label. O que diferencia é o targetPort. exemplo: 10.224.0.31(PodIP):(targetPort)8080.
_________________________________________________________________________________
3) Ingress (um host, vários paths → Services):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prod-paths
namespace: prod
annotations:
&lt;a href="https://lnkd.in/du23U4PY:" rel="noopener noreferrer"&gt;https://lnkd.in/du23U4PY:&lt;/a&gt; /
spec:
ingressClassName: nginx
rules:&lt;/li&gt;
&lt;li&gt;host: 20-246-240-254.sslip.io # ou api.seu-dominio.com
http:
paths:&lt;/li&gt;
&lt;li&gt;path: /api3a //necessario para encaminhar ao backend abaixo(service)
pathType: Prefix
backend: { service: { name: api3a-svc, port: { number: 80 } } }&lt;/li&gt;
&lt;li&gt;path: /api3b
pathType: Prefix
backend: { service: { name: api3b-svc, port: { number: 80 } } }&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🚀 Pods no Kubernetes (com 2 containers no mesmo Pod):</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Tue, 23 Sep 2025 22:14:50 +0000</pubDate>
      <link>https://dev.to/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-1p0p</link>
      <guid>https://dev.to/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-1p0p</guid>
      <description>&lt;p&gt;☝️ Resumo do artigo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cliente → DNS/Host → IP público (LB do ingress-nginx)
-&amp;gt; Pod do ingress-nginx (Nginx) → Ingress (host + path).&lt;/li&gt;
&lt;li&gt;Ingress decide quem recebe (host + path) e fala com Service.
-&amp;gt; Service (ClusterIP:port, L4) → Endpoints (PodIP:targetPort).&lt;/li&gt;
&lt;li&gt;Service seleciona Pods por labels e encaminha para PodIP:targetPort.
-&amp;gt; Pod (containers compartilham o mesmo IP, portas diferentes).&lt;/li&gt;
&lt;li&gt;Pod = mesmo IP para todos os containers; o que muda é a porta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚢 O que é um Pod:&lt;br&gt;
Menor unidade implantável, pode ter 1 ou mais containers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containers do mesmo Pod compartilham:&lt;/li&gt;
&lt;li&gt;Network namespace → mesmo IP (o Pod IP), localhost comum&lt;/li&gt;
&lt;li&gt;Volumes (se montados).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IMPORTANTE: Você não cria Pod “puro” na produção: cria um Deployment, que cria ReplicaSet, que cria Pods.&lt;/p&gt;

&lt;p&gt;🧭 Por que usar Namespaces?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolam nomes: api1 em dev e api1 em prod.&lt;/li&gt;
&lt;li&gt;Controlam acesso (RBAC), quotas, políticas de rede.&lt;/li&gt;
&lt;li&gt;Ciclo de vida: deletar o namespace remove tudo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧪 Exemplo prático: duas APIs no mesmo Pod (api3a + api3b):&lt;br&gt;
 1) Deployment (um Pod com 2 containers, portas 8080 e 8081):&lt;br&gt;
 apiVersion: apps/v1&lt;br&gt;
 kind: Deployment&lt;br&gt;
 metadata:&lt;br&gt;
 name: api3&lt;br&gt;
 namespace: prod&lt;br&gt;
 spec:&lt;br&gt;
 replicas: 1&lt;br&gt;
 selector:&lt;br&gt;
 matchLabels: { app: api3 }&lt;br&gt;
 template:&lt;br&gt;
 metadata:&lt;br&gt;
 labels:&lt;br&gt;
 app: api3&lt;br&gt;
 svc-api3a: "true"  # ajuda os Services a “enxergar” este Pod&lt;br&gt;
 svc-api3b: "true"&lt;br&gt;
 spec:&lt;br&gt;
 containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: api3a
image: &lt;a href="https://suaiamgem" rel="noopener noreferrer"&gt;https://suaiamgem&lt;/a&gt;
ports: [{ name: http-api3a, containerPort: 8080 }]
env:  [{ name: ASPNETCORE_URLS, value: http://+:8080 }]
readinessProbe: { httpGet: { path: "/", port: 8080 }, initialDelaySeconds: 5, periodSeconds: 10 }
livenessProbe: { httpGet: { path: "/", port: 8080 }, initialDelaySeconds: 10, periodSeconds: 20 }&lt;/li&gt;
&lt;li&gt;name: api3b
image: &lt;a href="https://suaimagem" rel="noopener noreferrer"&gt;https://suaimagem&lt;/a&gt;
ports: [{ name: http-api3b, containerPort: 8081 }]
env:  [{ name: ASPNETCORE_URLS, value: http://+:8081 }]
readinessProbe: { httpGet: { path: "/", port: 8081 }, initialDelaySeconds: 5, periodSeconds: 10 }
livenessProbe: { httpGet: { path: "/", port: 8081 }, initialDelaySeconds: 10, periodSeconds: 20 }
⁉️ - Por quê duas portas? &lt;/li&gt;
&lt;li&gt;Containers do mesmo Pod compartilham IP, então precisam portas diferentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CONTINUAÇÂO NO PRÒXIMO POST...&lt;/p&gt;

</description>
      <category>containers</category>
      <category>kubernetes</category>
      <category>networking</category>
    </item>
    <item>
      <title>Redes virtuais do Azure.</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Sat, 13 Sep 2025 04:08:25 +0000</pubDate>
      <link>https://dev.to/deividferraz/redes-virtuais-do-azure-39o1</link>
      <guid>https://dev.to/deividferraz/redes-virtuais-do-azure-39o1</guid>
      <description>&lt;p&gt;🌐 Redes Virtuais no Azure: conectividade segura e de alta disponibilidade para sua empresa&lt;/p&gt;

&lt;p&gt;No mundo digital de hoje, conectar ambientes locais à nuvem com segurança, baixa latência e resiliência deixou de ser um diferencial e passou a ser uma necessidade. O Azure oferece uma variedade de opções de redes virtuais que permitem interligar datacenters, filiais e usuários remotos ao poder da nuvem, garantindo escalabilidade e proteção contra falhas.&lt;/p&gt;

&lt;p&gt;🔹 Tipos de conexões de rede virtual&lt;/p&gt;

&lt;p&gt;Ponto-a-Site (P2S):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ideal para usuários individuais, como colaboradores remotos.&lt;/li&gt;
&lt;li&gt;O próprio computador do usuário inicia uma VPN criptografada até a VNet no Azure.&lt;/li&gt;
&lt;li&gt;Ótima opção para home office ou acessos ocasionais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Site-a-Site (S2S):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perfeito para integração contínua de datacenters locais ou filiais.&lt;/li&gt;
&lt;li&gt;Um appliance VPN local se conecta ao Azure VPN Gateway.&lt;/li&gt;
&lt;li&gt;A rede local é estendida para a nuvem como se fosse uma única infraestrutura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ExpressRoute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para quem precisa de segurança e desempenho máximos.&lt;/li&gt;
&lt;li&gt;Conexão privada e dedicada ao backbone da Microsoft, sem passar pela Internet pública.&lt;/li&gt;
&lt;li&gt;Ideal para workloads críticos, replicações de dados em larga escala e cenários regulatórios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Conectando redes virtuais no Azure:&lt;/p&gt;

&lt;p&gt;Além de conectar sua empresa à nuvem, o Azure também permite interligar VNets entre si por meio de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emparelhamento de VNets (VNet Peering): conecta redes virtuais de forma transparente e privada, usando o backbone da Microsoft.&lt;/li&gt;
&lt;li&gt;Service Endpoints e Private Endpoints: formas de expor serviços como Storage e SQL de maneira segura, evitando exposição pública.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Alta disponibilidade e proteção contra falhas:&lt;/p&gt;

&lt;p&gt;Quando falamos em continuidade de negócios, a arquitetura de rede também precisa ser resiliente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateways ativo/ativo: dois IPs públicos para reduzir downtime.&lt;/li&gt;
&lt;li&gt;Gateways redundantes em zonas de disponibilidade: proteção contra falhas físicas em datacenters.&lt;/li&gt;
&lt;li&gt;Failover com ExpressRoute + VPN: se a conexão dedicada falhar, uma VPN site-a-site pode assumir como backup.&lt;/li&gt;
&lt;li&gt;Esses recursos garantem que sua empresa continue operando mesmo em cenários de falha ou manutenção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Segurança e roteamento de tráfego:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NSGs (Network Security Groups): filtros em nível de rede (L3/L4) para controlar tráfego entre sub-redes.&lt;/li&gt;
&lt;li&gt;Tabelas de rotas (UDRs): regras personalizadas de encaminhamento.&lt;/li&gt;
&lt;li&gt;BGP (Border Gateway Protocol): troca dinâmica de rotas entre sua rede e o Azure.&lt;/li&gt;
&lt;li&gt;Com isso, é possível controlar fluxos, segmentar ambientes e proteger dados sensíveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Conclusão&lt;/p&gt;

&lt;p&gt;As redes virtuais do Azure oferecem flexibilidade para diferentes cenários: de um desenvolvedor acessando remotamente recursos de teste até grandes corporações que demandam links dedicados, redundância e alta segurança.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker Compose: Simplificando o Gerenciamento de Containers</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Sat, 23 Aug 2025 05:09:06 +0000</pubDate>
      <link>https://dev.to/deividferraz/docker-compose-simplificando-o-gerenciamento-de-containers-18e1</link>
      <guid>https://dev.to/deividferraz/docker-compose-simplificando-o-gerenciamento-de-containers-18e1</guid>
      <description>&lt;p&gt;O Docker revolucionou a forma como desenvolvemos e entregamos aplicações, mas gerenciar vários containers manualmente pode ser confuso e trabalhoso. Para não haver esse tipo de problema que entra o Docker Compose. Docker compose é uma ferramenta poderosa que permite definir e orquestrar múltiplos containers de forma simples e organizada, usando um único arquivo YAML (nome de arquivo padrão: docker-compose.yml).&lt;/p&gt;

&lt;p&gt;✅ Em que momento usar o Docker compose?&lt;br&gt;
Quando vc tiver aplicações que conversam entre si, é ideal usar o Docker Compose, Pq ele permite agrupar esses serviços. Por exemplo: uma aplicação web pode depender de um banco de dados e de um cache, e todos esses containers podem ser definidos e gerenciados juntos.&lt;/p&gt;

&lt;p&gt;Beneficios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Serviços como, imagens, porta, rede entre outros ficam descritos no mesmo arquivo, assim, ficam mais facil de serem manipulados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Com apenas um simples comando, conseguimos subir, para reconstruir toda a stack de serviços, só isso já elimina a necessidade de escrever varios comandos para instanciar apenas um container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O mesmo arquivo pode ser usado em diferentes máquinas e ambientes (local, staging, produção), garantindo consistência e evitando o famoso “na minha máquina funciona”. Isso é possível porque toda a aplicação é encapsulada em containers, que incluem suas dependências e configuram um ambiente padronizado.&lt;br&gt;
Independentemente se você estiver rodando em Linux, Windows ou macOS, o Docker garante essa compatibilidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Código usado: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker-compose -f docker-compose-local.yml -p dev-store up -d
Explicação dos termos:
-f: especifica qual arquivo YAML usar (ex.: docker-compose-local.yml).
-p: define o nome do projeto (usado para nomear containers, rede e volumes).
up: sobe todos os serviços definidos no YAML.
-d: executa em modo “detached” (em segundo plano).&lt;/li&gt;
&lt;li&gt;É importante usar para n ficar preso no terminal.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Imagens e Containers: pensando como classe e instância</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Fri, 22 Aug 2025 03:45:43 +0000</pubDate>
      <link>https://dev.to/deividferraz/imagens-e-containers-pensando-como-classe-e-instancia-2nj4</link>
      <guid>https://dev.to/deividferraz/imagens-e-containers-pensando-como-classe-e-instancia-2nj4</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Quando eu comecei a mexer com Docker, acabava confundindo bastante imagens com containers, e creio que muita gente também. Eles são muito relacionados, mas não são a mesma coisa. Uma imagem é um pacote encapsulado com tudo que a aplicação precisa para rodar, já um container é a imagem em execução, com seu próprio processo e configurações de rede.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vi uma análogia no treinamento que estou fazendo atualmente que deixou tudo isso ainda mais claro. &lt;br&gt;
 --(Em termos de programação orientada a objetos: imagem é como a classe, e container é como a instância da classe. EX: var car = new Carro();)&lt;/p&gt;

&lt;p&gt;-Através dele, você pode expor na rede por meio de portas, dar um nome e fazer algumas alterações. Só não podemos esquecer que toda alteração feita em um container fica salva apenas na memória daquele container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para resumir, o container acaba se tornando a sua imagem gerenciada.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Redes no Docker, Bridge e Outras Possibilidades</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Wed, 20 Aug 2025 03:30:21 +0000</pubDate>
      <link>https://dev.to/deividferraz/conceito-de-redes-em-docker-3dhd</link>
      <guid>https://dev.to/deividferraz/conceito-de-redes-em-docker-3dhd</guid>
      <description>&lt;p&gt;-Quando trabalhamos com containers, um dos pontos mais importantes é como eles se comunicam entre si e com o mundo externo. É aqui que entram as redes do Docker, que garantem conectividade, isolamento e flexibilidade.&lt;/p&gt;

&lt;p&gt;-Existem alguns tipos de rede no docker, o principal entre eles é; Bridge.&lt;br&gt;
Os containers conectados a uma rede bridge podem se comunicar entre si usando o nome do container como hostname.&lt;br&gt;
Também permite comunicação com o host e com a internet, quando configurada.&lt;/p&gt;

&lt;p&gt;Comando exemplo para criar uma rede e já indicar o driver (O tipo de rede) que aquele container vai ser exposto;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker network create --driver bridge/TipoDeRede minha-rede/nomeDaMinhaRede&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conhecimento em redes é a base para começar a entender como os containers se relacionam entre si.&lt;br&gt;
hashtag#docker hashtag#rede #8080 hashtag#port&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Wed, 20 Aug 2025 03:28:46 +0000</pubDate>
      <link>https://dev.to/deividferraz/-d37</link>
      <guid>https://dev.to/deividferraz/-d37</guid>
      <description></description>
      <category>bootstrap</category>
    </item>
    <item>
      <title>Volumes no Docker: Como Persistir e Compartilhar Dados</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Mon, 18 Aug 2025 19:16:35 +0000</pubDate>
      <link>https://dev.to/deividferraz/volumes-no-docker-como-persistir-e-compartilhar-dados-nm</link>
      <guid>https://dev.to/deividferraz/volumes-no-docker-como-persistir-e-compartilhar-dados-nm</guid>
      <description>&lt;p&gt;Quando usamos containers, um dos maiores desafios é a persistência de dados.&lt;br&gt;
Por padrão, tudo que é criado dentro de um container é temporário. Se o container for parado ou removido, os dados são perdidos.&lt;/p&gt;

&lt;p&gt;É aqui que entram os volumes no Docker, uma forma de mapear diretórios do host para dentro do container, garantindo persistência e até compartilhamento de arquivos.&lt;/p&gt;




&lt;p&gt;Como funciona o volume no Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exemplo base: docker run -d -p 8088:80 --name n-demo -v C:\Users\deivi\EstudoImagens\html:/usr/share/nginx/html:ro nginx:latest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos destrinchar da parte que interessa (-v) para frente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;(-v): Significa volume. É onde informamos o mapeamento entre o host e o container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(C:\Users\deivi\EstudoImagens\html:): É o caminho do host. Nesse diretório você tem seus arquivos HTML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(/usr/share/nginx/html): É o caminho dentro do container. O Nginx, por padrão, serve páginas desse diretório.&lt;br&gt;
Ou seja, o que está na pasta do host será espelhado aqui dentro do container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(:ro): É a permissão de acesso do container ao volume.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ro → read-only (somente leitura). O container pode ler, mas não alterar arquivos.&lt;/li&gt;
&lt;li&gt;rw → read-write (leitura e escrita, é o padrão). O container pode modificar arquivos.
_________________________________________________________________________&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Benefícios de usar volumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1 Persistência de dados: mesmo que o container seja parado ou recriado, os dados continuam salvos no host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2 Facilidade de desenvolvimento: você pode alterar arquivos no host e ver as mudanças refletirem no container em tempo real.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3 Compartilhamento: um volume pode ser usado por múltiplos containers ao mesmo tempo, permitindo colaboração entre serviços.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
