Skip to content

mascenaa/quotes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

  1. 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.
  1. 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).
  1. 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.
    
  2. 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.
    
  3. 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.
  1. 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.
    
  2. 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ê?

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors