Lab 5.4 - Rotation des Secrets
Objectifs
À la fin de ce lab, vous serez capable de:
- Comprendre le processus de rotation des secrets
- Créer de nouveaux secrets
- Mettre à jour les déploiements avec de nouveaux secrets
- Supprimer les anciens secrets
- Implémenter une rotation sans interruption
Prérequis
- Cluster Kubernetes fonctionnel
- kubectl configuré
- Compréhension des Secrets et Deployments
Exercice 1: Rotation Basique
Étape 1: Créer le Secret Initial
kubectl create secret generic db-secret-v1 \
--from-literal=password=old-password-123
Étape 2: Créer un Deployment
Créez 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
Étape 3: Déployer
kubectl apply -f deployment-v1.yaml
kubectl get pods -l app=myapp
Exercice 2: Créer un Nouveau Secret
Créer le Secret v2
kubectl create secret generic db-secret-v2 \
--from-literal=password=new-password-456
Vérifier
kubectl get secrets
kubectl describe secret db-secret-v2
Exercice 3: Mettre à Jour le Deployment
Mettre à Jour la Référence
kubectl set env deployment/app-deployment \
DB_PASSWORD=$(kubectl get secret db-secret-v2 -o jsonpath='{.data.password}' | base64 -d)
OU modifiez le fichier YAML:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2 # Changé de v1 à v2
key: password
Puis:
kubectl apply -f deployment-v1.yaml
Vérifier le Redémarrage
kubectl get pods -l app=myapp -w
kubectl rollout status deployment/app-deployment
Exercice 4: Rotation avec Rolling Update
Créer un Deployment avec Rolling Update
Modifiez le deployment pour utiliser le nouveau secret et forcer un rolling update:
# Méthode 1: Modifier le secret référencé
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éthode 2: Annotation pour forcer le redémarrage
kubectl patch deployment app-deployment -p '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'$(date +%Y-%m-%dT%H:%M:%S%z)'"}}}}}'
Vérifier
kubectl get pods -l app=myapp
kubectl logs <pod-name> | grep Password
Exercice 5: Rotation Automatisée avec Script
Créer un Script de Rotation
Créez rotate-secret.sh:
#!/bin/bash
SECRET_NAME=$1
NEW_SECRET_NAME=$2
DEPLOYMENT_NAME=$3
ENV_VAR_NAME=$4
# Créer le nouveau secret (doit être créé manuellement avant)
# kubectl create secret generic $NEW_SECRET_NAME --from-literal=password=<new-password>
# Mettre à jour le deployment
kubectl set env deployment/$DEPLOYMENT_NAME \
$ENV_VAR_NAME=$(kubectl get secret $NEW_SECRET_NAME -o jsonpath='{.data.password}' | base64 -d)
# Attendre le rollout
kubectl rollout status deployment/$DEPLOYMENT_NAME
echo "Rotation terminée. Supprimez l'ancien secret: kubectl delete secret $SECRET_NAME"
Utiliser le Script
chmod +x rotate-secret.sh
./rotate-secret.sh db-secret-v1 db-secret-v2 app-deployment DB_PASSWORD
Exercice 6: Rotation avec Init Container
Créer un Deployment avec Init Container
Créez 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
Exercice 7: Vérification Post-Rotation
Vérifier les Pods
# Voir tous les Pods
kubectl get pods -l app=myapp
# Vérifier les logs
kubectl logs <pod-name> | grep Password
# Vérifier les variables d'environnement
kubectl exec <pod-name> -- env | grep DB_PASSWORD
Vérifier les Secrets
# Voir les secrets
kubectl get secrets | grep db-secret
# Vérifier que l'ancien secret n'est plus utilisé
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | grep -o db-secret-v1
Nettoyage
# Supprimer les déploiements
kubectl delete deployment app-deployment app-deployment-init
# Supprimer les anciens secrets (après vérification)
kubectl delete secret db-secret-v1
# Garder db-secret-v2 pour référence
Questions de Réflexion
- Pourquoi est-il important de vérifier que tous les Pods utilisent le nouveau secret avant de supprimer l'ancien?
- Comment pouvez-vous automatiser la rotation des secrets?
- Quelle est la meilleure stratégie pour la rotation sans interruption?
- Comment gérer la rotation des secrets pour les StatefulSets?
Défi Bonus
Créez un CronJob qui vérifie automatiquement l'âge des secrets et alerte si un secret n'a pas été roté depuis plus de 90 jours.
Lab créé le: Décembre 2024