Enunciado — Projeto: Primeiros passos com Kubernetes (Pods, Deployments, Services)

4 min

Prática · Módulo 07 — Kubernetes: conceitos de base · Nível principiante → intermédio

Tenta primeiro sozinho! Realiza o projeto só com este enunciado. O corrigé (manifestos YAML comentados + comandos kubectl) está no README.md, recolhido. Só o abras depois de teres tentado.


Não precisas de minikube!

Não tens de instalar mais nada: o Docker Desktop contém um cluster Kubernetes integrado.

  1. Abre Docker Desktop → Settings (⚙️) → Kubernetes.
  2. Marca « Enable Kubernetes », clica Apply & Restart e espera que o indicador fique verde.
  3. Verifica num terminal:
    powershell
    kubectl get nodes
    Deves ver um nó docker-desktop no estado Ready.

(Alternativas possíveis: minikube start ou kind create cluster. O projeto também funciona, com o carregamento da imagem — ver 02-COMMANDES.md.)


Objetivo

Implantar uma pequena aplicação web no Kubernetes em várias réplicas (Pods), expô-la via um Service e depois praticar os gestos do dia a dia: scaling, rolling update, rollback e auto-reparação.


O resultado esperado

Quando se recarrega a página, o nome do Pod que responde muda: prova de que o Service reparte a carga entre os Pods.


Trabalho a realizar

Parte 1 — Construir a imagem

  1. Retoma a app web do módulo 06 (ou escreve uma app que, em /, mostre o seu hostname = o nome do Pod).
  2. Constrói a imagem em local e nomeia-a demo-k8s:1.0.

Parte 2 — O Deployment (os Pods)

  1. Escreve um manifesto Deployment com 3 réplicas, labels coerentes (app: demo-web) e uma sonda (readinessProbe / livenessProbe) em /health.
  2. Aplica-o e depois lista e inspeciona os teus Pods (kubectl get pods, kubectl describe pod ..., kubectl logs ...).

Parte 3 — O Service (expor + repartir)

  1. Escreve um Service do tipo NodePort (porto 30080) que aponte para os Pods via o seletor de labels.
  2. Abre http://localhost:30080 e recarrega: verifica que o nome do Pod muda.

Parte 4 — A configuração (ConfigMap + variáveis de env)

  1. Cria um ConfigMap com APP_TITLE, APP_VERSION e BG_COLOR, e injeta-o nos Pods (envFrom).
  2. Altera BG_COLOR, reaplica o ConfigMap, relança os Pods (kubectl rollout restart) e observa a nova cor.

Parte 5 — Os gestos do dia a dia

  1. Scaling: passa a 5 réplicas (kubectl scale) e depois volta a 3.
  2. Rolling update: altera APP_VERSION, aplica e acompanha a implantação progressiva (kubectl rollout status).
  3. Rollback: regressa à versão anterior (kubectl rollout undo).
  4. Auto-reparação: apaga um Pod à mão (kubectl delete pod ...) e constata que o Kubernetes recria outro sozinho.

Perguntas de reflexão

  • Qual é a diferença entre um Pod, um ReplicaSet e um Deployment?
  • Porque se passa por um Service em vez de contactar um Pod diretamente pelo IP?
  • Para que serve o seletor de labels entre o Service e os Pods?
  • Porque separar a configuração (ConfigMap) do código (imagem Docker)?
  • O que faz o Kubernetes quando um Pod falha? E durante um rolling update?

Entregáveis

  • A pasta app/ (código + Dockerfile) e a pasta k8s/ (configmap.yaml, deployment.yaml, service.yaml).
  • Uma captura a mostrar pelo menos 2 nomes de Pods diferentes no navegador (ou via curl).
  • A saída de kubectl get pods a mostrar 3/3 Pods Running.
  • Uma captura de um kubectl rollout status durante um rolling update.

Critérios de sucesso

CritérioEsperado
Imagem construídademo-k8s:1.0 disponível para o cluster
Deployment3 Pods Running, sondas OK
ServicePágina acessível em localhost:30080, o nome do Pod muda
ConfigMapAlteração de BG_COLOR visível após reaplicação
Ciclo de vidaScaling, rolling update, rollback e auto-reparação demonstrados

Bloqueado? O README.md contém o corrigé completo (manifestos comentados + comandos), e o guia de comandos lista todo o kubectl útil — a consultar depois de teres tentado.