<?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 RBAC: controlando quem pode fazer o quê dentro do cluster 🔐☸️</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Fri, 08 May 2026 17:44:41 +0000</pubDate>
      <link>https://forem.com/deividferraz/kubernetes-rbac-controlando-quem-pode-fazer-o-que-dentro-do-cluster-hml</link>
      <guid>https://forem.com/deividferraz/kubernetes-rbac-controlando-quem-pode-fazer-o-que-dentro-do-cluster-hml</guid>
      <description>&lt;p&gt;Quando falamos de segurança em Kubernetes, um dos recursos mais importantes é o RBAC.&lt;/p&gt;

&lt;p&gt;RBAC significa Role-Based Access Control, ou seja, controle de acesso baseado em papéis.&lt;/p&gt;

&lt;p&gt;Na prática, ele responde uma pergunta muito simples:&lt;/p&gt;

&lt;p&gt;Quem pode fazer o quê dentro do cluster?&lt;/p&gt;

&lt;p&gt;E isso é essencial para evitar que qualquer usuário, aplicação ou automação tenha acesso maior do que deveria.&lt;/p&gt;

&lt;p&gt;O que o RBAC controla? 🤔&lt;/p&gt;

&lt;p&gt;Com RBAC, conseguimos definir limites de acesso para recursos do Kubernetes, como:&lt;/p&gt;

&lt;p&gt;✅ Pods&lt;br&gt;
✅ Deployments&lt;br&gt;
✅ Services&lt;br&gt;
✅ ConfigMaps&lt;br&gt;
✅ Secrets&lt;br&gt;
✅ Namespaces&lt;br&gt;
✅ Nodes&lt;br&gt;
✅ Jobs&lt;br&gt;
✅ Ingress&lt;br&gt;
✅ Recursos customizados&lt;/p&gt;

&lt;p&gt;Essas permissões podem ser aplicadas para:&lt;/p&gt;

&lt;p&gt;👤 Users&lt;br&gt;
👥 Groups&lt;br&gt;
🤖 ServiceAccounts&lt;/p&gt;

&lt;p&gt;Ou seja, podemos controlar tanto acessos humanos quanto acessos de aplicações que rodam dentro do cluster.&lt;/p&gt;

&lt;p&gt;Os principais recursos do RBAC 🧩&lt;/p&gt;

&lt;p&gt;No Kubernetes, trabalhamos principalmente com quatro recursos:&lt;/p&gt;

&lt;p&gt;✅ Role&lt;br&gt;
✅ ClusterRole&lt;br&gt;
✅ RoleBinding&lt;br&gt;
✅ ClusterRoleBinding&lt;/p&gt;

&lt;p&gt;Cada um tem uma função bem específica.&lt;/p&gt;

&lt;p&gt;Role: permissões dentro de um namespace 📦&lt;/p&gt;

&lt;p&gt;A Role é usada para criar regras de acesso dentro de um namespace específico.&lt;/p&gt;

&lt;p&gt;Ou seja, ela não vale para o cluster inteiro.&lt;/p&gt;

&lt;p&gt;Exemplo de uma Role permitindo listar, visualizar, alterar e deletar Pods e Deployments dentro do namespace dev:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: Role&lt;br&gt;
metadata:&lt;br&gt;
  name: workload-manager&lt;br&gt;
  namespace: dev&lt;br&gt;
rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;apiGroups: [""]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods
verbs:&lt;/li&gt;
&lt;li&gt;get&lt;/li&gt;
&lt;li&gt;list&lt;/li&gt;
&lt;li&gt;watch&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;patch&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;apiGroups: ["apps"]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployments
verbs:&lt;/li&gt;
&lt;li&gt;get&lt;/li&gt;
&lt;li&gt;list&lt;/li&gt;
&lt;li&gt;watch&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;patch&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Nesse exemplo, estamos dizendo:&lt;/p&gt;

&lt;p&gt;👉 Dentro do namespace dev, quem receber essa Role poderá consultar, listar, acompanhar, alterar e deletar Pods e Deployments.&lt;/p&gt;

&lt;p&gt;ClusterRole: permissões em nível de cluster 🌎&lt;/p&gt;

&lt;p&gt;A ClusterRole é parecida com a Role, mas ela não fica presa a um namespace.&lt;/p&gt;

&lt;p&gt;Ela pode ser usada para permissões em nível de cluster ou para criar uma regra reutilizável em vários namespaces.&lt;/p&gt;

