Exercice 02 : Externaliser la configuration avec ConfigMaps et Secrets
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un ConfigMap et un Secret depuis la CLI
- ✅ Injecter toute la configuration via
envFrom - ✅ Injecter une clé spécifique via
env.valueFrom - ✅ Monter un ConfigMap comme fichier dans un conteneur
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐☆☆ (Avancé)
Prérequis : minikube démarré, maîtrise des Pods et Deployments
📖 Contexte
Coder les paramètres de configuration dans les images Docker est une mauvaise pratique. Kubernetes fournit deux ressources pour externaliser la configuration : ConfigMap (données non sensibles) et Secret (mots de passe, tokens, certificats). Les valeurs sont injectées dans les pods sans modifier l'image.
📋 Énoncé
Vous allez configurer une application web dont tous les paramètres (port, mode, base de données) sont externalisés dans un ConfigMap et un Secret, montés à la fois comme variables d'environnement et comme fichiers.
Résultat attendu :
- Un ConfigMap
app-configet un Secretapp-secretcréés - Un pod qui consomme la configuration via les deux méthodes
🧭 Déroulement de l'exercice
Tâche 1 : Créer un ConfigMap
Créez un ConfigMap app-config avec les clés APP_PORT=8080, APP_MODE=production et APP_LOG_LEVEL=info.
Indice :
kubectl create configmap app-config --from-literal=APP_PORT=8080 ...
Vérification : kubectl describe configmap app-config affiche les 3 clés.
Tâche 2 : Créer un Secret
Créez un Secret app-secret avec DB_PASSWORD=MonMotDePasse123 et API_KEY=abc123secret.
Indice :
kubectl create secret generic app-secret --from-literal=DB_PASSWORD=...Les valeurs sont automatiquement encodées en base64 par Kubernetes.
Vérification : kubectl get secret app-secret -o yaml affiche les valeurs en base64. Décodez avec echo "..." | base64 -d.
Tâche 3 : Injecter via envFrom
Créez un pod qui charge TOUTES les clés du ConfigMap comme variables d'environnement via envFrom.
Indice :
spec.containers[].envFromprend une liste deconfigMapRefousecretRef.
Vérification : kubectl exec <pod> -- env | grep APP_ affiche les 3 variables.
Tâche 4 : Injecter via env.valueFrom
Créez un pod qui ne charge qu'une seule clé du Secret (DB_PASSWORD) via env.valueFrom.secretKeyRef.
Indice :
env[].valueFrom.secretKeyRefpermet de cibler une clé précise.
Vérification : kubectl exec <pod> -- env | grep DB_PASSWORD affiche la valeur décodée.
Tâche 5 : Monter un ConfigMap comme volume
Montez le ConfigMap app-config comme volume dans /etc/app-config/. Chaque clé devient un fichier.
Indice :
volumes[].configMap.name+volumeMounts[].mountPath
Vérification : kubectl exec <pod> -- ls /etc/app-config/ liste APP_PORT, APP_MODE, APP_LOG_LEVEL.
🗂️ Mini-Projet : Application complètement configurée en externe
# configured-app.yaml
apiVersion: v1
kind: Pod
metadata:
name: configured-app
spec:
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "env && ls /etc/config/ && sleep 3600"]
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-configCheckpoints :
kubectl exec configured-app -- env | grep APP_PORTafficheAPP_PORT=8080kubectl exec configured-app -- env | grep DB_PASSWORDaffiche le mot de passe décodékubectl exec configured-app -- ls /etc/config/liste les 3 fichiers de configkubectl exec configured-app -- cat /etc/config/APP_MODEafficheproductionkubectl get secret app-secret -o jsonpath='{.data.DB_PASSWORD}' | base64 -daffiche le mot de passe