Aller au contenu principal

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​

  1. Pourquoi est-il important de vérifier que tous les Pods utilisent le nouveau secret avant de supprimer l'ancien?
  2. Comment pouvez-vous automatiser la rotation des secrets?
  3. Quelle est la meilleure stratégie pour la rotation sans interruption?
  4. 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