&lt;p&gt;Exemplo de ClusterRole com a mesma ideia:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: ClusterRole&lt;br&gt;
metadata:&lt;br&gt;
  name: workload-manager-cluster&lt;br&gt;
rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;apiGroups: [""]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods
verbs:&lt;/li&gt;
&lt;li&gt;get&lt;/li&gt;
&lt;li&gt;list&lt;/li&gt;
&lt;li&gt;watch&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;patch&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;apiGroups: ["apps"]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployments
verbs:&lt;/li&gt;
&lt;li&gt;get&lt;/li&gt;
&lt;li&gt;list&lt;/li&gt;
&lt;li&gt;watch&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;patch&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Aqui criamos uma regra em contexto de cluster.&lt;/p&gt;

&lt;p&gt;Mas atenção: criar uma ClusterRole não significa que alguém já tem esse acesso.&lt;/p&gt;

&lt;p&gt;A regra fica criada, mas ainda precisa ser vinculada a alguém.&lt;/p&gt;

&lt;p&gt;Binding: ligando a regra a alguém 🔗&lt;/p&gt;

&lt;p&gt;Role e ClusterRole definem o que pode ser feito.&lt;/p&gt;

&lt;p&gt;RoleBinding e ClusterRoleBinding definem quem pode fazer.&lt;/p&gt;

&lt;p&gt;Essa é uma das partes mais importantes do RBAC.&lt;/p&gt;

&lt;p&gt;RoleBinding: acesso limitado a um namespace 📦&lt;/p&gt;

&lt;p&gt;Agora vamos ligar a Role workload-manager a um usuário chamado john.&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: john-workload-manager&lt;br&gt;
  namespace: dev&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: User
name: john
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: workload-manager
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, o usuário john recebe as permissões da Role workload-manager, mas somente dentro do namespace dev.&lt;/p&gt;

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

&lt;p&gt;✅ pode atuar no namespace dev&lt;br&gt;
❌ não recebe acesso automático aos outros namespaces&lt;/p&gt;

&lt;p&gt;Usando ClusterRole com RoleBinding 🎯&lt;/p&gt;

&lt;p&gt;Um ponto muito interessante do RBAC é que podemos usar uma ClusterRole com um RoleBinding.&lt;/p&gt;

&lt;p&gt;Isso permite reaproveitar uma regra criada em nível de cluster, mas limitar o acesso a um namespace específico.&lt;/p&gt;

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

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: john-clusterrole-limited-to-dev&lt;br&gt;
  namespace: dev&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: User
name: john
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: workload-manager-cluster
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui estamos dizendo:&lt;/p&gt;

&lt;p&gt;👉 Use a ClusterRole workload-manager-cluster, mas aplique esse acesso somente dentro do namespace dev.&lt;/p&gt;

&lt;p&gt;Esse modelo é muito útil quando queremos criar permissões padronizadas e reutilizar em vários namespaces.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;📌 mesma permissão para times diferentes&lt;br&gt;
📌 mesma regra para ambientes dev, stage e prod&lt;br&gt;
📌 mesmo padrão de acesso para vários namespaces&lt;br&gt;
📌 menos repetição de YAML&lt;br&gt;
📌 mais controle e organização&lt;/p&gt;

&lt;p&gt;ClusterRoleBinding: acesso em todo o cluster 🌎&lt;/p&gt;

&lt;p&gt;Agora, se quisermos dar acesso em nível de cluster, usamos um ClusterRoleBinding.&lt;/p&gt;

&lt;p&gt;Exemplo vinculando a ClusterRole ao usuário john:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: ClusterRoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: john-workload-manager-cluster&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: User
name: john
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: workload-manager-cluster
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, o usuário john recebe as permissões da ClusterRole em todo o cluster.&lt;/p&gt;

&lt;p&gt;Ou seja, ele poderá atuar em todos os namespaces onde aqueles recursos existirem.&lt;/p&gt;

&lt;p&gt;Aqui o cuidado precisa ser maior.&lt;/p&gt;

&lt;p&gt;ClusterRoleBinding pode abrir muito acesso se for usado sem critério.&lt;/p&gt;

&lt;p&gt;Importante ⚠️&lt;/p&gt;

&lt;p&gt;Podemos fazer isso:&lt;/p&gt;

&lt;p&gt;✅ Role + RoleBinding&lt;br&gt;
✅ ClusterRole + RoleBinding&lt;br&gt;
✅ ClusterRole + ClusterRoleBinding&lt;/p&gt;

&lt;p&gt;Mas não usamos uma Role comum com ClusterRoleBinding.&lt;/p&gt;

