โธ๏ธ O que รฉ Kubernetes?
Kubernetes (K8s) รฉ uma plataforma open-source de orquestraรงรฃo de containers. Ele automatiza o deploy, escalonamento e gerenciamento de aplicaรงรตes em containers.
Enquanto o Docker resolve o problema de "como empacotar e rodar um container", o Kubernetes resolve "como gerenciar centenas de containers em produรงรฃo".
- Auto-healing โ reinicia containers que falham automaticamente
- Auto-scaling โ escala a aplicaรงรฃo conforme a demanda
- Load balancing โ distribui trรกfego entre instรขncias
- Rolling updates โ atualiza sem downtime
- Self-service โ times fazem deploy sem depender de infra
๐๏ธ Arquitetura do Cluster
Um cluster Kubernetes รฉ composto por dois tipos de nรณs:
| Componente | Funรงรฃo |
|---|---|
| API Server | Ponto central de comunicaรงรฃo โ tudo passa por ele |
| etcd | Banco de dados chave-valor que armazena o estado do cluster |
| Scheduler | Decide em qual nรณ cada Pod serรก executado |
| Controller Manager | Garante que o estado atual = estado desejado |
| kubelet | Agente em cada nรณ โ garante que os containers rodem |
| kube-proxy | Gerencia regras de rede em cada nรณ |
๐งฉ Objetos Principais
| Objeto | O que faz | Analogia |
|---|---|---|
| Pod | Menor unidade โ 1 ou mais containers que compartilham rede e storage | Um processo |
| Deployment | Gerencia rรฉplicas de Pods, rolling updates e rollbacks | Gerente de equipe |
| ReplicaSet | Garante N rรฉplicas de um Pod rodando (gerenciado pelo Deployment) | Supervisor de turno |
| Service | Expรตe Pods com IP estรกvel e load balancing | Recepcionista |
| Ingress | Roteamento HTTP/HTTPS externo para Services | Porteiro com mapa |
| ConfigMap | Configuraรงรตes nรฃo-sensรญveis injetadas nos Pods | Arquivo .env |
| Secret | Dados sensรญveis (senhas, tokens) em base64 | Cofre |
| Namespace | Isolamento lรณgico dentro do cluster | Pasta de projeto |
| PersistentVolume | Storage persistente independente do Pod | HD externo |
โจ๏ธ kubectl โ Comandos Essenciais
O kubectl รฉ a CLI para interagir com o cluster:
# Verificar conexรฃo com o cluster
kubectl cluster-info
kubectl get nodes
# Listar recursos
kubectl get pods
kubectl get pods -n kube-system # namespace especรญfico
kubectl get pods -A # todos os namespaces
kubectl get deployments
kubectl get services
kubectl get all # tudo de uma vez
# Detalhes de um recurso
kubectl describe pod meu-pod
kubectl describe deployment minha-app
# Logs
kubectl logs meu-pod
kubectl logs meu-pod -f # follow (tempo real)
kubectl logs meu-pod -c meu-container # container especรญfico
# Executar comando dentro de um Pod
kubectl exec -it meu-pod -- bash
kubectl exec -it meu-pod -- sh # para imagens Alpine
# Aplicar/deletar manifests
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl delete pod meu-pod
# Escalar deployment
kubectl scale deployment minha-app --replicas=5
# Ver histรณrico de rollout
kubectl rollout history deployment/minha-app
kubectl rollout undo deployment/minha-app # rollback
๐ Manifests YAML
Tudo no Kubernetes รฉ declarado em YAML. Vocรช descreve o estado desejado e o K8s se encarrega de chegar lรก.
Pod simples:
apiVersion: v1
kind: Pod
metadata:
name: meu-pod
labels:
app: minha-app
spec:
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80
Deployment com 3 rรฉplicas:
apiVersion: apps/v1
kind: Deployment
metadata:
name: minha-app
spec:
replicas: 3
selector:
matchLabels:
app: minha-app
template:
metadata:
labels:
app: minha-app
spec:
containers:
- name: app
image: minha-app:1.0
ports:
- containerPort: 3000
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "250m"
๐ Services e Ingress
Pods tรชm IPs efรชmeros โ morrem e nascem com IPs diferentes. O Service fornece um IP estรกvel e faz load balancing.
| Tipo | Acesso | Uso |
|---|---|---|
| ClusterIP | Interno ao cluster | Comunicaรงรฃo entre serviรงos |
| NodePort | IP do nรณ + porta alta (30000-32767) | Testes locais |
| LoadBalancer | IP externo via cloud provider | Produรงรฃo na AWS/GCP/Azure |
# Service ClusterIP (comunicaรงรฃo interna)
apiVersion: v1
kind: Service
metadata:
name: minha-app-svc
spec:
selector:
app: minha-app
ports:
- port: 80
targetPort: 3000
# Ingress โ roteamento HTTP por path/host
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: meu-ingress
spec:
rules:
- host: app.aegiscloud.com.br
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minha-app-svc
port:
number: 80
๐ ConfigMap e Secrets
Separe configuraรงรฃo do cรณdigo โ nunca coloque variรกveis de ambiente hardcoded na imagem.
# ConfigMap โ configuraรงรตes nรฃo-sensรญveis
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
DB_HOST: "postgres-svc"
---
# Secret โ dados sensรญveis (base64)
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DB_PASSWORD: c2VuaGExMjM= # echo -n 'senha123' | base64
API_KEY: bWluaGEtY2hhdmU=
# Usando no Deployment
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets
โ๏ธ Kubernetes na AWS โ EKS
O Amazon EKS (Elastic Kubernetes Service) รฉ o Kubernetes gerenciado da AWS. A AWS cuida do Control Plane โ vocรช gerencia apenas os Worker Nodes.
# Instalar eksctl (CLI para EKS)
curl --silent --location \
"https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" \
| tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
# Criar cluster EKS (leva ~15 min)
eksctl create cluster \
--name aegiscloud-cluster \
--region us-east-1 \
--nodegroup-name workers \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 4 \
--managed
# Configurar kubectl para o cluster
aws eks update-kubeconfig \
--region us-east-1 \
--name aegiscloud-cluster
# Verificar
kubectl get nodes
# Instalar minikube (Linux/WSL2)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Iniciar cluster local
minikube start
# Acessar dashboard web
minikube dashboard
# Parar cluster
minikube stop
