M05·06Kubernetes na Prática

CAPÍTULO 06

Kubernetes na Prática

Setup local com minikube, manifests completos, kubectl essencial, ConfigMaps e Secrets.

Por Thiago Souza15 min de leituraAtualizado em 2026-05

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 cluster

Comandos 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:8080

ConfigMaps 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-config

Secrets funcionam igual, mas para senhas, tokens, certificados:

bash
kubectl create secret generic minha-app-secrets \
  --from-literal=DB_PASSWORD=supersecreto \
  --from-literal=API_KEY=abc123
yaml
spec:
  containers:
  - name: app
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: minha-app-secrets
          key: DB_PASSWORD