&lt;p&gt;Isso não faz sentido porque uma Role é um recurso limitado a namespace, enquanto um ClusterRoleBinding aplica acesso em nível de cluster.&lt;/p&gt;

&lt;p&gt;Se a ideia é conceder acesso global, a regra precisa estar em uma ClusterRole.&lt;/p&gt;

&lt;p&gt;RBAC com ServiceAccount 🤖&lt;/p&gt;

&lt;p&gt;Até agora vimos exemplos com usuário, mas RBAC também é muito usado com ServiceAccount.&lt;/p&gt;

&lt;p&gt;ServiceAccount é muito comum quando uma aplicação, controller, pipeline, job ou automação precisa acessar a API do Kubernetes.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;📌 um controller que lista Pods&lt;br&gt;
📌 um Job que precisa consultar ConfigMaps&lt;br&gt;
📌 uma aplicação que precisa ler Secrets&lt;br&gt;
📌 um operador que gerencia recursos customizados&lt;br&gt;
📌 uma automação de deploy dentro do cluster&lt;/p&gt;

&lt;p&gt;Criando uma ServiceAccount 👇&lt;br&gt;
apiVersion: v1&lt;br&gt;
kind: ServiceAccount&lt;br&gt;
metadata:&lt;br&gt;
  name: app-manager&lt;br&gt;
  namespace: dev&lt;/p&gt;

&lt;p&gt;Agora podemos vincular essa ServiceAccount a uma Role ou ClusterRole.&lt;/p&gt;

&lt;p&gt;ServiceAccount com RoleBinding 📦&lt;/p&gt;

&lt;p&gt;Exemplo usando a Role workload-manager no namespace dev:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: app-manager-rolebinding&lt;br&gt;
  namespace: dev&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: ServiceAccount
name: app-manager
namespace: dev
roleRef:
kind: Role
name: workload-manager
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, a ServiceAccount app-manager terá acesso somente dentro do namespace dev.&lt;/p&gt;

&lt;p&gt;Esse é um padrão bem comum quando queremos limitar uma aplicação ao próprio namespace.&lt;/p&gt;

&lt;p&gt;ServiceAccount usando ClusterRole com RoleBinding 🎯&lt;/p&gt;

&lt;p&gt;Também podemos usar uma ClusterRole com RoleBinding para limitar o acesso da ServiceAccount a um namespace específico.&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: app-manager-clusterrole-limited-to-dev&lt;br&gt;
  namespace: dev&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: ServiceAccount
name: app-manager
namespace: dev
roleRef:
kind: ClusterRole
name: workload-manager-cluster
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui a regra vem de uma ClusterRole, mas o acesso fica limitado ao namespace dev.&lt;/p&gt;

&lt;p&gt;Esse modelo é excelente para padronizar permissões sem liberar acesso ao cluster inteiro.&lt;/p&gt;

&lt;p&gt;ServiceAccount com ClusterRoleBinding 🌎&lt;/p&gt;

&lt;p&gt;Agora, se essa ServiceAccount realmente precisar atuar em todo o cluster, usamos ClusterRoleBinding.&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: ClusterRoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: app-manager-clusterrolebinding&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: ServiceAccount
name: app-manager
namespace: dev
roleRef:
kind: ClusterRole
name: workload-manager-cluster
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, a ServiceAccount app-manager, mesmo estando no namespace dev, recebe permissão em nível de cluster.&lt;/p&gt;

&lt;p&gt;Esse tipo de permissão deve ser usado com muito cuidado.&lt;/p&gt;

&lt;p&gt;Verbs mais usados no RBAC 🛠️&lt;/p&gt;

&lt;p&gt;Os verbs representam as ações que podem ser executadas nos recursos.&lt;/p&gt;

&lt;p&gt;Alguns dos mais comuns são:&lt;/p&gt;

&lt;p&gt;✅ get&lt;br&gt;
Permite visualizar um recurso específico.&lt;/p&gt;

&lt;p&gt;✅ list&lt;br&gt;
Permite listar vários recursos.&lt;/p&gt;

&lt;p&gt;✅ watch&lt;br&gt;
Permite acompanhar mudanças nos recursos em tempo real.&lt;/p&gt;

&lt;p&gt;✅ create&lt;br&gt;
Permite criar novos recursos.&lt;/p&gt;

&lt;p&gt;✅ update&lt;br&gt;
Permite atualizar um recurso existente.&lt;/p&gt;

&lt;p&gt;✅ patch&lt;br&gt;
Permite aplicar alterações parciais em um recurso.&lt;/p&gt;

&lt;p&gt;✅ delete&lt;br&gt;
Permite deletar recursos.&lt;/p&gt;

&lt;p&gt;✅ deletecollection&lt;br&gt;
Permite deletar múltiplos recursos de uma vez.&lt;/p&gt;

&lt;p&gt;✅ impersonate&lt;br&gt;
Permite agir como outro usuário, grupo ou ServiceAccount.&lt;/p&gt;

&lt;p&gt;✅ bind&lt;br&gt;
Permite vincular roles a usuários ou ServiceAccounts.&lt;/p&gt;

&lt;p&gt;✅ escalate&lt;br&gt;
Permite criar ou modificar roles com permissões maiores.&lt;/p&gt;

&lt;p&gt;Os verbs bind, escalate e impersonate merecem atenção especial, porque podem abrir caminho para elevação de privilégio.&lt;/p&gt;

&lt;p&gt;Resources mais usados 📦&lt;/p&gt;

&lt;p&gt;Os resources são os objetos do Kubernetes que queremos controlar.&lt;/p&gt;

&lt;p&gt;Alguns exemplos comuns:&lt;/p&gt;

&lt;p&gt;resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods&lt;/li&gt;
&lt;li&gt;deployments&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;configmaps&lt;/li&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;namespaces&lt;/li&gt;
&lt;li&gt;nodes&lt;/li&gt;
&lt;li&gt;jobs&lt;/li&gt;
&lt;li&gt;cronjobs&lt;/li&gt;
&lt;li&gt;ingresses&lt;/li&gt;
&lt;li&gt;serviceaccounts&lt;/li&gt;
&lt;li&gt;roles&lt;/li&gt;
&lt;li&gt;rolebindings&lt;/li&gt;
&lt;li&gt;clusterroles&lt;/li&gt;
&lt;li&gt;clusterrolebindings&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apiGroups: [""]
resources:

&lt;ul&gt;
&lt;li&gt;pods&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;configmaps
verbs:&lt;/li&gt;
&lt;li&gt;get&lt;/li&gt;
&lt;li&gt;list&lt;/li&gt;
&lt;li&gt;watch
API Groups mais usados 🧱&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No Kubernetes, os recursos são organizados por apiGroups.&lt;/p&gt;

&lt;p&gt;Alguns exemplos:&lt;/p&gt;

&lt;p&gt;apiGroups: [""]&lt;/p&gt;

&lt;p&gt;Usado para recursos core, como:&lt;/p&gt;

&lt;p&gt;pods&lt;br&gt;
services&lt;br&gt;
configmaps&lt;br&gt;
secrets&lt;br&gt;
namespaces&lt;/p&gt;

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

&lt;p&gt;apiGroups: [""]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods&lt;/li&gt;
&lt;li&gt;services
apiGroups: ["apps"]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usado para recursos como:&lt;/p&gt;

&lt;p&gt;deployments&lt;br&gt;
replicasets&lt;br&gt;
statefulsets&lt;br&gt;
daemonsets&lt;/p&gt;

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

&lt;p&gt;apiGroups: ["apps"]&lt;br&gt;
resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployments&lt;/li&gt;
&lt;li&gt;statefulsets
apiGroups: ["batch"]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usado para:&lt;/p&gt;

&lt;p&gt;jobs&lt;br&gt;
cronjobs&lt;br&gt;
apiGroups: ["networking.k8s.io"]&lt;/p&gt;

&lt;p&gt;Usado para:&lt;/p&gt;

&lt;p&gt;ingresses&lt;br&gt;
networkpolicies&lt;br&gt;
apiGroups: ["rbac.authorization.k8s.io"]&lt;/p&gt;

&lt;p&gt;Usado para recursos do próprio RBAC:&lt;/p&gt;

&lt;p&gt;roles&lt;br&gt;
rolebindings&lt;br&gt;
clusterroles&lt;br&gt;
clusterrolebindings&lt;br&gt;
Como testar permissões com kubectl 🧪&lt;/p&gt;

&lt;p&gt;Uma forma muito útil de validar RBAC é usando:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i&lt;/p&gt;

&lt;p&gt;Exemplo testando se o usuário john pode listar Pods no namespace dev:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i list pods -n dev --as=john&lt;/p&gt;

&lt;p&gt;Testando se ele pode deletar Deployments no namespace dev:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i delete deployments -n dev --as=john&lt;/p&gt;

&lt;p&gt;Testando se ele pode listar Pods em outro namespace:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i list pods -n prod --as=john&lt;/p&gt;

