Este repositório contém o Lab do Dia 2 da Maratona DevOps + IA com Fabricio Veronez, onde aplicamos na prática o uso de Kubernetes para orquestrar a aplicação KubeNews, promovendo escalabilidade, resiliência e automação declarativa.
- Criar e configurar um cluster Kubernetes local e na nuvem.
- Implantar uma aplicação em containers com escalabilidade e resiliência.
- Utilizar
kubectlpara gerenciar objetos do cluster. - Entender a arquitetura do Kubernetes.
- Testar serviços do tipo LoadBalancer.
- Simular cenários de falha e recuperação automática (resiliência).
- Utilizar o Ask Gordon para análises do cluster.
- Control Plane
- API Server
- etcd
- Scheduler
- Controller Manager
- Worker Node
- Kubelet
- Kube-Proxy
- Container Runtime (ContainerD, CRI-O)
- Kubernetes (kubectl)
- Digital Ocean (Kubernetes as a Service)
- Minikube / Kind (para testes locais)
- Chocolatey (Instalação no Windows)
- Visual Studio Code
| Objeto Kubernetes | Função |
|---|---|
| Deployment | Gerencia pods e réplicas |
| ReplicaSet | Garante número constante de pods |
| Pod | Unidade mínima de execução |
| Service | Expõe pods para acesso externo |
devops-kubenews-k8s/
│
├── k8s/ # Arquivos de definição Kubernetes (YAML)
│ └── deployment.yaml
├── src/ # Código-fonte da aplicação
├── README.md # Documentação detalhada
# Inicia um cluster Kubernetes local usando o Minikube
minikube start
# Aplica todos os manifests (YAML) que estão dentro da pasta "k8s/"
# Geralmente contém Deployments, Services, ConfigMaps etc.
kubectl apply -f k8s/
# Exibe a URL de acesso externo para o Service chamado "kube-news-service"
# O Minikube cria um túnel local para acessar o serviço rodando no cluster
minikube service kube-news-serviceAcesse via: http://localhost:PORTA
-
Crie um cluster com pelo menos 2vCPU e 2GB RAM
-
Baixe o arquivo .kube/config e salve em:
- Linux/macOS: ~/.kube/config
- Windows: C:\Users\SEU_USUARIO.kube\config
- Deploy da Aplicação
kubectl apply -f deployment.yaml
kubectl get allapiVersion: apps/v1
kind: Deployment
metadata:
name: kube-news-deployment
spec:
replicas: 3
selector:
matchLabels:
app: kube-news-app
template:
metadata:
labels:
app: kube-news-app
spec:
containers:
- name: kube-news
image: <sua-imagem>
ports:
- containerPort: 8080- Expondo via LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: kube-news-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: kube-news-appEscalabilidade
- Aumentar número de réplicas:
spec:
replicas: 10Resiliência
- Simular falha:
kubectl delete pod <nome-do-pod>O pod será recriado automaticamente.
kubectl rollout history deployment kube-news-deployment
kubectl rollout undo deployment kube-news-deploymentProblema:
- Pods da aplicação em
CrashLoopBackOff - Erro:
ConnectionRefusedError: connect ECONNREFUSED 10.99.225.23:5432 - Service do PostgreSQL apontando para IP incorreto
Solução:
- Recriação do service do PostgreSQL com selector correto
- Novo IP:
10.102.88.120:5432 - Aplicação consegue conectar no banco
Problema:
- Deployments sem
livenessProbeereadinessProbe - Kubernetes não conseguia verificar saúde dos pods
- Tráfego sendo roteado para pods não saudáveis
Solução:
# PostgreSQL Health Checks
livenessProbe:
exec:
command:
- pg_isready
- -U
- kubedevnews
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- pg_isready
- -U
- kubedevnews
initialDelaySeconds: 5
periodSeconds: 5
# Aplicação Health Checks
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 5Problema:
- PostgreSQL sem volume persistente
- Dados perdidos a cada reinicialização do pod
Solução:
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
# Volume Mount no PostgreSQL
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvcProblema:
- Service com selector
tier: backendque não existia - Roteamento falhando para o PostgreSQL
Solução:
selector:
app: postgres #Selector corretoPara facilitar manutenção, criamos arquivos individuais:
k8s/postgres-deployment.yaml- Deployment do PostgreSQLk8s/postgres-pvc.yaml- Volume persistentek8s/postgres-service.yaml- Service do PostgreSQLk8s/kube-news-service.yaml- Service da aplicaçãok8s/app-deployment.yaml- Deployment da aplicação
# Aplicar cada recurso separadamente
kubectl apply -f k8s/postgres-pvc.yaml
kubectl apply -f k8s/postgres-deployment.yaml
kubectl apply -f k8s/postgres-service.yaml
kubectl apply -f k8s/kube-news-service.yaml
kubectl apply -f k8s/app-deployment.yaml
Kubectl apply -f k8skubectl get pods
kubectl get services
kubectl logs <nome-do-pod>- Alta Disponibilidade: Health checks garantem pods saudáveis
- Persistência: Dados preservados entre reinicializações
- Conectividade: Service funcionando corretamente
- Monitoramento: Probes para observabilidade
- Resiliência: Recuperação automática de falhas
Para remover todos os recursos criados no cluster Kubernetes:
# Remover deployments
kubectl delete -f k8s/app-deployment.yaml
kubectl delete -f k8s/postgres-deployment.yamlkubectl delete -f k8s/postgres-service.yaml kubectl delete -f k8s/kube-news-service.yaml
kubectl delete -f k8s/postgres-pvc.yaml
### **Verificação da Limpeza**
```bash
# Verificar se todos os recursos foram removidos
kubectl get all
kubectl get pvc
kubectl get pv
# Verificar se não há pods órfãos
kubectl get pods --all-namespaces
# Remover todos os recursos de uma vez
kubectl delete -f k8s/
# Ou deletar por tipo
kubectl delete deployment --all
kubectl delete service --all
kubectl delete pvc --all# Parar o cluster
minikube stop
# Deletar o cluster
minikube delete
# Iniciar um novo cluster limpo
minikube start- Cuidado: Deletar PVCs remove permanentemente os dados do banco
- Rolling Update: Deployments fazem rolling update, não delete imediato
- Verificação: Sempre verifique se todos os recursos foram removidos
- Backup: Faça backup dos dados antes de limpar se necessário