🇧🇷 Kubernetes: Parte 1
🇬🇧 To read this article in English click here
Nesta série de artigos, vamos explorar o Kubernetes em 3 partes. O Kubernetes é uma ferramenta extremamente poderosa, mas que pode se tornar complexa se não for explicada de maneira clara. Para abordar o tema de forma completa e acessível, decidi criar esta série, sendo esta a primeira parte. Aqui, pretendo explicar o que é o Kubernetes, como realizar sua configuração inicial, seus fundamentos e conceitos principais, além de apresentar os componentes essenciais. Esse é apenas o começo da jornada. Vamos começar?
Kubernetes Parte 1
O que é o kubernetes?
Kubernetes é tipo o maestro de uma orquestra de servidores. Ele é responsável por gerenciar e coordenar aplicativos que estão rodando em contêineres, como o Docker. Imagine que você tem vários serviços e aplicativos espalhados por diferentes máquinas, e quer garantir que eles estejam sempre funcionando, que novos sejam adicionados quando necessário, e que os antigos sejam atualizados ou removidos sem bagunça. Kubernetes faz isso pra você.
Ele distribui automaticamente as tarefas entre os servidores, garante que tudo esteja rodando como deveria e até resolve problemas sozinho, como reiniciar um serviço que deu pau. Além disso, ele facilita coisas como escalar aplicações (colocar mais “força” onde precisa) e fazer deploys de novas versões sem derrubar tudo. É como ter um super assistente para lidar com toda a infraestrutura, deixando você mais focado no que realmente importa.
Conceito de imutabilidade kubernetes:
Imutabilidade no Kubernetes é simples: em vez de mexer em algo que já existe, ele cria uma nova versão. Por exemplo, se você quer atualizar um contêiner em um Deployment, o Kubernetes não altera o que está rodando. Ele cria novos Pods com a configuração atualizada e, quando esses novos estão prontos, substitui os antigos.
Isso garante que você sempre tem um “registro de versões”. Se algo der errado, dá para voltar atrás facilmente. É como se o Kubernetes fosse construindo versões novas das suas aplicações sem bagunçar o que já está rodando, mantendo tudo organizado e previsível.
Na prática, a imutabilidade no Kubernetes funciona assim:
Definição do estado desejado: Você cria ou altera um arquivo YAML(vamos falar dele na parte 2) com as configurações do recurso que quer rodar (tipo um Deployment). Esse arquivo descreve tudo: quantos réplicas você quer, qual imagem usar, etc.
Aplicação da configuração: Quando você manda esse arquivo para o cluster, o Kubernetes compara o que está no arquivo com o que já está rodando no cluster.
Atualização imutável: Se algo mudou no arquivo (tipo uma nova versão da imagem do contêiner), o Kubernetes começa a criar novos Pods com essa configuração atualizada. Os Pods antigos não são editados; eles continuam rodando até os novos ficarem prontos.
Substituição gradual: Depois que os novos Pods estão saudáveis e prontos, o Kubernetes vai desligando os Pods antigos. Isso é chamado de rolling update, e garante que não fique tudo fora do ar de uma vez.
Rollback fácil: Se a nova configuração der problema, você pode reverter rapidamente para a versão anterior. Como cada alteração cria algo novo, você sempre tem um “backup” do estado anterior.
A ideia é que tudo que roda no Kubernetes seja descartável e substituível. Nada é “ajustado” manualmente, tudo é recriado com base no que você descreveu nos arquivos. É isso que garante consistência e previsibilidade no ambiente.
Um pouco de fundamento:
No Kubernetes, você tem duas formas de fazer as coisas: comandos imperativos e configurações declarativas. A diferença é simples: uma é mais direta, tipo “faça isso agora”, e a outra é mais planejada, tipo “aqui está o que quero, dê seu jeito”.
Comandos Imperativos
Esses são os comandos que você roda direto no terminal para fazer algo na hora. É rápido, direto ao ponto, mas não deixa “rastro” do que foi feito.
Exemplo:
kubectl create deployment my-app –image=nginx
Aqui você está mandando o Kubernetes criar o Deployment do nginx. Fácil e rápido, mas se precisar repetir isso amanhã, vai ter que lembrar ou anotar o comando.
Vantagens:
- Ótimo para testes rápidos.
- Não precisa de arquivos YAML.
Desvantagens:
- Difícil de manter controle do que foi criado.
- Não é reutilizável.
Configurações Declarativas
Aqui você escreve um arquivo YAML que descreve o que quer no cluster. Em vez de mandar “faça isso agora”, você fala “esse é o estado que quero”, e o Kubernetes ajusta tudo pra chegar lá.
O código abaixo será explicado futuramente, não se prenda a ele
Exemplo de YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
Depois, aplica o arquivo com:
kubectl apply -f deployment.yaml
Vantagens:
- Fácil de versionar no Git.
- Reutilizável e mais organizado.
Desvantagens:
- Demanda mais tempo no começo.
- Pode parecer mais complicado para quem está começando.
Resumo
- Imperativo: “Faz agora!” (rápido, mas desorganizado).
- Declarativo: “Aqui está o plano, segue ele!” (organizado, ideal para produção).
No dia a dia, imperativo é bom pra coisas rápidas, mas declarativo é o caminho certo pra quem quer escalar e ter controle.
Kubectl:
O kubectl é sua ferramenta principal para tudo no Kubernetes. Desde criar recursos até resolver problemas, ele tem um comando pra tudo. É como um canivete suíço: com ele, você faz tudo que precisa no cluster.
Ele é a ferramenta de linha de comando que você usa para gerenciar praticamente tudo no cluster. Com o kubectl, você pode criar, listar, atualizar e deletar recursos do Kubernetes, além de monitorar o que está acontecendo.
Estrutura básica do comando kubectl
A sintaxe geral é:
kubectl [comando] [tipo-de-recurso] [nome-do-recurso] [flags]
Exemplos:
Criar um Deployment:
kubectl create deployment meu-app –image=nginx
- create → Diz que você quer criar algo.
- deployment → O tipo de recurso que você quer criar.
- meu-app → Nome que você está dando ao recurso.
- –image=nginx → Especifica a imagem do contêiner que será usada.
Listar recursos no cluster:
kubectl get pods
- get → Pede para listar recursos.
- pods → O tipo de recurso que você quer ver.
Detalhes sobre um recurso específico:
kubectl describe pod meu-pod
- describe → Mostra informações detalhadas sobre o recurso.
- meu-pod → Nome do Pod que você quer inspecionar.
Deletar um recurso:
kubectl delete pod meu-pod
- delete → Remove o recurso especificado.
- meu-pod → Nome do recurso a ser deletado.
Aplicar configurações de um arquivo YAML:
kubectl apply -f deployment.yaml
- apply → Aplica a configuração declarada no arquivo.
- -f → Indica o caminho do arquivo YAML.
Vamos ver os comandos na prática mais à frente, porém, caso queira se adiantar, o Kubernetes tem uma documentação completa sobre a command-line tool.
https://kubernetes.io/docs/reference/kubectl
Componentes do kubernetes:
Control Plane:
O control plane é o cérebro do Kubernetes. Ele é o cara que decide o que acontece no cluster e garante que tudo funcione como você pediu. Basicamente, ele gerencia o estado do cluster e os recursos que estão rodando.
Como ele trabalha:
Recebe ordens: Quando você aplica um YAML (vamos falar dele mais a frente mas o comando é esse: kubectl apply -f deploy.yaml), o control plane pega esse pedido e registra no sistema como o estado desejado.
Pensa no plano: Ele compara o que você pediu (estado desejado) com o que realmente está rodando (estado atual). Se estiver diferente, ele começa a corrigir.
Faz as coisas acontecerem: Ele manda ordens para os nós (máquinas onde os Pods rodam) para criar, deletar ou ajustar recursos até que tudo esteja do jeito que você quer.
Componentes importantes:
- API Server: É o cara que escuta seus comandos (kubectl) e conecta tudo.
- Scheduler: Decide em qual nó cada Pod vai rodar.
- Controller Manager: Cuida de processos automáticos, como criar novos Pods se algum der pau.
- etcd: É o banco de dados que guarda todas as informações do cluster (configurações, estado, etc.).
Em resumo:
O control plane fica cuidando do cluster 24/7. Ele ouve o que você quer, vê o que precisa ser ajustado e faz tudo funcionar. Se algo der errado, ele tenta arrumar sozinho. É o chefe que nunca dorme.
não se assuste com essa imagem, em breve você entenderá.
Conceito de recursos pods
O Pod é a menor unidade do Kubernetes. É tipo o “caixinha” onde seus aplicativos vivem dentro do cluster. Ele não é só um container, mas sim uma camada que envolve um ou mais containers e garante que eles funcionem juntos como uma unidade.
Como funciona na prática?
- 1 Pod = 1 ou mais containers.
Na maioria dos casos, você usa só um container por Pod. Mas, se os containers precisam trabalhar juntos, tipo um app que precisa de um sidecar (ex.: um log collector), você coloca mais de um container dentro do mesmo Pod. - Compartilham o mesmo IP e porta:
Todos os containers no Pod dividem a mesma rede, então eles se comunicam por localhost. Por exemplo, o container A pode falar com o container B sem precisar expor portas externamente. - Recursos compartilhados:
- Volumes: Se precisar guardar dados ou compartilhar arquivos entre containers no Pod, você usa volumes.
- Configs: Pode usar ConfigMaps ou Secrets para passar configurações sensíveis.
Recursos dos Pods:
O Kubernetes dá ferramentas para você controlar o uso de recursos (CPU, memória, etc.) dentro dos Pods.
Requests:
É o mínimo que o Pod precisa para rodar. Quando você define um request, o Kubernetes garante que o Node tenha esses recursos disponíveis antes de alocar o Pod.
Exemplo:
resources:
requests:
memory: “256Mi”
cpu: “500m”
Limits:
É o máximo que o Pod pode usar. Se o Pod tentar consumir mais do que isso, o Kubernetes pode limitar ou até matar ele (no caso de excesso de memória).
Exemplo:
resources:
limits:
memory: “512Mi”
cpu: “1”
Quando um Pod é criado?
Sempre que você manda rodar algo no Kubernetes, o que realmente é criado no cluster é um Pod. Por exemplo:
- Um Deployment? Cria Pods para os containers.
- Um Job? Cria Pods para rodar a tarefa.
O que acontece quando um Pod morre?
Pod morreu? Adeus! O Kubernetes não revive Pods diretamente. Ele cria novos se for configurado para isso. Por exemplo:
- Com um Deployment ou ReplicaSet, novos Pods são recriados automaticamente.
- Um Pod sozinho sem controlador? Morreu, acabou.
Resumo:
Os Pods são o alicerce do Kubernetes. Eles encapsulam containers e gerenciam como esses containers rodam, compartilham recursos e se comunicam. Se você entende Pods, entende o básico de como os aplicativos rodam no Kubernetes.
Kube-apiserver:
O kube-apiserver é como uma porta de entrada do Kubernetes. Ele é quem recebe todos os comandos e pedidos, seja do kubectl, de aplicações externas ou de outros componentes do próprio cluster.
O que ele faz?
Recebe comandos: Sempre que você faz algo no Kubernetes, como criar um Pod ou aplicar um Deployment, é o kube-apiserver que recebe essa requisição.
Checa e valida: Ele dá uma olhada no que você mandou e valida se está tudo certo. Por exemplo, se você tentou criar um Pod com configurações erradas, ele vai te avisar.
Grava no etcd: Depois de validar, ele salva os detalhes do recurso no etcd (o banco de dados do cluster). Esse é o lugar onde o Kubernetes guarda todas as informações.
Faz o meio de campo: Ele avisa os outros componentes do cluster (tipo o scheduler e os controllers) sobre as mudanças para que eles tomem as próximas ações.
Por que é importante?
Sem o kube-apiserver, o Kubernetes não funciona. Ele é como um intermediário que traduz o que você quer e garante que todo o cluster saiba disso. É como o balcão de informações de um shopping: todo mundo passa por ele para pedir alguma coisa.
Em resumo, o kube-apiserver é o cara que conecta você e o Kubernetes, organizando tudo para garantir que o cluster funcione direitinho.
cloud-controller-maneger:
O Cloud Controller Manager é um dos componentes do Control Plane do Kubernetes que conecta o cluster com serviços específicos de provedores de nuvem, como AWS, GCP ou Azure. Ele basicamente traduz as interações do Kubernetes com a infraestrutura da nuvem.
O que ele faz na prática?
Ele gerencia recursos que estão fora do cluster, mas que são necessários para o Kubernetes funcionar, como balanceadores de carga, volumes de armazenamento e endereços IP públicos. Em outras palavras, ele é o “cara da ponte” entre o Kubernetes e a nuvem.
Como funciona?
O Cloud Controller Manager tem vários controladores internos que tratam diferentes aspectos. Cada controlador é responsável por uma tarefa específica, como:
Node Controller
- Garante que os nós (VMs) registrados no cluster estão funcionando. Se uma VM for removida na nuvem, ele limpa a referência no Kubernetes.
Route Controller
- Configura rotas de rede entre os nós no ambiente da nuvem para que os Pods possam se comunicar.
Service Controller
- Gerencia balanceadores de carga da nuvem para serviços do tipo LoadBalancer. Por exemplo, se você expõe um serviço no Kubernetes, ele cria e configura o Load Balancer na nuvem automaticamente.
Volume Controller
- Cuida de provisionar e conectar volumes de armazenamento (tipo EBS na AWS, Persistent Disks no GCP, etc.) aos Pods.
Quando o Cloud Controller Manager entra em ação?
Sempre que você usa algo no Kubernetes que depende da infraestrutura da nuvem. Por exemplo:
- Cria um Service com type: LoadBalancer → ele configura o Load Balancer na sua nuvem.
- Adiciona um PVC (Persistent Volume Claim) → ele provisiona o disco automaticamente no backend da nuvem.
- Apaga um nó que não responde → ele checa se a VM foi removida na nuvem e limpa isso do cluster.
Ele é obrigatório?
Se você está rodando Kubernetes em bare-metal (ou seja, sem nuvem), o Cloud Controller Manager não faz nada, porque não tem integração com provedores de nuvem. Mas se o cluster estiver em AWS, Azure, GCP, etc., ele é essencial para automatizar as integrações.
Resumo:
O Cloud Controller Manager é tipo o “tradutor oficial” entre Kubernetes e nuvem. Ele cuida das coisas fora do cluster, como balanceadores e volumes, para que você não precise configurar tudo manualmente. É uma peça importante para clusters rodando em ambientes de nuvem.
controller-menager:
O Controller Manager é o “gerente multitarefa” do Kubernetes. Ele é o cara responsável por rodar os controladores que cuidam de várias funções dentro do cluster. Cada controlador resolve um problema específico, e o Controller Manager gerencia todos eles de forma centralizada. É um dos componentes do Control Plane e essencial para manter o cluster funcionando do jeito que você espera.
O que é um controlador?
Um controlador é basicamente um loop que fica monitorando o estado atual de algum recurso no cluster e tenta ajustá-lo para o estado desejado. No Kubernetes, tudo é baseado na ideia de estado desejado versus estado atual.
Exemplo:
Você quer 3 réplicas de um Pod rodando (estado desejado). Se um desses Pods falhar, o controlador vai perceber que só tem 2 Pods rodando (estado atual) e criar mais um para alinhar os dois estados.
O que o Controller Manager faz?
Ele é como o “organizador de loops”, rodando vários controladores ao mesmo tempo. Alguns dos principais controladores que ele gerencia são:
Replication Controller
- Garante que o número certo de réplicas de um Pod esteja rodando.
Node Controller
- Verifica se os nós (VMs) do cluster estão ativos. Se um nó ficar offline, ele marca como “NotReady”.
Endpoints Controller
- Atualiza os objetos de Endpoints para conectar serviços com os Pods certos.
Service Account & Token Controllers
- Gerencia contas de serviço e os tokens necessários para autenticação dentro do cluster.
Job Controller
- Garante que Jobs (tarefas únicas) rodem até completarem.
Persistent Volume Controller
- Gerencia o ciclo de vida de volumes persistentes, conectando PVCs (Persistent Volume Claims) aos PVs (Persistent Volumes).
Como ele funciona?
- Ele roda como um processo único no Control Plane.
- Todos os controladores estão embutidos nele.
- Fica constantemente olhando o estado atual do cluster (via etcd) e tentando alinhar com o que você declarou nos manifests YAML.
Quando o Controller Manager entra em ação?
Toda vez que algo muda no cluster. Exemplos:
- Você apaga um Pod manualmente → O Replication Controller recria.
- Um nó do cluster cai → O Node Controller marca ele como indisponível.
- Você cria um PVC → O Persistent Volume Controller provisiona um volume, se possível.
Resumo:
O Controller Manager é o “faz tudo” do Kubernetes. Ele não cria nada diretamente, mas comanda os controladores que fazem. Se um recurso precisa de ajuste, ele é quem garante que as mudanças sejam feitas. Sem ele, o cluster seria um caos, porque ninguém estaria cuidando do estado dos recursos.
etcd- cluster persistence storage:
O etcd é o coração do Kubernetes. Ele é um banco de dados chave-valor rápido e distribuído que guarda todo o estado do cluster. Sem ele, o Kubernetes não saberia o que está rodando, quais são os recursos ou como alinhar o que você quer com o que está acontecendo no cluster.
O que é o etcd na prática?
Pensa nele como uma agenda superorganizada: tudo que acontece ou precisa acontecer no Kubernetes está anotado lá. Desde quais Pods devem estar rodando, até detalhes como ConfigMaps, Secrets e o status dos Nodes.
Por que armazenamento persistente é importante?
O etcd precisa de persistência porque:
Ele mantém o estado atual do cluster. Se o etcd apagar, o Kubernetes esquece de tudo.
É um componente crítico para a recuperação de desastres. Se o cluster quebrar, o backup do etcd é o que traz tudo de volta.
Onde e como armazenar o etcd?
- Local: Um disco rápido no servidor onde o etcd está rodando.
- Nuvem: Storage persistente da nuvem, como EBS na AWS ou Persistent Disks no GCP.
- Clusters de etcd: Para alta disponibilidade, você roda um cluster etcd com 3 ou 5 instâncias. Isso distribui os dados, evita perda total em caso de falha de um nó e mantém o etcd funcionando.
Como o etcd trabalha no Kubernetes?
- O kube-apiserver é o único que fala com o etcd diretamente.
- Ele lê e escreve no etcd para guardar e buscar o estado do cluster.
- Exemplos de dados guardados:
- Especificações de Deployments, Pods, Services.
- Segredos e configurações.
- Status de cada recurso.
Dica de ouro: Backups!
Como o etcd é a “memória” do Kubernetes, fazer backup dele é obrigatório. Sem backup, você perde tudo. Para clusters grandes ou em produção, use ferramentas que automatizam isso, como o etcdctl snapshot.
Resumo:
O etcd é essencial. É onde o Kubernetes guarda tudo que importa. Sem um armazenamento persistente confiável, você está arriscando perder o estado do cluster inteiro. Portanto, capriche na configuração e tenha backups sempre atualizados!
kube-proxy
O kube-proxy é como o “roteador” do Kubernetes. Ele gerencia as regras de rede no cluster, garantindo que os Serviços (Services) consigam distribuir tráfego para os Pods certos. Basicamente, ele é quem faz a mágica de conexão interna no cluster, garantindo que os pedidos cheguem onde precisam.
O que o kube-proxy faz?
Distribui o tráfego:
Quando você cria um Service, ele garante que o tráfego seja encaminhado para os Pods associados a esse Service.
Gerencia regras de iptables/ipvs:
Ele cria e mantém as regras de roteamento na máquina do nó (Node). Isso faz com que qualquer requisição enviada para o IP do Service seja redirecionada para um Pod ativo.
Lida com Load Balancing:
O kube-proxy balanceia o tráfego entre todos os Pods associados a um Service. Se um Pod morrer, ele ajusta as regras para ignorá-lo.
Como ele funciona?
O kube-proxy roda em cada nó do cluster e monitora o etcd para saber quais são os Services e os Pods relacionados. A partir disso, ele:
Configura regras no iptables ou usa o IPVS (mais eficiente para grandes clusters).
Encaminha o tráfego externo e interno para os Pods corretos.
Exemplo prático:
- Você tem um Service com dois Pods rodando (Pod-A e Pod-B).
- Quando um cliente faz uma requisição para o ClusterIP do Service (tipo 10.96.0.1), o kube-proxy redireciona o tráfego para um dos dois Pods.
- Se o Pod-A falhar, ele para de redirecionar para ele e só manda para o Pod-B.
Tipos de Services que o kube-proxy gerencia:
ClusterIP:
- Faz o serviço ficar acessível apenas dentro do cluster.
NodePort:
- Expõe o serviço externamente via uma porta fixa no Node.
LoadBalancer:
- Cria um Load Balancer externo (em nuvem) e distribui tráfego para os Nodes.
ExternalName:
- Resolve um DNS externo para o serviço.
Limitações:
- O kube-proxy só trabalha no nível de IP/porta. Ele não sabe nada sobre o conteúdo das requisições (tipo HTTP headers).
- Em clusters muito grandes, usar iptables pode ser menos eficiente. Nesse caso, o IPVS é uma opção melhor.
Resumo:
O kube-proxy é a cola que mantém a comunicação no cluster fluindo. Ele cuida das rotas e garante que os Services sempre conectem os usuários aos Pods certos, mesmo que haja mudanças ou falhas. Sem ele, os Pods seriam como ilhas isoladas sem comunicação entre si.
kube-scheduler:
O kube-scheduler é o “fazedor de escolhas” do Kubernetes. Ele é o cara que decide em qual Node do cluster cada Pod vai rodar. Quando você manda criar um Pod, o scheduler entra em ação para encontrar o lugar certo pra ele, levando em conta as condições do cluster e as configurações que você definiu.
Como o kube-scheduler funciona?
Escuta o API Server:
O kube-scheduler fica monitorando o etcd (via API Server) para encontrar Pods que ainda não têm um Node definido.
Analisa os Nodes disponíveis:
Ele avalia todos os Nodes no cluster pra ver quem está apto a receber o Pod. Isso inclui verificar:
- Recursos disponíveis: CPU, memória.
- Tolerâncias e afinidades: Se o Pod foi configurado para rodar em um Node específico ou evitar outro.
- Restrições: Labels, selectors, etc.
- Health do Node: O Node está funcionando? Ele pode aceitar novos Pods?
Decide onde colocar o Pod:
Depois de avaliar todas as opções, ele escolhe o Node mais apropriado e atualiza a configuração do Pod para apontar pra esse Node.
O que ele considera pra decidir?
- Requests e Limits:
Ele verifica os recursos mínimos (requests) que o Pod precisa e se encaixa no Node.
Node Affinity:
Você pode dizer que um Pod deve rodar em Nodes com uma label específica. Exemplo:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: disktype
operator: In
values:
– ssd
- Taints e Tolerations:
Nodes podem ser “marcados” pra rejeitar Pods, e só os Pods com tolerations vão ser aceitos. - Topology Spread Constraints:
Ele também tenta distribuir os Pods de forma equilibrada entre Nodes, zonas de disponibilidade, etc., dependendo da configuração.
Quando ele entra em ação?
Sempre que um Pod novo é criado ou um Node fica indisponível e o Pod precisa ser reposicionado. O kube-scheduler toma a decisão e o kubelet (no Node escolhido) assume a responsabilidade de rodar o Pod.
E se o kube-scheduler falhar?
Se o kube-scheduler estiver fora do ar, os Pods não vão ser agendados. Ou seja, eles ficam “presos” no estado Pending até que o scheduler volte e consiga designar um Node pra eles.
Resumo direto:
O kube-scheduler é o cérebro que faz os Pods encontrarem seu lugar no cluster. Ele analisa os Nodes, as regras que você configurou, e decide onde o Pod deve rodar, garantindo que os recursos sejam usados da melhor forma possível.
Kubelet:
O kubelet é o “executor de ordens” no Kubernetes. Ele roda em cada Node do cluster e é responsável por garantir que os containers do Pod realmente sejam executados. Em outras palavras, o kubelet é o cara que pega as instruções do Control Plane e as transforma em algo que roda de verdade no Node.
O que o kubelet faz?
Monitora o API Server:
Ele fica de olho no API Server pra saber quais Pods foram agendados pro Node onde ele está rodando.
Gerencia containers:
Quando o kube-scheduler escolhe um Node pra rodar um Pod, o kubelet pega as informações do Pod e pede pro container runtime (Docker, containerd, etc.) criar e executar os containers.
Mantém os Pods vivos:
O kubelet faz verificações constantes pra garantir que os Pods estão rodando como deveriam. Se algum container parar de funcionar, ele tenta recriar.
Relata o estado do Node:
Ele manda relatórios pro API Server sobre o status do Node: se está saudável, quais recursos estão disponíveis (CPU, memória, etc.), e se os Pods estão rodando sem problemas.
Gerencia volumes e configurações:
Ele também cuida de montar volumes (ex.: discos persistentes) e aplicar ConfigMaps ou Secrets nos Pods.
Como ele faz isso?
- O kubelet conversa com o container runtime instalado no Node (Docker, containerd, etc.) usando a CRI (Container Runtime Interface).
- Ele usa as definições de Pod (especificadas em YAML) pra saber:
- Qual imagem de container baixar.
- Quais volumes montar.
- Quais limites de recursos aplicar.
Exemplo prático:
O kube-scheduler manda um Pod pro Node.
O kubelet vê a configuração do Pod (via API Server).
Ele baixa a imagem do container (se não estiver localmente).
Pede pro container runtime iniciar o container.
Começa a monitorar o container:
- Se travar, ele reinicia.
- Se o Pod tiver uma liveness probe, ele usa pra verificar a saúde.
O que acontece se o kubelet falhar?
Se o kubelet parar, o Node “fica mudo”. Ele não consegue reportar seu status pro cluster, e o Kubernetes pode acabar tratando o Node como inativo. Consequência:
- Os Pods nesse Node podem ser realocados pra outros Nodes (dependendo da configuração).
Resumo direto:
O kubelet é o trabalhador no Node que faz o Kubernetes funcionar. Ele recebe ordens do Control Plane, gerencia os Pods e containers localmente, e garante que tudo esteja rodando do jeito que deveria. Sem ele, seu cluster não roda nada!
Container Runtime Interface (CRI):
A Container Runtime Interface (CRI) é tipo a ponte que conecta o Kubernetes ao software que realmente roda os containers, como o containerd ou o CRI-O. É o padrão que o kubelet usa pra se comunicar com qualquer “motor de containers”.
Antes do CRI, o Kubernetes era dependente do Docker, mas o CRI abriu o jogo: agora qualquer runtime que siga essa interface pode funcionar no Kubernetes.
Como o CRI funciona na prática?
O kubelet decide que precisa rodar um container em um Pod.
Ele usa o CRI pra mandar comandos pro runtime configurado no Node (tipo “inicia esse container”, “para esse outro”, etc.).
O runtime, seguindo as regras do CRI, executa o container e manda de volta informações como:
- ID do container.
- Logs.
- Status de execução (rodando, parado, crashou, etc.).
Principais componentes do CRI
Container Runtime:
O software que executa os containers no Node (ex.: containerd, CRI-O, ou outro que siga o CRI).
gRPC API:
O kubelet e o runtime conversam via uma API baseada em gRPC. Essa API define:
- Como criar e rodar containers.
- Como gerenciar imagens.
- Como lidar com logs e status.
Protocolos definidos:
O CRI padroniza funções essenciais, como:
- Gerenciar imagens (PullImage, RemoveImage).
- Criar, iniciar, ou deletar containers (RunPodSandbox, CreateContainer, etc.).
- Consultar status (ContainerStatus, ListContainers).
Por que isso é importante?
Com o CRI, o Kubernetes virou agnóstico de runtime, ou seja, não tá amarrado a nenhuma ferramenta específica. Isso trouxe várias vantagens:
- Mais flexibilidade: Pode usar o runtime que faz mais sentido pra sua infra (ex.: CRI-O pra clusters otimizados pro OpenShift ou containerd pra clusters vanilla).
- Independência do Docker: O Kubernetes não depende mais de um único runtime, como era antes.
Na prática: como escolher o runtime?
- containerd: É o runtime padrão e mais usado no Kubernetes. É leve, direto ao ponto, e mantido pela CNCF (mesma galera por trás do Kubernetes).
- CRI-O: É otimizado pro OpenShift e bem integrado ao ecossistema Red Hat.
- Docker + dockershim: Era o padrão antigamente, mas o suporte ao Docker foi descontinuado desde o Kubernetes 1.20.
Resumindo:
A CRI é o “tradutor universal” entre o Kubernetes e os runtimes de containers. Graças a ela, o kubelet pode usar qualquer runtime que siga o padrão, tornando o Kubernetes mais flexível e modular.
Bom, essa foi a parte 1 da série sobre Kubernetes. O Kubernetes pode parecer um pouco complexo à primeira vista, e é normal não entender tudo de imediato. Nesta parte, exploramos os componentes que formam o Kubernetes. Em breve, vamos colocar esse conhecimento em prática, manipulando e criando Pods.
Fique de olho para não perder a parte 2!