&lt;p&gt;Se o acesso estiver limitado ao namespace dev, esse comando deve retornar:&lt;/p&gt;

&lt;p&gt;no&lt;br&gt;
Testando ServiceAccount 🤖&lt;/p&gt;

&lt;p&gt;Para testar permissões de uma ServiceAccount, usamos o formato:&lt;/p&gt;

&lt;p&gt;system:serviceaccount:namespace:nome-da-serviceaccount&lt;/p&gt;

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

&lt;p&gt;kubectl auth can-i list pods -n dev --as=system:serviceaccount:dev:app-manager&lt;/p&gt;

&lt;p&gt;Testando delete em Deployments:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i delete deployments -n dev --as=system:serviceaccount:dev:app-manager&lt;/p&gt;

&lt;p&gt;Testando acesso fora do namespace:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i list pods -n prod --as=system:serviceaccount:dev:app-manager&lt;/p&gt;

&lt;p&gt;Esse tipo de teste ajuda muito a validar se a permissão está realmente funcionando como esperado.&lt;/p&gt;

&lt;p&gt;Por que usar RBAC? 🚀&lt;/p&gt;

&lt;p&gt;RBAC é essencial para segurança e organização dentro de um cluster Kubernetes.&lt;/p&gt;

&lt;p&gt;Com ele, conseguimos aplicar o princípio do menor privilégio.&lt;/p&gt;

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

&lt;p&gt;cada usuário, aplicação ou automação recebe somente as permissões que realmente precisa.&lt;/p&gt;

&lt;p&gt;Isso reduz bastante o risco de problemas.&lt;/p&gt;

&lt;p&gt;RBAC ajuda em cenários como:&lt;/p&gt;

&lt;p&gt;✅ separar permissões por time&lt;br&gt;
✅ limitar acesso por namespace&lt;br&gt;
✅ proteger recursos sensíveis como Secrets&lt;br&gt;
✅ evitar alterações acidentais em produção&lt;br&gt;
✅ impedir que aplicações tenham acesso excessivo&lt;br&gt;
✅ controlar permissões de pipelines e automações&lt;br&gt;
✅ reduzir impacto em caso de credencial comprometida&lt;br&gt;
✅ melhorar governança e auditoria dentro do cluster&lt;/p&gt;

&lt;p&gt;Conclusão 🔐☸️&lt;/p&gt;

&lt;p&gt;RBAC é uma das bases de segurança no Kubernetes.&lt;/p&gt;

&lt;p&gt;Ele permite controlar de forma clara:&lt;/p&gt;

&lt;p&gt;👤 quem acessa&lt;br&gt;
🛠️ o que pode fazer&lt;br&gt;
📦 em qual recurso&lt;br&gt;
🌎 em qual escopo&lt;/p&gt;

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

&lt;p&gt;Role e ClusterRole criam as regras.&lt;br&gt;
RoleBinding e ClusterRoleBinding entregam essas regras para alguém.&lt;/p&gt;

&lt;p&gt;Quando usamos RBAC bem configurado, o cluster fica mais seguro, organizado e previsível.&lt;/p&gt;

&lt;p&gt;No fim, não é só sobre bloquear acesso.&lt;/p&gt;

&lt;p&gt;É sobre garantir que cada pessoa, aplicação ou automação tenha exatamente o acesso necessário.&lt;/p&gt;

&lt;p&gt;Nem mais.&lt;br&gt;
Nem menos. 🔐&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>security</category>
    </item>
    <item>
      <title>Kubernetes NetworkPolicy: controlando quem fala com quem dentro do cluster 🔐☸️</title>
      <dc:creator>DeividFerraz</dc:creator>
      <pubDate>Fri, 08 May 2026 15:35:16 +0000</pubDate>
      <link>https://forem.com/deividferraz/kubernetes-networkpolicy-controlando-quem-fala-com-quem-dentro-do-cluster-2l1a</link>
      <guid>https://forem.com/deividferraz/kubernetes-networkpolicy-controlando-quem-fala-com-quem-dentro-do-cluster-2l1a</guid>
      <description>&lt;p&gt;Quando falamos de segurança em Kubernetes, muita gente lembra de RBAC, Secrets, ServiceAccounts, imagens seguras e scanners.&lt;/p&gt;

&lt;p&gt;Mas existe uma camada extremamente importante que muitas vezes passa despercebida:&lt;/p&gt;

&lt;p&gt;👉 o controle de tráfego entre Pods.&lt;/p&gt;

&lt;p&gt;É aqui que entra a NetworkPolicy.&lt;/p&gt;

