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