<?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>Forem: DeividFerraz</title>
    <description>The latest articles on Forem by DeividFerraz (@deividferraz).</description>
    <link>https://forem.com/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>Forem: DeividFerraz</title>
      <link>https://forem.com/deividferraz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/deividferraz"/>
    <language>en</language>
    <item>
      <title>Kubernetes local na prática: como eu estruturei ReplicaSet, Service, HPA e Ingress para subir minha aplicação no Minikube ☸️</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Wed, 08 Apr 2026 22:46:24 +0000</pubDate>
      <link>https://forem.com/deividferraz/kubernetes-local-na-pratica-como-eu-estruturei-replicaset-service-hpa-e-ingress-para-subir-minha-a0l</link>
      <guid>https://forem.com/deividferraz/kubernetes-local-na-pratica-como-eu-estruturei-replicaset-service-hpa-e-ingress-para-subir-minha-a0l</guid>
      <description>&lt;p&gt;Descrição&lt;/p&gt;

&lt;p&gt;Eu quis aprender Kubernetes entendendo a responsabilidade de cada recurso, em vez de apenas copiar manifestos prontos. Nesse processo, subi minha aplicação localmente no Minikube e conectei ReplicaSet, Service, HPA e Ingress até o fluxo fazer sentido de ponta a ponta. 🚀&lt;/p&gt;

&lt;p&gt;Tem uma forma muito comum de começar em Kubernetes:&lt;br&gt;
copiar alguns YAMLs, aplicar tudo e comemorar quando a aplicação responde.&lt;/p&gt;

&lt;p&gt;Só que eu quis fazer diferente.&lt;/p&gt;

&lt;p&gt;Em vez de focar apenas em “subir a app”, eu quis entender o que cada recurso faz de verdade dentro do cluster.&lt;/p&gt;

&lt;p&gt;Então montei minha estrutura localmente no Minikube, usando:&lt;/p&gt;

&lt;p&gt;ReplicaSet&lt;br&gt;
Service&lt;br&gt;
HPA&lt;br&gt;
Ingress&lt;br&gt;
namespace dedicado&lt;br&gt;
domínio local via hosts&lt;/p&gt;

&lt;p&gt;E isso me ajudou muito a visualizar o fluxo real da aplicação. 👇&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primeiro eu organizei o cluster 🧭&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de aplicar qualquer recurso, eu preferi deixar meu ambiente mais organizado.&lt;/p&gt;

&lt;p&gt;Criei um namespace próprio para a aplicação e já apontei meu contexto atual para ele:&lt;/p&gt;

&lt;p&gt;kubectl config use-context multinode&lt;br&gt;
kubectl create namespace meusite&lt;br&gt;
kubectl config set-context --current --namespace=meusite&lt;/p&gt;

&lt;p&gt;Isso foi importante por dois motivos:&lt;/p&gt;

&lt;p&gt;Tudo ficou isolado no mesmo namespace&lt;br&gt;
Ficou muito mais fácil de navegar no kubectl e no k9s&lt;/p&gt;

&lt;p&gt;Inclusive, para abrir o K9s já no lugar certo:&lt;/p&gt;

&lt;p&gt;k9s --context multinode -n meusite&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Meu primeiro recurso foi o ReplicaSet 🧱&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aqui eu fiz uma escolha intencional.&lt;/p&gt;

&lt;p&gt;Eu sei que, no mundo real, aplicações geralmente sobem com Deployment.&lt;br&gt;
Mas como meu foco era estudar a base, usei ReplicaSet.&lt;/p&gt;

&lt;p&gt;Queria ver mais de perto como o Kubernetes mantém a quantidade desejada de Pods.&lt;/p&gt;

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: ReplicaSet&lt;br&gt;
metadata:&lt;br&gt;
  name: site-soren-rs&lt;br&gt;
spec:&lt;br&gt;
  replicas: 1&lt;br&gt;
  selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: site-soren&lt;br&gt;
  template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: site-soren&lt;br&gt;
    spec:&lt;br&gt;
      containers:&lt;br&gt;
        - name: site-soren&lt;br&gt;
          image: deivid/nova-soren:latest&lt;br&gt;
          ports:&lt;br&gt;
            - containerPort: 8080&lt;/p&gt;

&lt;p&gt;Ele ficou com uma réplica só, justamente porque meu objetivo não era fazer escala fixa manual ali, e sim conectar isso depois com HPA.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Também defini recursos do container 💻&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dentro do ReplicaSet, eu já aproveitei para declarar CPU e memória.&lt;/p&gt;

&lt;p&gt;resources:&lt;br&gt;
  requests:&lt;br&gt;
    cpu: "100m"&lt;br&gt;
    memory: "128Mi"&lt;br&gt;
  limits:&lt;br&gt;
    cpu: "500m"&lt;br&gt;
    memory: "256Mi"&lt;/p&gt;

&lt;p&gt;Esses números parecem estranhos no começo, mas depois fazem sentido:&lt;/p&gt;

&lt;p&gt;100m = 0.1 core&lt;br&gt;
500m = 0.5 core&lt;br&gt;
128Mi = 128 mebibytes&lt;/p&gt;

