cd ..
KUBERNETES

Entendendo Deployments no Kubernetes - o recurso que mantém sua aplicação sempre disponível

Entendendo Deployments no Kubernetes: o recurso que mantém sua aplicação sempre disponível

Muita gente responde que um Deployment é apenas um recurso para criar Pods. Mas essa resposta está incompleta.

Quando começamos a estudar Kubernetes, normalmente criamos Pods diretamente para entender como tudo funciona.

Isso é ótimo para aprender.

Mas não é assim que aplicações normalmente são executadas em ambientes reais.

Na prática, quase sempre utilizamos Deployments.

Neste artigo vamos entender:

O que é um Deployment?

Um Deployment é um recurso do Kubernetes responsável por criar, atualizar e administrar Pods automaticamente.

Em vez de você criar Pods manualmente, você informa ao Kubernetes qual é o estado desejado da aplicação.

Depois disso, o Deployment trabalha para manter esse estado.

Por exemplo.

Imagine que sua aplicação deve possuir 3 Pods executando a imagem do NGINX.

Você não precisa criar os três Pods manualmente.

Basta criar um Deployment dizendo que deseja três réplicas.

O Kubernetes fará todo o restante.

O problema de criar Pods diretamente

Um Pod pode morrer.

Pode ser removido.

Pode falhar durante uma atualização.

Quando criamos um Pod diretamente, somos nós os responsáveis por recriá-lo.

Ou seja, não existe gerenciamento automático.

Já o Deployment observa constantemente o estado da aplicação.

Se algum Pod desaparecer, ele será recriado automaticamente.

Como o Deployment funciona internamente?

Apesar de parecer que o Deployment controla diretamente os Pods, isso não acontece.

Na verdade existe outro recurso entre eles.

Deployment


 ReplicaSet


    Pods

O fluxo funciona da seguinte maneira.

Essa separação permite que o Kubernetes realize atualizações, rollback e escalabilidade sem interromper o gerenciamento da aplicação.

Um exemplo simples

Imagine que desejamos executar três Pods do NGINX.

Objetivo desejado

3 Pods executando nginx

Criamos um Deployment informando isso.

Se um dos Pods morrer, o ReplicaSet perceberá imediatamente.

Antes

Pod 1 ✅
Pod 2 ✅
Pod 3 ❌

O ReplicaSet cria outro automaticamente.

Depois

Pod 1 ✅
Pod 2 ✅
Pod 3 ✅

Perceba que o Deployment continua mantendo exatamente o estado que definimos.

Criando um Deployment

Um Deployment é definido através de um manifesto YAML.

Um exemplo simples seria:

apiVersion: apps/v1
kind: Deployment

metadata:
  name: nginx-deployment

spec:
  replicas: 3

  selector:
    matchLabels:
      app: nginx

  template:
    metadata:
      labels:
        app: nginx

    spec:
      containers:
        - name: nginx
          image: nginx:latest

Mesmo sendo pequeno, esse manifesto já é suficiente para criar uma aplicação gerenciada pelo Kubernetes.

Nos próximos artigos da série iremos detalhar cada uma dessas seções.

Aplicando o manifesto

Depois de salvar o arquivo como deployment.yaml, basta executar:

kubectl apply -f deployment.yaml

Explicando o comando:

Resultado esperado:

deployment.apps/nginx-deployment created

Verificando os recursos criados

Primeiro podemos listar os Deployments.

kubectl get deployments

Resultado esperado:

NAME               READY   UP-TO-DATE   AVAILABLE
nginx-deployment   3/3     3            3

Depois podemos verificar o ReplicaSet.

kubectl get replicasets

Resultado esperado:

NAME                          DESIRED   CURRENT   READY
nginx-deployment-xxxxxxxxxx   3         3         3

Por fim, verificamos os Pods.

kubectl get pods

Resultado esperado:

NAME                                READY
nginx-deployment-xxxxxxxxxx-abc12   1/1
nginx-deployment-xxxxxxxxxx-def34   1/1
nginx-deployment-xxxxxxxxxx-ghi56   1/1

Observe que o Deployment criou automaticamente um ReplicaSet, que por sua vez criou os Pods.

Entendendo a saída do Deployment

Ao executar:

kubectl get deployments

Algumas colunas são exibidas.

ColunaSignificado
READYQuantos Pods estão prontos
UP-TO-DATEQuantos Pods utilizam a versão atual
AVAILABLEQuantos Pods estão disponíveis para receber tráfego
AGETempo desde a criação do Deployment

Essas informações ajudam a acompanhar rapidamente a saúde da aplicação.

Deployment x Pod

Essa é uma dúvida bastante comum.

PodDeployment
Executa um ou mais containersGerencia vários Pods
Não realiza rollbackPermite rollback
Não faz atualização gradualFaz Rolling Update
Não recria Pods automaticamenteMantém a aplicação no estado desejado
Indicado para testesIndicado para aplicações

Uma analogia simples.

Pod


Funcionário
Deployment


Gerente

O funcionário executa o trabalho.

O gerente garante que sempre exista alguém executando o trabalho.

Se um funcionário faltar, outro assume seu lugar.

É exatamente essa ideia que o Deployment aplica aos Pods.

Conclusão

O Deployment é um dos recursos mais importantes do Kubernetes.

Ele simplifica o gerenciamento da aplicação e permite que o cluster mantenha automaticamente o estado desejado.

Além de criar Pods, ele também é responsável por permitir atualizações, escalabilidade, rollback e alta disponibilidade.

Entender bem esse recurso facilita bastante o aprendizado dos próximos conceitos do Kubernetes.

No próximo artigo da série vamos aprofundar a estrutura de um Deployment e entender o papel do ReplicaSet, do selector e do template, além de explicar por que esses campos precisam estar corretamente configurados.

Referências

O que achou?