Setup local: minikube ou kind
Para praticar K8s localmente, você precisa de um cluster. Opções leves:
- minikube: Sobe um cluster numa VM. Mais "completo".
- kind (Kubernetes IN Docker): Usa containers como nodes. Mais leve e rápido.
- k3d: K3s rodando em Docker. Outra opção popular.
bash
# Com minikube
minikube start
kubectl get nodes # ver se tá tudo ok
# Para usar imagens locais no minikube
eval $(minikube docker-env) # importante!
docker build -t minha-app:v1 .Anatomia de um manifest
Todo recurso Kubernetes segue a mesma estrutura:
yaml
apiVersion: <versão da API>
kind: <tipo do recurso>
metadata:
name: <nome>
labels:
chave: valor
spec:
<especificação do recurso>Deploy completo: Deployment + Service
Crie k8s/deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: minha-app
labels:
app: minha-app
spec:
replicas: 3
selector:
matchLabels:
app: minha-app
template:
metadata:
labels:
app: minha-app
spec:
containers:
- name: app
image: minha-app:v1
imagePullPolicy: IfNotPresent # importante para imagens locais
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
# Health checks
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 2
periodSeconds: 5
# Limites de recursos
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"E k8s/service.yaml:
yaml
apiVersion: v1
kind: Service
metadata:
name: minha-app-service
spec:
selector:
app: minha-app
ports:
- port: 80
targetPort: 8080
type: NodePort # acessível de fora do clusterComandos kubectl essenciais
kubectl é o cliente que conversa com o cluster. Aprenda esses:
bash
# === Aplicar / criar / atualizar ===
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/ # toda a pasta
# === Listar ===
kubectl get pods
kubectl get pods -o wide # mais detalhes
kubectl get pods -w # watch (acompanha mudanças)
kubectl get deployments
kubectl get services
kubectl get all # tudo de uma vez
# === Detalhar (debug) ===
kubectl describe pod <nome-do-pod>
kubectl describe deployment minha-app
# === Logs ===
kubectl logs <nome-do-pod>
kubectl logs -f <nome-do-pod> # follow
kubectl logs -l app=minha-app # todos com esse label
# === Executar comando dentro do pod ===
kubectl exec -it <nome-do-pod> -- sh
# === Port forward (acessar localmente) ===
kubectl port-forward service/minha-app-service 8080:80
# === Escalar ===
kubectl scale deployment minha-app --replicas=5
# === Atualizar imagem ===
kubectl set image deployment/minha-app app=minha-app:v2
# === Ver histórico e rollback ===
kubectl rollout history deployment/minha-app
kubectl rollout undo deployment/minha-app
# === Apagar ===
kubectl delete -f k8s/deployment.yaml
kubectl delete pod <nome-do-pod>Fluxo completo
bash
# 1. Build da imagem (usando o docker do minikube)
eval $(minikube docker-env)
docker build -t minha-app:v1 .
# 2. Aplicar manifests
kubectl apply -f k8s/
# 3. Verificar
kubectl get pods
# NAME READY STATUS RESTARTS
# minha-app-7d9f8b6c-abc12 1/1 Running 0
# minha-app-7d9f8b6c-def34 1/1 Running 0
# minha-app-7d9f8b6c-ghi56 1/1 Running 0
# 4. Acessar
kubectl port-forward service/minha-app-service 8080:80
curl http://localhost:8080ConfigMaps e Secrets
Não coloque configuração no código. Use ConfigMaps:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: minha-app-config
data:
PORT: "8080"
LOG_LEVEL: "info"
FEATURE_X: "true"E referencie no Deployment:
yaml
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: minha-app-configSecrets funcionam igual, mas para senhas, tokens, certificados:
bash
kubectl create secret generic minha-app-secrets \
--from-literal=DB_PASSWORD=supersecreto \
--from-literal=API_KEY=abc123yaml
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: minha-app-secrets
key: DB_PASSWORD