Criar um Deployment

KubernetesBeginner
Pratique Agora

Introdução

Um Pod executa containers, mas um Pod por si só não é a forma usual de executar uma aplicação no Kubernetes. Um Deployment descreve o estado desejado para uma aplicação e cria um ReplicaSet, que por sua vez cria e mantém os Pods.

Neste laboratório, você criará seu primeiro Deployment, aguardará até que ele esteja disponível, inspecionará o Deployment, o ReplicaSet e os Pods criados, e observará como o Deployment restaura os Pods após a exclusão. Esta é a base para tópicos futuros do CKAD, como escalonamento, atualizações graduais (rolling updates), reversões (rollback) e exposição de aplicações.

Preparar um Namespace para o Deployment

Nesta etapa, você preparará um namespace limpo para praticar com Deployments e defini-lo como o namespace padrão para seus comandos.

Comece em /home/labex/project. Você não precisará escrever um manifesto neste laboratório, mas usar o mesmo espaço de trabalho mantém o curso consistente.

mkdir -p /home/labex/project
cd /home/labex/project

Verifique se o servidor da API do Kubernetes está acessível. Se a VM acabou de iniciar e este comando falhar, aguarde alguns segundos e execute-o novamente até que o nó esteja Ready.

kubectl get nodes --request-timeout=5s

A saída esperada inclui:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Os Pods precisam do plugin de rede do cluster antes de ficarem prontos. Aguarde pelo Pod do Calico antes de criar cargas de trabalho de aplicação.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Saída esperada:

pod/calico-node-... condition met

Crie um namespace chamado ckad-prep-deployments:

kubectl create namespace ckad-prep-deployments

O comando deve confirmar a criação:

namespace/ckad-prep-deployments created

Defina este namespace como o namespace do contexto atual:

kubectl config set-context --current --namespace=ckad-prep-deployments

Confirme o namespace atual:

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

Saída esperada:

ckad-prep-deployments

Criar o Deployment

Nesta etapa, você criará um Deployment chamado web-demo com duas réplicas.

O comando kubectl create deployment solicita ao Kubernetes a criação de um objeto Deployment. A opção --image define a imagem do container no template do Pod, e --replicas=2 solicita que o Deployment mantenha dois Pods correspondentes em execução.

kubectl create deployment web-demo --image=registry.k8s.io/pause:3.10.1 --replicas=2

Saída esperada:

deployment.apps/web-demo created

Aguarde a conclusão do rollout do Deployment. Para um novo Deployment, o status de rollout significa que o Kubernetes criou o ReplicaSet e os Pods solicitados tornaram-se disponíveis.

kubectl rollout status deployment/web-demo --timeout=90s

A saída pode incluir mensagens curtas de espera enquanto os Pods se tornam disponíveis. Ela deve terminar com:

deployment "web-demo" successfully rolled out

Agora, inspecione o resumo do Deployment:

kubectl get deployment web-demo

A saída esperada inclui:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

Inspecionar o ReplicaSet e os Pods

Nesta etapa, você inspecionará os objetos criados abaixo do Deployment.

Um Deployment não executa containers diretamente. Ele cria um ReplicaSet, e o ReplicaSet cria os Pods. O seletor do Deployment e os labels do template do Pod conectam esses objetos.

Primeiro, inspecione o label do seletor e o label do template no Deployment. O JSONPath imprime apenas os campos selecionados, o que mantém a saída focada.

kubectl get deployment web-demo -o 'jsonpath={.spec.selector.matchLabels.app}{" "}{.spec.template.metadata.labels.app}{"\n"}'

Saída esperada:

web-demo web-demo

O primeiro valor é o label do seletor do Deployment. O segundo valor é o label colocado nos Pods a partir do template. Eles coincidem, portanto, o Deployment pode gerenciar esses Pods.

Liste o ReplicaSet criado pelo Deployment:

kubectl get replicasets -l app=web-demo

A saída esperada inclui:

NAME                  DESIRED   CURRENT   READY   AGE
web-demo-...          2         2         2       ...

Agora, liste os Pods selecionados pelo mesmo label:

kubectl get pods -l app=web-demo --show-labels

A saída esperada inclui dois Pods em execução:

NAME                        READY   STATUS    RESTARTS   AGE   LABELS
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...

Finalmente, mostre o tipo de proprietário (owner kind) de cada Pod. Cada Pod é de propriedade de um ReplicaSet, não diretamente do Deployment.

kubectl get pods -l app=web-demo -o 'custom-columns=NAME:.metadata.name,OWNER:.metadata.ownerReferences[0].kind,PHASE:.status.phase'

Saída esperada:

NAME                        OWNER        PHASE
web-demo-...                ReplicaSet   Running
web-demo-...                ReplicaSet   Running

Observar a Recuperação do Estado Desejado

Nesta etapa, você excluirá os Pods atuais e observará o Deployment restaurar o estado desejado.

Esta é a principal diferença entre um Pod individual e um Deployment. Se você excluir Pods isolados, eles desaparecem. Se você excluir Pods gerenciados por um Deployment, o Deployment percebe que o estado atual não corresponde mais ao estado desejado e cria substitutos.

Exclua os Pods selecionados por app=web-demo. A opção --wait=false retorna imediatamente após o envio da solicitação de exclusão, para que você possa observar a recuperação sem esperar que cada Pod antigo desapareça primeiro.

kubectl delete pods -l app=web-demo --wait=false

A saída esperada inclui:

pod "web-demo-..." deleted from ckad-prep-deployments namespace
pod "web-demo-..." deleted from ckad-prep-deployments namespace

Aguarde até que o Deployment fique disponível novamente:

kubectl wait --for=condition=Available deployment/web-demo --timeout=90s

Saída esperada:

deployment.apps/web-demo condition met

Liste os Pods novamente:

kubectl get pods -l app=web-demo

A saída esperada inclui dois Pods em execução. Os nomes podem ser diferentes porque o ReplicaSet criou substitutos.

NAME                        READY   STATUS    RESTARTS   AGE
web-demo-...                1/1     Running   0          ...
web-demo-...                1/1     Running   0          ...

Verifique o resumo do Deployment mais uma vez:

kubectl get deployment web-demo

A saída esperada inclui:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

Resumo

Você criou um Deployment, aguardou seu rollout, inspecionou seu seletor e os labels do template de Pod, encontrou o ReplicaSet e os Pods criados e observou a recuperação do estado desejado após a exclusão dos Pods. Esses conceitos preparam você para os próximos laboratórios de Deployment, onde você alterará contagens de réplicas, atualizará aplicações e gerenciará o comportamento de rollout.