
Un ConfigMap stocke la configuration non sensible de vos applications (variables, fichiers de config) séparément du code. Vous pouvez ainsi réutiliser la même image dans plusieurs environnements et faire évoluer la configuration sans reconstruire l’image. Selon le mode d’injection choisi, la mise à jour peut être automatique ou nécessiter un redémarrage des Pods.
Ce guide vous montre comment créer des ConfigMaps, les injecter dans vos Pods, et éviter les pièges courants lors des mises à jour.
Prérequis : un cluster Kubernetes avec kubectl configuré.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un ConfigMap (littéraux, fichiers, YAML)
- Injecter la configuration via variables d’environnement ou fichiers montés
- Comprendre les différences entre
env,envFromet volumes - Éviter les pièges de mise à jour (env, subPath, propagation)
- Utiliser les ConfigMaps immutables en production
Ce qu’est un ConfigMap
Section intitulée « Ce qu’est un ConfigMap »Un ConfigMap est une ressource Kubernetes qui stocke des paires clé-valeur non sensibles. Il permet de :
- Externaliser la configuration du code
- Réutiliser la même image dans différents environnements
- Modifier la configuration sans redéployer l’application
ConfigMap ou Secret ?
Section intitulée « ConfigMap ou Secret ? »| Ressource | Usage |
|---|---|
| ConfigMap | Configuration non sensible (variables, fichiers de config) |
| Secret | Données sensibles (mots de passe, tokens, certificats) |
Dans la plupart des cas, vous utiliserez le champ data du ConfigMap. Kubernetes prend aussi en charge binaryData pour des données binaires encodées en base64.
Créer un ConfigMap
Section intitulée « Créer un ConfigMap »Depuis des valeurs littérales
Section intitulée « Depuis des valeurs littérales »La méthode la plus rapide pour quelques variables :
kubectl create configmap app-settings \ --from-literal=APP_ENV=production \ --from-literal=LOG_LEVEL=info \ --from-literal=MAX_CONNECTIONS=100Vérifiez la création :
kubectl get configmap app-settingsNAME DATA AGEapp-settings 3 5sDepuis un fichier
Section intitulée « Depuis un fichier »Pour un fichier de configuration complet :
cat > nginx.conf << 'EOF'server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; }}EOFkubectl create configmap nginx-config --from-file=nginx.confLe nom du fichier devient la clé, son contenu la valeur :
kubectl get configmap nginx-config -o yamlapiVersion: v1kind: ConfigMapdata: nginx.conf: | server { listen 80; server_name localhost; ...Depuis un fichier YAML
Section intitulée « Depuis un fichier YAML »Pour un contrôle total et la gestion en GitOps :
apiVersion: v1kind: ConfigMapmetadata: name: app-settingsdata: APP_ENV: production LOG_LEVEL: info MAX_CONNECTIONS: "100"kubectl apply -f app-config.yamlObserver et inspecter
Section intitulée « Observer et inspecter »Vue d’ensemble
Section intitulée « Vue d’ensemble »kubectl get configmapNAME DATA AGEapp-settings 3 2mnginx-config 1 1mkube-root-ca.crt 1 10dContenu détaillé
Section intitulée « Contenu détaillé »kubectl describe configmap app-settingsName: app-settingsNamespace: default
Data====APP_ENV:----production
LOG_LEVEL:----infoFormat YAML complet
Section intitulée « Format YAML complet »kubectl get configmap app-settings -o yamlInjecter un ConfigMap dans un Pod
Section intitulée « Injecter un ConfigMap dans un Pod »Trois méthodes principales, chacune avec ses cas d’usage :
| Méthode | Cas d’usage | Mise à jour auto |
|---|---|---|
env + valueFrom | Variables spécifiques | Non |
envFrom | Toutes les variables d’un coup | Non |
| Volume | Fichiers de configuration | Oui, après propagation |
Méthode 1 : Variable d’environnement spécifique
Section intitulée « Méthode 1 : Variable d’environnement spécifique »Injectez une ou plusieurs clés comme variables :
apiVersion: apps/v1kind: Deploymentmetadata: name: myappspec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: app image: nginx env: - name: APP_ENV valueFrom: configMapKeyRef: name: app-settings key: APP_ENV - name: LOG_LEVEL valueFrom: configMapKeyRef: name: app-settings key: LOG_LEVELLa variable APP_ENV dans le conteneur prend la valeur de la clé APP_ENV du ConfigMap.
Méthode 2 : Toutes les variables avec envFrom
Section intitulée « Méthode 2 : Toutes les variables avec envFrom »Injectez automatiquement toutes les clés du ConfigMap :
apiVersion: apps/v1kind: Deploymentmetadata: name: myappspec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: app image: nginx envFrom: - configMapRef: name: app-settingsChaque clé du ConfigMap devient une variable d’environnement :
kubectl exec deploy/myapp -- env | grep -E 'APP_|LOG_|MAX_'APP_ENV=productionLOG_LEVEL=infoMAX_CONNECTIONS=100Méthode 3 : Monter comme volume
Section intitulée « Méthode 3 : Monter comme volume »Pour des fichiers de configuration complets :
apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: config mountPath: /etc/nginx/conf.d volumes: - name: config configMap: name: nginx-configLe fichier /etc/nginx/conf.d/nginx.conf contient le contenu du ConfigMap.
Les pièges de la mise à jour
Section intitulée « Les pièges de la mise à jour »Modifier un ConfigMap ne met pas automatiquement à jour vos Pods dans tous les cas. Comprendre ces comportements évite de mauvaises surprises en production.
Piège 1 : Variables d’environnement jamais rafraîchies
Section intitulée « Piège 1 : Variables d’environnement jamais rafraîchies »Les variables d’environnement sont lues une seule fois au démarrage du conteneur :
# Modifier le ConfigMapkubectl patch configmap app-settings --type merge -p '{"data":{"APP_ENV":"staging"}}'
# La variable dans le Pod garde l'ancienne valeurkubectl exec deploy/myapp -- printenv APP_ENV# Affiche : production (pas staging !)Solution : redémarrer les Pods
kubectl rollout restart deployment myappPiège 2 : subPath ne se met jamais à jour
Section intitulée « Piège 2 : subPath ne se met jamais à jour »Si vous utilisez subPath pour monter un fichier spécifique, il n’est jamais mis à jour :
volumeMounts:- name: config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf # ⚠️ Pas de refresh autoLe fichier garde son contenu initial, même après modification du ConfigMap.
Solution : éviter subPath ou redémarrer le Pod
volumeMounts:- name: config mountPath: /etc/nginx/conf.d # Dossier entier, pas subPathPiège 3 : Délai de propagation
Section intitulée « Piège 3 : Délai de propagation »Même pour les volumes sans subPath, la propagation prend jusqu’à 60 secondes (selon le sync period du kubelet).
# Modifier le ConfigMapkubectl patch configmap nginx-config --type merge \ -p '{"data":{"nginx.conf":"server { listen 8080; }"}}'
# Attendre ~60 secondessleep 60
# Vérifier la mise à jourkubectl exec deploy/nginx -- cat /etc/nginx/conf.d/nginx.confRécapitulatif des comportements
Section intitulée « Récapitulatif des comportements »| Injection | Mise à jour auto ? | Action requise |
|---|---|---|
env / envFrom | Non | kubectl rollout restart |
| Volume | Oui (~60s) | Attendre ou restart |
Volume + subPath | Non | kubectl rollout restart |
ConfigMap immutable
Section intitulée « ConfigMap immutable »En production, marquez vos ConfigMaps comme immutables pour :
- Empêcher les modifications accidentelles
- Améliorer les performances (Kubernetes ne surveille plus les changements)
apiVersion: v1kind: ConfigMapmetadata: name: app-settings-v1data: APP_ENV: productionimmutable: trueUn ConfigMap immutable améliore la sécurité opérationnelle et limite les modifications accidentelles, mais il impose un workflow de versionnement explicite.
Toute tentative de modification échoue :
kubectl patch configmap app-settings-v1 --type merge -p '{"data":{"APP_ENV":"staging"}}'The ConfigMap "app-settings-v1" is invalid: data: Forbidden: field is immutable when `immutable` is setWorkflow avec ConfigMaps immutables :
- Créer un nouveau ConfigMap avec un nom versionné (ex:
app-settings-v2) - Mettre à jour le Deployment pour pointer vers le nouveau ConfigMap
- Supprimer l’ancien ConfigMap quand il n’est plus utilisé
Bonnes pratiques
Section intitulée « Bonnes pratiques »Nommer clairement
Section intitulée « Nommer clairement »myapp-confignginx-config-proddatabase-settingsconfig1test-configtemp-settingsOrganiser par namespace
Section intitulée « Organiser par namespace »Un ConfigMap par environnement, dans son namespace :
kubectl create configmap myapp-config -n production --from-file=config.yamlkubectl create configmap myapp-config -n staging --from-file=config-staging.yamlLimiter la taille
Section intitulée « Limiter la taille »Un ConfigMap ne peut pas dépasser 1 Mo. Pour des fichiers volumineux, utilisez un PersistentVolume ou une ConfigMap par fichier.
Versionner en GitOps
Section intitulée « Versionner en GitOps »Stockez vos ConfigMaps en YAML dans Git pour tracer les changements et permettre les rollbacks.
Debug : problèmes courants
Section intitulée « Debug : problèmes courants »-
Le ConfigMap existe-t-il ?
Fenêtre de terminal kubectl get configmap app-settingsSi “NotFound”, créez-le d’abord.
-
La clé existe-t-elle ?
Fenêtre de terminal kubectl get configmap app-settings -o jsonpath='{.data.APP_ENV}'Vérifiez l’orthographe exacte de la clé.
-
Le Pod référence-t-il le bon ConfigMap ?
Fenêtre de terminal kubectl describe pod myapp-xxx | grep -A5 "Environment\|Mounts" -
Le Pod a-t-il redémarré après modification ?
Pour les variables d’environnement, un rollout restart est nécessaire.
Erreurs fréquentes
Section intitulée « Erreurs fréquentes »| Erreur | Cause | Solution |
|---|---|---|
CreateContainerConfigError | ConfigMap ou clé introuvable | Vérifier le nom et la clé |
| Variable vide | Clé mal orthographiée | kubectl describe cm pour vérifier |
| Fichier non mis à jour | subPath utilisé | Éviter subPath ou restart |
Testez vos Connaissances
Section intitulée « Testez vos Connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Un ConfigMap stocke la configuration non sensible sous forme de paires clé-valeur
- Trois méthodes d’injection :
env,envFrom, volume - Les variables d’environnement ne sont jamais rafraîchies sans redémarrer le Pod
- Les volumes se mettent à jour automatiquement (~60s), sauf avec
subPath - Utiliser immutable: true en production pour éviter les modifications accidentelles
- Pour les données sensibles, utilisez un Secret