&lt;p&gt;O que é uma NetworkPolicy? 🤔&lt;br&gt;
De forma simples, uma NetworkPolicy é um recurso do Kubernetes usado para controlar políticas de entrada e saída de tráfego entre:&lt;/p&gt;

&lt;p&gt;✅ Pods ✅ Namespaces ✅ Blocos de IP ✅ Portas específicas&lt;/p&gt;

&lt;p&gt;Com esse recurso, conseguimos definir exatamente:&lt;/p&gt;

&lt;p&gt;🔹 quem pode acessar um Pod 🔹 para onde um Pod pode enviar tráfego 🔹 quais portas podem ser utilizadas 🔹 quais aplicações devem ficar isoladas 🔹 quais namespaces podem se comunicar&lt;/p&gt;

&lt;p&gt;Tudo isso é feito principalmente através de labels.&lt;/p&gt;

&lt;p&gt;Ou seja, nós marcamos os Pods com labels e depois criamos regras dizendo quais labels podem se comunicar com outras labels.&lt;/p&gt;

&lt;p&gt;Um ponto importante: para a NetworkPolicy funcionar, o CNI do cluster precisa dar suporte a esse recurso. Alguns exemplos são Calico, Cilium, Weave Net, entre outros.&lt;/p&gt;

&lt;p&gt;Controlando acesso de entrada com Ingress 🚪&lt;br&gt;
Imagine que temos uma aplicação sensível rodando em Pods com a label:&lt;/p&gt;

&lt;p&gt;app: api&lt;br&gt;
Agora queremos permitir que essa API seja acessada somente por Pods que tenham a label:&lt;/p&gt;

&lt;p&gt;access: granted&lt;br&gt;
A NetworkPolicy ficaria assim:&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: NetworkPolicy&lt;br&gt;
metadata:&lt;br&gt;
  name: allow-api-from-granted&lt;br&gt;
  namespace: default&lt;br&gt;
spec:&lt;br&gt;
  podSelector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: api&lt;br&gt;
  policyTypes:&lt;br&gt;
    - Ingress&lt;br&gt;
  ingress:&lt;br&gt;
    - from:&lt;br&gt;
        - podSelector:&lt;br&gt;
            matchLabels:&lt;br&gt;
              access: granted&lt;br&gt;
Nesse exemplo, estamos dizendo:&lt;/p&gt;

&lt;p&gt;👉 Pods com app: api só podem receber tráfego de Pods com access: granted.&lt;/p&gt;

&lt;p&gt;Qualquer outro Pod que não tenha essa label não deve conseguir acessar essa API.&lt;/p&gt;

&lt;p&gt;Esse tipo de política é muito útil quando temos workloads mais sensíveis, como:&lt;/p&gt;

&lt;p&gt;🔐 bancos de dados 🔐 APIs internas 🔐 serviços administrativos 🔐 aplicações com dados financeiros 🔐 serviços de autenticação 🔐 aplicações que não devem estar disponíveis para todo o cluster&lt;/p&gt;

&lt;p&gt;Essa é uma camada extra de segurança muito importante.&lt;/p&gt;

&lt;p&gt;Mesmo que alguém consiga subir um Pod no cluster, isso não significa que ele conseguirá se comunicar com todos os serviços.&lt;/p&gt;

&lt;p&gt;Controlando saída de tráfego com Egress 📤&lt;br&gt;
Além de controlar quem acessa um Pod, também podemos controlar para onde um Pod pode enviar tráfego.&lt;/p&gt;

&lt;p&gt;Esse tipo de regra é chamado de Egress.&lt;/p&gt;

&lt;p&gt;Imagine agora que os Pods com a label:&lt;/p&gt;

&lt;p&gt;app: api&lt;br&gt;
só podem enviar tráfego para Pods com a label:&lt;/p&gt;

&lt;p&gt;access: find-api&lt;br&gt;
A NetworkPolicy ficaria assim:&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: NetworkPolicy&lt;br&gt;
metadata:&lt;br&gt;
  name: allow-api-egress-to-find-api&lt;br&gt;
  namespace: default&lt;br&gt;
spec:&lt;br&gt;
  podSelector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: api&lt;br&gt;
  policyTypes:&lt;br&gt;
    - Egress&lt;br&gt;
  egress:&lt;br&gt;
    - to:&lt;br&gt;
        - podSelector:&lt;br&gt;
            matchLabels:&lt;br&gt;
              access: find-api&lt;br&gt;
Aqui estamos dizendo:&lt;/p&gt;

&lt;p&gt;👉 Pods com app: api só podem enviar tráfego para Pods com access: find-api.&lt;/p&gt;

