- Objetivo da atividade
Nesta prática você irá:
Subir um cluster Kubernetes local com Minikube.
Empacotar uma API simples em Docker.
Publicar essa API no Minikube usando Deployment, Service e Ingress.
Realizar operações básicas de troubleshooting, escala e rollout.
- Cenário: API de Frases “quotes-api”
Você irá trabalhar com uma API HTTP simples, em FastAPI, chamada quotes-api. Ela expõe, no mínimo, os endpoints:
GET /healthz → retorna {"status": "ok"}
GET /quotes → retorna uma lista de frases
GET /quotes/random → retorna uma frase aleatória
O código-base e a estrutura sugerida estão descritos na prática de Minikube fornecida pelo professor. 3. Entregáveis
Você deve entregar:
Repositório (GitHub ou similar) com:
Código da API (app.py ou equivalente).
requirements.txt.
Dockerfile.
Pasta k8s/ contendo:
deployment.yaml
service.yaml
ingress.yaml
Comprovantes em PDF ou imagens (prints de tela):
Execução local da API em Docker (curl http://localhost:8000/healthz e /quotes/random).
Comandos e saídas principais do Kubernetes:
kubectl get nodes
kubectl get deploy,svc,ing
kubectl get pods -w (print em algum momento com pods “Running”)
kubectl logs -l app=quotes-api
Teste via Ingress:
curl http://quotes.local/healthz
curl http://quotes.local/quotes/random
Relatório curto (1–2 páginas) respondendo às perguntas de reflexão (Seção 7).
-
Parte A – Preparar o ambiente
Pré-requisitos (em máquina própria ou laboratório):
Windows 10/11 com WSL2 habilitado OU Linux nativo. Docker instalado e em execução. kubectl, Minikube e Helm instalados (via winget, choco ou pacote da distro).Subir o cluster Minikube:
Inicie o Docker Desktop (no Windows). Em um terminal, execute: minikube start --driver=docker --cpus=2 --memory=4096 kubectl get nodes Tire um print do kubectl get nodes mostrando o nó minikube em estado Ready.Habilitar o Ingress NGINX:
minikube addons enable ingress kubectl -n ingress-nginx get pods
Tire um print mostrando os pods do ingress rodando. -
Parte B – Dockerizar a API e testar localmente
Estrutura de pastas mínima:
quotes-api/ app.py requirements.txt Dockerfile tests/ test_app.py (opcional, se o professor solicitar) k8s/ deployment.yaml service.yaml ingress.yaml
Implemente a API em app.py com os endpoints descritos na Seção 2.
Crie o requirements.txt com as dependências mínimas para rodar o FastAPI com Uvicorn.
Crie o Dockerfile baseado na imagem python:3.12-slim (ou similar), instalando as dependências e expondo a porta 8000.
Build e teste local:
docker build -t quotes-api:1.0.0 . docker run -d -p 8000:8000 --name quotes quotes-api:1.0.0
curl http://localhost:8000/healthz curl http://localhost:8000/quotes/random
docker rm -f quotes
Registre no relatório: saída do /healthz e um exemplo de frase retornada. -
Parte C – Publicar no Minikube (Deployment, Service, Ingress) 6.1. Carregar a imagem no Minikube
Use uma das opções abaixo (combine com o professor):
Opção 1 – Build dentro do Minikube:
minikube image build -t quotes-api:1.0.0 .
minikube image ls | grep quotes
Opção 2 – Build local + load para o Minikube:
docker build -t quotes-api:1.0.0 .
minikube image load quotes-api:1.0.0
Registre no relatório qual opção você utilizou e por quê. 6.2. Criar os manifests Kubernetes
Deployment (k8s/deployment.yaml):
kind: Deployment
replicas: 2
image: quotes-api:1.0.0
containerPort: 8000
Readiness e liveness probes em /healthz.
Service (k8s/service.yaml):
kind: Service
type: ClusterIP
Porta 80 redirecionando para 8000 no container.
Ingress (k8s/ingress.yaml):
kind: Ingress
ingressClassName: nginx
Regra apontando o host quotes.local para o seu Service.
Arquivo de hosts (Windows/Linux):
Adicione a linha:
127.0.0.1 quotes.local
6.3. Aplicar e validar
Aplicar os manifests:
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/ingress.yaml
kubectl get deploy,svc,ing
kubectl get pods -w
Abrir um túnel para o Ingress:
minikube tunnel
Testar os endpoints via Ingress:
curl http://quotes.local/healthz
curl http://quotes.local/quotes/random
Inclua prints dos comandos e respostas no relatório.
-
Parte D – Observabilidade, Escala e Rollout
Logs e eventos:
Execute: kubectl logs -l app=quotes-api kubectl describe pod -l app=quotes-api kubectl get events --sort-by=.metadata.creationTimestamp | tail -n 20 Se algum pod tiver falhado, descreva o problema e a solução adotada.Escalar a aplicação:
Aumente as réplicas para 4: kubectl scale deploy/quotes-api --replicas=4 kubectl get pods Tire print mostrando as 4 réplicas Running.Rollout de nova versão:
Crie uma nova imagem quotes-api:1.0.1 alterando, por exemplo, uma frase ou o título da aplicação. Atualize o Deployment: kubectl set image deploy/quotes-api quotes-api=quotes-api:1.0.1 kubectl rollout status deploy/quotes-api kubectl rollout history deploy/quotes-api Teste novamente http://quotes.local/quotes/random e veja se a mudança entrou.Rollout undo (opcional):
Volte para a versão 1.0.0 usando kubectl rollout undo deploy/quotes-api e registre o que aconteceu. -
Perguntas de reflexão (para o relatório)
Responda em texto corrido (1–2 páginas):
Explique, com suas palavras, o fluxo Dev → Docker → Minikube/Kubernetes que você implementou.
Qual é o papel de cada objeto criado (Deployment, Service, Ingress) na arquitetura?
O que muda, conceitualmente, entre rodar docker run local e expor a app via Ingress em um cluster Kubernetes?
Descreva um problema real que você enfrentou na prática (por exemplo, imagem não encontrada, Ingress 404, pod em CrashLoopBackOff) e como diagnosticou e resolveu.
Se essa API fosse parte de um sistema maior, que outros recursos de Kubernetes você considera importantes (ConfigMap, Secret, HPA, etc.) e por quê?