Deployments para escalabilidade

KubernetesBeginner
Pratique Agora

Introdução

Nos laboratórios anteriores, você criou um único Pod. Embora os Pods sejam os componentes básicos, gerenciá-los manualmente é trabalhoso. Se um Pod parar, você precisa reiniciá-lo manualmente. Se quiser mais cópias, também precisará criar mais Pods manualmente.

É aí que entra o Deployment.

Um Deployment é um controlador de nível mais alto que gerencia ReplicaSets e Pods para você. Você declara quantas réplicas devem existir e qual modelo de Pod elas devem usar; então, o Kubernetes trabalha para manter o estado real alinhado a essa declaração.

A principal mudança aqui é deixar de gerenciar um Pod individual e passar a gerenciar uma carga de trabalho reproduzível. Um único Pod é frágil porque representa apenas uma instância. Um Deployment descreve um padrão para criar Pods e define quantos deles devem existir. É esse padrão que torna possível escalar e usar a autorrecuperação.

Neste laboratório, você aprenderá a:

  • Criar um Manager rigoroso (Deployment) com um objetivo específico (3 réplicas).
  • Observar o Manager contratar trabalhadores (Pods).
  • “Demitir” um trabalhador para testar a reação do Manager (autorrecuperação).
  • Pedir ao Manager que contrate mais trabalhadores (escalabilidade).

Criar o YAML do Deployment

Nesta etapa, você escreverá a descrição do trabalho para o seu Manager. Esse arquivo YAML define qual imagem deve ser executada e quantas cópias (réplicas) você deseja.

Observe a estrutura adicional em comparação com um manifesto simples de Pod. Um Deployment contém um selector e um template. O selector informa ao Kubernetes quais Pods pertencem a esse Deployment, enquanto o template descreve como os novos Pods devem ser criados. Essas duas partes precisam permanecer alinhadas; caso contrário, o Deployment não gerenciará corretamente os Pods pretendidos.

Primeiro, confirme que você está no diretório do projeto:

cd ~/project

Crie um novo arquivo chamado deployment.yaml usando o nano:

nano deployment.yaml

Cole a configuração a seguir no arquivo. Preste atenção à linha replicas: 3: é nela que você define o tamanho da sua equipe.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

Para salvar, pressione Ctrl+X, depois Y e, em seguida, Enter.

Este arquivo informa ao Kubernetes: “Crie um Deployment chamado nginx-deployment. Garanta que sempre existam 3 Pods executando a imagem nginx:1.14.2. Quando precisar localizar esses Pods, procure aqueles rotulados com app: nginx.”

Aplicar e observar

Agora que você tem a descrição do trabalho, vamos contratar o manager. Aplique a configuração ao cluster:

Quando você cria um Deployment, o Kubernetes normalmente cria outro objeto chamado ReplicaSet nos bastidores. O ReplicaSet é o componente diretamente responsável por manter ativo o número solicitado de Pods. Neste momento, iniciantes não precisam gerenciar ReplicaSets diretamente, mas é útil saber que eles existem, pois você verá esses objetos com frequência na saída dos comandos.

kubectl apply -f deployment.yaml

O Kubernetes confirmará: deployment.apps/nginx-deployment created.

O Deployment (Manager) começará imediatamente a criar 3 Pods. Para visualizá-los rapidamente, execute:

kubectl get pods

Você deverá ver 3 Pods diferentes, todos com nomes que começam com nginx-deployment-:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-8j64w   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-d95l2   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-lzr5w   1/1     Running   0          5s

Você também pode verificar o status do próprio Deployment:

kubectl get deployments

A saída deverá mostrar READY 3/3, confirmando que todas as 3 réplicas solicitadas estão ativas e em execução.

Testar a autorrecuperação

Um dos recursos mais poderosos do Kubernetes é a autorrecuperação. O Deployment garante que o número real de Pods seja sempre igual ao número desejado (3). Se um Pod desaparecer, ele será substituído imediatamente.

Isso funciona porque o Kubernetes compara continuamente o estado real com o estado desejado. Excluir um Pod não altera a quantidade desejada de réplicas armazenada no Deployment; por isso, o sistema interpreta a exclusão como uma divergência e cria um substituto.

Vamos testar isso excluindo manualmente um dos Pods.

Primeiro, liste os Pods novamente:

kubectl get pods

Copie o nome completo de um dos Pods, por exemplo, nginx-deployment-66b6c48dd5-8j64w.

Agora, exclua esse Pod específico:

kubectl delete pod <paste-pod-name-here>

O Kubernetes informará que o Pod foi excluído. Execute imediatamente kubectl get pods novamente:

kubectl get pods

Você verá algo impressionante:

  1. O Pod antigo está sendo encerrado ou já desapareceu.
  2. Um novo Pod, com um nome diferente e uma idade muito baixa, por exemplo, 2 segundos, já apareceu.

O Deployment percebeu que faltava um trabalhador e contratou imediatamente um novo para manter o tamanho da equipe em 3. Isso garante que sua aplicação continue disponível mesmo quando servidores ou contêineres individuais apresentarem falhas.

Aumentar a escala

Imagine que seu site está ficando popular. Três servidores web já não são suficientes; você precisa de cinco. Você precisa criar novos arquivos manualmente ou correr para criar Pods?

Escalar um Deployment altera a quantidade desejada declarada, e não apenas o conjunto atual de processos em execução. Por isso, o novo tamanho permanece válido além de uma única ação manual. Os controladores continuam tratando o número atualizado de réplicas como a referência até que você o altere novamente.

Não. Basta informar ao Manager que você quer aumentar a quantidade.

Podemos atualizar o número de réplicas em tempo real usando o comando kubectl scale.

Altere a quantidade de réplicas de 3 para 5:

kubectl scale deployment/nginx-deployment --replicas=5

Agora, observe a mudança:

kubectl get pods

Você verá 5 Pods em execução. Dois novos Pods foram iniciados para atender ao novo requisito.

Também é possível reduzir a escala. Se o tráfego diminuir, você poderá economizar recursos reduzindo a quantidade:

kubectl scale deployment/nginx-deployment --replicas=2

Execute kubectl get pods novamente. Você verá o Kubernetes encerrando os Pods extras até restarem apenas 2.

Essa escalabilidade dinâmica é uma das razões pelas quais as empresas gostam do Kubernetes.

Resumo

Neste laboratório, você aprendeu sobre o Deployment, o manager inteligente que mantém suas aplicações em execução.

Você conseguiu:

  1. Criar um Deployment com 3 Pods trabalhadores.
  2. Verificar que o Deployment substitui automaticamente os Pods que falham (autorrecuperação).
  3. Aumentar e reduzir o número de réplicas com um único comando (escalabilidade).

Agora você entende por que raramente criamos Pods independentes. Os Deployments oferecem confiabilidade e flexibilidade, gerenciando o trabalho complexo de agendamento e reinicialização para que você não precise fazer isso manualmente.