&lt;p&gt;Esse tipo de controle é muito interessante quando um Pod tem um objetivo bem específico.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;📌 uma API que só deve falar com um banco de dados 📌 um worker que só deve consumir mensagens de uma fila 📌 um serviço que só deve chamar uma API interna 📌 um Pod com permissões críticas que não deve acessar qualquer outro serviço 📌 uma aplicação que só deve se comunicar com um único backend&lt;/p&gt;

&lt;p&gt;Isso ajuda bastante a reduzir o impacto caso alguma aplicação seja comprometida.&lt;/p&gt;

&lt;p&gt;Controlando acesso por portas 🎯&lt;br&gt;
Além de controlar origem e destino, também conseguimos controlar portas e protocolos.&lt;/p&gt;

&lt;p&gt;Os protocolos mais comuns em NetworkPolicy são:&lt;/p&gt;

&lt;p&gt;TCP&lt;br&gt;
UDP&lt;br&gt;
SCTP&lt;br&gt;
HTTP normalmente roda sobre TCP, geralmente na porta 80.&lt;/p&gt;

&lt;p&gt;HTTPS normalmente roda sobre TCP, geralmente na porta 443.&lt;/p&gt;

&lt;p&gt;DNS geralmente usa UDP na porta 53, mas também pode usar TCP na porta 53 em alguns cenários.&lt;/p&gt;

&lt;p&gt;Exemplo permitindo acesso apenas nas portas 80/TCP e 53/TCP/UDP:&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: NetworkPolicy&lt;br&gt;
metadata:&lt;br&gt;
  name: allow-api-specific-ports&lt;br&gt;
  namespace: default&lt;br&gt;
spec:&lt;br&gt;
  podSelector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: api&lt;br&gt;
  policyTypes:&lt;br&gt;
    - Ingress&lt;br&gt;
  ingress:&lt;br&gt;
    - from:&lt;br&gt;
        - podSelector:&lt;br&gt;
            matchLabels:&lt;br&gt;
              access: granted&lt;br&gt;
      ports:&lt;br&gt;
        - protocol: TCP&lt;br&gt;
          port: 80&lt;br&gt;
        - protocol: TCP&lt;br&gt;
          port: 53&lt;br&gt;
        - protocol: UDP&lt;br&gt;
          port: 53&lt;br&gt;
Nesse exemplo, os Pods com app: api só podem ser acessados por Pods com access: granted, e apenas nas portas configuradas.&lt;/p&gt;

&lt;p&gt;Isso é muito útil quando queremos garantir que uma aplicação seja acessada somente pelo caminho esperado.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;🌐 uma API somente pela porta 80 🔒 uma API HTTPS somente pela porta 443 🐘 um PostgreSQL somente pela porta 5432 ⚡ um Redis somente pela porta 6379 📡 um serviço DNS somente pela porta 53&lt;/p&gt;

&lt;p&gt;Testando se as políticas estão funcionando 🧪&lt;br&gt;
Depois de criar as políticas, é importante validar se o comportamento está correto.&lt;/p&gt;

&lt;p&gt;Podemos usar kubectl exec para entrar em um Pod e testar a comunicação.&lt;/p&gt;

&lt;p&gt;Testando acesso HTTP 🌐&lt;br&gt;
kubectl exec pod-name -n namespace -- wget -qO- &lt;a href="http://ip-do-pod" rel="noopener noreferrer"&gt;http://ip-do-pod&lt;/a&gt;&lt;br&gt;
Esse comando pode ser usado para verificar se um Pod consegue acessar outro via HTTP.&lt;/p&gt;

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

&lt;p&gt;kubectl exec client-pod -n default -- wget -qO- &lt;a href="http://10.0.0.20" rel="noopener noreferrer"&gt;http://10.0.0.20&lt;/a&gt;&lt;br&gt;
Aqui podemos testar se o Pod de origem com a label access: granted consegue acessar o Pod de destino com a label app: api.&lt;/p&gt;

&lt;p&gt;Também vale testar com um Pod sem a label access: granted.&lt;/p&gt;

&lt;p&gt;Nesse caso, o acesso deve falhar.&lt;/p&gt;

&lt;p&gt;Testando conexão em uma porta específica 🎯&lt;br&gt;
kubectl exec pod-name -n namespace -- nc -zv ip-do-pod porta&lt;br&gt;
Exemplo:&lt;/p&gt;

&lt;p&gt;kubectl exec client-pod -n default -- nc -zv 10.0.0.20 80&lt;br&gt;
Esse comando testa se uma porta está acessível.&lt;/p&gt;

