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.