&lt;p&gt;Na prática:&lt;/p&gt;

&lt;p&gt;requests = o mínimo reservado&lt;br&gt;
limits = o teto&lt;/p&gt;

&lt;p&gt;Isso ajuda tanto no agendamento quanto no comportamento da aplicação dentro do cluster.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O Service entrou para estabilizar a comunicação 🔄&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois criei o Service.&lt;/p&gt;

&lt;p&gt;Esse recurso foi um divisor de águas no meu entendimento.&lt;/p&gt;

&lt;p&gt;Porque o Pod não é fixo.&lt;br&gt;
Ele pode cair, subir de novo, mudar IP.&lt;/p&gt;

&lt;p&gt;Então o Service entra como um endereço estável e encontra os Pods pela label.&lt;/p&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: site-soren-service&lt;br&gt;
spec:&lt;br&gt;
  selector:&lt;br&gt;
    app: site-soren&lt;br&gt;
  ports:&lt;br&gt;
    - protocol: TCP&lt;br&gt;
      port: 4500&lt;br&gt;
      targetPort: 8080&lt;/p&gt;

&lt;p&gt;No meu caso:&lt;/p&gt;

&lt;p&gt;o Service expõe a porta 4500&lt;br&gt;
o container recebe na 8080&lt;/p&gt;

&lt;p&gt;Foi aqui que comecei a entender a relação:&lt;/p&gt;

&lt;p&gt;Ingress → Service → Pods&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escala automática com HPA 📊&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para não deixar minha aplicação “engessada”, adicionei um HPA.&lt;/p&gt;

&lt;p&gt;apiVersion: autoscaling/v2&lt;br&gt;
kind: HorizontalPodAutoscaler&lt;br&gt;
metadata:&lt;br&gt;
  name: site-soren-hpa&lt;br&gt;
spec:&lt;br&gt;
  scaleTargetRef:&lt;br&gt;
    apiVersion: apps/v1&lt;br&gt;
    kind: ReplicaSet&lt;br&gt;
    name: site-soren-rs&lt;br&gt;
  minReplicas: 1&lt;br&gt;
  maxReplicas: 10&lt;br&gt;
  metrics:&lt;br&gt;
    - type: Resource&lt;br&gt;
      resource:&lt;br&gt;
        name: cpu&lt;br&gt;
        target:&lt;br&gt;
          type: Utilization&lt;br&gt;
          averageUtilization: 70&lt;br&gt;
    - type: Resource&lt;br&gt;
      resource:&lt;br&gt;
        name: memory&lt;br&gt;
        target:&lt;br&gt;
          type: Utilization&lt;br&gt;
          averageUtilization: 80&lt;/p&gt;

&lt;p&gt;Uma dúvida que eu tinha e que muita gente tem:&lt;/p&gt;

&lt;p&gt;o HPA precisa que CPU e memória batam juntas?&lt;/p&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Ele olha as métricas separadamente.&lt;br&gt;
Se a CPU pedir mais escala antes, ele sobe.&lt;br&gt;
Se a memória pedir antes, ele sobe também.&lt;/p&gt;

&lt;p&gt;Então ele considera o cenário que está mais pressionando a aplicação naquele momento.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O Ingress foi a camada de entrada 🌍&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois veio o Ingress, que foi quem amarrou o domínio à aplicação.&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: Ingress&lt;br&gt;
metadata:&lt;br&gt;
  name: site-soren-ingress&lt;br&gt;
spec:&lt;br&gt;
  ingressClassName: nginx&lt;br&gt;
  rules:&lt;br&gt;
    - host: devid.ferraz.test&lt;br&gt;
      http:&lt;br&gt;
        paths:&lt;br&gt;
          - path: /&lt;br&gt;
            pathType: Prefix&lt;br&gt;
            backend:&lt;br&gt;
              service:&lt;br&gt;
                name: site-soren-service&lt;br&gt;
                port:&lt;br&gt;
                  number: 4500&lt;/p&gt;

&lt;p&gt;Aqui eu aprendi um detalhe importante:&lt;/p&gt;

&lt;p&gt;O objeto Ingress sozinho não faz milagre.&lt;br&gt;
Ele precisa de um Ingress Controller rodando no cluster.&lt;/p&gt;

&lt;p&gt;No Minikube, eu habilitei isso assim:&lt;/p&gt;

&lt;p&gt;minikube addons enable ingress -p multinode&lt;/p&gt;

&lt;p&gt;E dependendo do ambiente local, também usei:&lt;/p&gt;

&lt;p&gt;minikube tunnel -p multinode&lt;/p&gt;

&lt;p&gt;Então eu passei a explicar assim para mim mesmo:&lt;/p&gt;

&lt;p&gt;o Ingress define a regra&lt;br&gt;
o controller executa a regra&lt;br&gt;
o tunnel ajuda a expor isso localmente, quando necessário&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Como resolvi o domínio local 🏡&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como eu estava rodando tudo localmente, precisava que o meu domínio resolvesse para a máquina local.&lt;/p&gt;

&lt;p&gt;Então usei o arquivo hosts:&lt;/p&gt;