&lt;p&gt;Se a política permitir tráfego na porta 80/TCP, a conexão deve funcionar.&lt;/p&gt;

&lt;p&gt;Se você testar uma porta não permitida, a conexão deve falhar.&lt;/p&gt;

&lt;p&gt;Testando DNS 📡&lt;br&gt;
kubectl exec pod-name -n namespace -- nslookup kubernetes.default&lt;br&gt;
Exemplo:&lt;/p&gt;

&lt;p&gt;kubectl exec client-pod -n default -- nslookup kubernetes.default&lt;br&gt;
Esse teste é muito importante principalmente quando criamos regras de Egress.&lt;/p&gt;

&lt;p&gt;Quando bloqueamos toda a saída de um Pod, podemos acabar bloqueando também a resolução de DNS.&lt;/p&gt;

&lt;p&gt;E aí acontece aquele cenário clássico:&lt;/p&gt;

&lt;p&gt;a aplicação até tem permissão para acessar um serviço, mas não consegue resolver o nome dele.&lt;/p&gt;

&lt;p&gt;Por isso, em políticas de Egress mais restritivas, normalmente precisamos liberar tráfego para o DNS do cluster.&lt;/p&gt;

&lt;p&gt;Exemplo liberando DNS em Egress 📡&lt;br&gt;
apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: NetworkPolicy&lt;br&gt;
metadata:&lt;br&gt;
  name: allow-api-egress-dns&lt;br&gt;
  namespace: default&lt;br&gt;
spec:&lt;br&gt;
  podSelector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: api&lt;br&gt;
  policyTypes:&lt;br&gt;
    - Egress&lt;br&gt;
  egress:&lt;br&gt;
    - to:&lt;br&gt;
        - namespaceSelector:&lt;br&gt;
            matchLabels:&lt;br&gt;
              kubernetes.io/metadata.name: kube-system&lt;br&gt;
      ports:&lt;br&gt;
        - protocol: UDP&lt;br&gt;
          port: 53&lt;br&gt;
        - protocol: TCP&lt;br&gt;
          port: 53&lt;br&gt;
Com isso, os Pods com app: api conseguem consultar o DNS do cluster.&lt;/p&gt;

&lt;p&gt;Esse tipo de regra é muito comum quando criamos políticas de saída mais restritivas.&lt;/p&gt;

&lt;p&gt;Um ponto de atenção ⚠️&lt;br&gt;
Quando aplicamos uma NetworkPolicy em um Pod, o comportamento de rede muda.&lt;/p&gt;

&lt;p&gt;Se criamos uma política do tipo Ingress, o Pod passa a aceitar somente o tráfego de entrada permitido por aquela política.&lt;/p&gt;

&lt;p&gt;Se criamos uma política do tipo Egress, o Pod passa a enviar somente o tráfego de saída permitido por aquela política.&lt;/p&gt;

&lt;p&gt;Ou seja: é muito fácil bloquear mais do que deveria se a política não for bem planejada.&lt;/p&gt;

&lt;p&gt;Por isso, antes de aplicar em produção, sempre vale testar em um ambiente controlado.&lt;/p&gt;

&lt;p&gt;Conclusão 🚀&lt;br&gt;
NetworkPolicy é um recurso muito poderoso para aumentar a segurança dentro de um cluster Kubernetes.&lt;/p&gt;

&lt;p&gt;Com ela, conseguimos sair daquele modelo onde:&lt;/p&gt;

&lt;p&gt;“todo mundo fala com todo mundo”&lt;br&gt;
E passar para um modelo mais controlado, onde:&lt;/p&gt;

&lt;p&gt;“cada aplicação só se comunica com o que realmente precisa”&lt;br&gt;
Isso ajuda em vários cenários:&lt;/p&gt;

&lt;p&gt;✅ isolamento de banco de dados ✅ proteção de APIs internas ✅ controle de tráfego entre namespaces ✅ redução do impacto em caso de invasão ✅ aplicação do princípio do menor privilégio ✅ maior previsibilidade na comunicação entre serviços&lt;/p&gt;

&lt;p&gt;No fim, NetworkPolicy não é só sobre bloquear tráfego.&lt;/p&gt;

&lt;p&gt;É sobre desenhar melhor a comunicação entre as aplicações.&lt;/p&gt;

&lt;p&gt;E em Kubernetes, isso faz muita diferença. 🔐☸️&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>networking</category>
      <category>security</category>
    </item>
    <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>
  </channel>
</rss>
