Lab 5.4 - Rotação de Segredos
Objetivos
Ao final deste lab, você será capaz de:
- Compreender o processo de rotação de segredos
- Criar novos segredos
- Atualizar os deployments com novos segredos
- Remover os segredos antigos
- Implementar uma rotação sem interrupção
Pré-requisitos
- Cluster Kubernetes funcional
- kubectl configurado
- Compreensão de Secrets e Deployments
Exercício 1: Rotação Básica
Etapa 1: Criar o Secret Inicial
kubectl create secret generic db-secret-v1 \
--from-literal=password=old-password-123
Etapa 2: Criar um Deployment
Crie deployment-v1.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "echo 'Password: $DB_PASSWORD' && sleep 3600"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v1
key: password
Etapa 3: Fazer o Deploy
kubectl apply -f deployment-v1.yaml
kubectl get pods -l app=myapp
Exercício 2: Criar um Novo Secret
Criar o Secret v2
kubectl create secret generic db-secret-v2 \
--from-literal=password=new-password-456
Verificar
kubectl get secrets
kubectl describe secret db-secret-v2
Exercício 3: Atualizar o Deployment
Atualizar a Referência
kubectl set env deployment/app-deployment \
DB_PASSWORD=$(kubectl get secret db-secret-v2 -o jsonpath='{.data.password}' | base64 -d)
OU modifique o arquivo YAML:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2 # Alterado de v1 para v2
key: password
Depois:
kubectl apply -f deployment-v1.yaml
Verificar o Restart
kubectl get pods -l app=myapp -w
kubectl rollout status deployment/app-deployment
Exercício 4: Rotação com Rolling Update
Criar um Deployment com Rolling Update
Altere o deployment para usar o novo secret e forçar um rolling update:
# Método 1: Modificar o secret referenciado
kubectl patch deployment app-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"app","env":[{"name":"DB_PASSWORD","valueFrom":{"secretKeyRef":{"name":"db-secret-v2","key":"password"}}}]}]}}}}'
# Método 2: Anotação para forçar o restart
kubectl patch deployment app-deployment -p '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'$(date +%Y-%m-%dT%H:%M:%S%z)'"}}}}}'
Verificar
kubectl get pods -l app=myapp
kubectl logs <pod-name> | grep Password
Exercício 5: Rotação Automatizada com Script
Criar um Script de Rotação
Crie rotate-secret.sh:
#!/bin/bash
SECRET_NAME=$1
NEW_SECRET_NAME=$2
DEPLOYMENT_NAME=$3
ENV_VAR_NAME=$4
# Criar o novo secret (deve ser criado manualmente antes)
# kubectl create secret generic $NEW_SECRET_NAME --from-literal=password=<new-password>
# Atualizar o deployment
kubectl set env deployment/$DEPLOYMENT_NAME \
$ENV_VAR_NAME=$(kubectl get secret $NEW_SECRET_NAME -o jsonpath='{.data.password}' | base64 -d)
# Aguardar o rollout
kubectl rollout status deployment/$DEPLOYMENT_NAME
echo "Rotação concluída. Remova o secret antigo: kubectl delete secret $SECRET_NAME"
Usar o Script
chmod +x rotate-secret.sh
./rotate-secret.sh db-secret-v1 db-secret-v2 app-deployment DB_PASSWORD
Exercício 6: Rotação com Init Container
Criar um Deployment com Init Container
Crie deployment-init.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment-init
spec:
replicas: 3
selector:
matchLabels:
app: myapp-init
template:
metadata:
labels:
app: myapp-init
spec:
initContainers:
- name: secret-validator
image: busybox:1.35
command: ["sh", "-c", "test -n \"$DB_PASSWORD\" && echo 'Secret valid'"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2
key: password
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "echo 'Password: $DB_PASSWORD' && sleep 3600"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2
key: password
Exercício 7: Verificação Pós-Rotação
Verificar os Pods
# Ver todos os Pods
kubectl get pods -l app=myapp
# Verificar os logs
kubectl logs <pod-name> | grep Password
# Verificar as variáveis de ambiente
kubectl exec <pod-name> -- env | grep DB_PASSWORD
Verificar os Secrets
# Ver os secrets
kubectl get secrets | grep db-secret
# Verificar se o secret antigo não está mais em uso
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | grep -o db-secret-v1
Limpeza
# Remover os deployments
kubectl delete deployment app-deployment app-deployment-init
# Remover os secrets antigos (após verificação)
kubectl delete secret db-secret-v1
# Manter db-secret-v2 para referência
Perguntas para Reflexão
- Por que é importante verificar se todos os Pods estão usando o novo secret antes de remover o antigo?
- Como você pode automatizar a rotação de segredos?
- Qual é a melhor estratégia para rotação sem interrupção?
- Como gerenciar a rotação de segredos para StatefulSets?
Desafio Bônus
Crie um CronJob que verifique automaticamente a idade dos secrets e alerte se um secret não foi rotacionado há mais de 90 dias.
Lab criado em: Dezembro de 2024