&lt;p&gt;127.0.0.1 devid.ferraz.test&lt;/p&gt;

&lt;p&gt;Isso fez com que minha máquina entendesse que devid.ferraz.test deveria apontar para o IP local.&lt;/p&gt;

&lt;p&gt;Esse detalhe também explica uma dúvida comum:&lt;/p&gt;

&lt;p&gt;por que localhost não funciona igual?&lt;/p&gt;

&lt;p&gt;Porque o Ingress estava esperando o host devid.ferraz.test.&lt;br&gt;
Então não bastava só chegar no IP certo — a requisição precisava chegar com o host certo também.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build da imagem e erro antes do image load 🐳&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Outro ponto que achei legal mostrar foi a diferença entre:&lt;/p&gt;

&lt;p&gt;a imagem existir na minha máquina&lt;br&gt;
a imagem existir dentro do cluster&lt;/p&gt;

&lt;p&gt;Eu buildava localmente:&lt;/p&gt;

&lt;p&gt;docker build -t deivid/nova-soren:latest .&lt;/p&gt;

&lt;p&gt;Mas antes de fazer o load, eu fazia questão de mostrar o erro.&lt;br&gt;
Porque, se a imagem não estiver disponível no cluster, o Pod não sobe do jeito esperado.&lt;/p&gt;

&lt;p&gt;Depois disso eu carregava a imagem no Minikube:&lt;/p&gt;

&lt;p&gt;minikube image load deivid/nova-soren:latest -p multinode&lt;/p&gt;

&lt;p&gt;E aí sim o cluster conseguia usar a imagem local.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aplicando os manifests ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois de organizar contexto, namespace, ingress e imagem, o apply ficou limpo:&lt;/p&gt;

&lt;p&gt;kubectl apply -f site-soren.yaml&lt;br&gt;
kubectl apply -f site-soren-service.yaml&lt;br&gt;
kubectl apply -f site-soren-hpa.yaml&lt;br&gt;
kubectl apply -f site-soren-ingress.yaml&lt;/p&gt;

&lt;p&gt;E depois era só conferir:&lt;/p&gt;

&lt;p&gt;kubectl get pods&lt;br&gt;
kubectl get svc&lt;br&gt;
kubectl get ingress&lt;br&gt;
kubectl get hpa&lt;/p&gt;

&lt;p&gt;Esse foi um ponto que eu gostei bastante de ajustar:&lt;br&gt;
em vez de repetir --context multinode -n meusite em todo comando, eu defini isso antes uma vez e deixei o terminal preparado.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O que eu realmente aprendi com esse processo 💡&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O maior ganho não foi só ver minha aplicação abrir no navegador.&lt;/p&gt;

&lt;p&gt;Foi entender a responsabilidade de cada peça.&lt;/p&gt;

&lt;p&gt;ReplicaSet mantém os Pods&lt;br&gt;
Service estabiliza a comunicação&lt;br&gt;
HPA escala quando a carga sobe&lt;br&gt;
Ingress recebe o tráfego HTTP&lt;br&gt;
hosts resolve o domínio local&lt;br&gt;
image load leva a imagem para dentro do cluster local&lt;/p&gt;

&lt;p&gt;Depois que enxerguei isso, Kubernetes deixou de parecer só um monte de YAML.&lt;/p&gt;

&lt;p&gt;Passou a parecer uma arquitetura que conversa entre si.&lt;/p&gt;

&lt;p&gt;E, honestamente, esse tipo de estudo na prática me ensinou muito mais do que só assistir explicação isolada.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Services no Kubernetes</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Mon, 06 Apr 2026 02:07:57 +0000</pubDate>
      <link>https://forem.com/deividferraz/services-no-kubernetes-4khc</link>
      <guid>https://forem.com/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://forem.com/deividferraz/crashloopbackoff-no-kubernetes-o-que-e-e-por-que-acontece-4bkn</link>
      <guid>https://forem.com/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://forem.com/deividferraz/etcd-a-camada-de-armazenamento-do-kubernetes-2kk4</link>
      <guid>https://forem.com/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://forem.com/deividferraz/deploy-aplicacao-no-cluster-do-aks-52il</link>
      <guid>https://forem.com/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://forem.com/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-55i9</link>
      <guid>https://forem.com/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://forem.com/deividferraz/pods-no-kubernetes-com-2-containers-no-mesmo-pod-1p0p</link>
      <guid>https://forem.com/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://forem.com/deividferraz/redes-virtuais-do-azure-39o1</link>
      <guid>https://forem.com/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://forem.com/deividferraz/docker-compose-simplificando-o-gerenciamento-de-containers-18e1</link>
      <guid>https://forem.com/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://forem.com/deividferraz/imagens-e-containers-pensando-como-classe-e-instancia-2nj4</link>
      <guid>https://forem.com/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://forem.com/deividferraz/conceito-de-redes-em-docker-3dhd</link>
      <guid>https://forem.com/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://forem.com/deividferraz/-d37</link>
      <guid>https://forem.com/deividferraz/-d37</guid>
      <description></description>
      <category>bootstrap</category>
    </item>
  </channel>
</rss>
