Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

ConfigMaps Kubernetes : gérer la configuration de vos applications

12 min de lecture

logo kubernetes

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é.

  • 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, envFrom et volumes
  • Éviter les pièges de mise à jour (env, subPath, propagation)
  • Utiliser les ConfigMaps immutables en production

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
RessourceUsage
ConfigMapConfiguration non sensible (variables, fichiers de config)
SecretDonné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.

La méthode la plus rapide pour quelques variables :

Fenêtre de terminal
kubectl create configmap app-settings \
--from-literal=APP_ENV=production \
--from-literal=LOG_LEVEL=info \
--from-literal=MAX_CONNECTIONS=100

Vérifiez la création :

Fenêtre de terminal
kubectl get configmap app-settings
Sortie
NAME DATA AGE
app-settings 3 5s

Pour un fichier de configuration complet :

Créer le fichier
cat > nginx.conf << 'EOF'
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
}
}
EOF
Créer le ConfigMap
kubectl create configmap nginx-config --from-file=nginx.conf

Le nom du fichier devient la clé, son contenu la valeur :

Fenêtre de terminal
kubectl get configmap nginx-config -o yaml
Sortie
apiVersion: v1
kind: ConfigMap
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
...

Pour un contrôle total et la gestion en GitOps :

app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-settings
data:
APP_ENV: production
LOG_LEVEL: info
MAX_CONNECTIONS: "100"
Fenêtre de terminal
kubectl apply -f app-config.yaml
Fenêtre de terminal
kubectl get configmap
Sortie
NAME DATA AGE
app-settings 3 2m
nginx-config 1 1m
kube-root-ca.crt 1 10d
Fenêtre de terminal
kubectl describe configmap app-settings
Sortie
Name: app-settings
Namespace: default
Data
====
APP_ENV:
----
production
LOG_LEVEL:
----
info
Fenêtre de terminal
kubectl get configmap app-settings -o yaml

Trois méthodes principales, chacune avec ses cas d’usage :

MéthodeCas d’usageMise à jour auto
env + valueFromVariables spécifiquesNon
envFromToutes les variables d’un coupNon
VolumeFichiers de configurationOui, 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 :

deployment-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
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_LEVEL

La variable APP_ENV dans le conteneur prend la valeur de la clé APP_ENV du ConfigMap.

Injectez automatiquement toutes les clés du ConfigMap :

deployment-envfrom.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: nginx
envFrom:
- configMapRef:
name: app-settings

Chaque clé du ConfigMap devient une variable d’environnement :

Fenêtre de terminal
kubectl exec deploy/myapp -- env | grep -E 'APP_|LOG_|MAX_'
Sortie
APP_ENV=production
LOG_LEVEL=info
MAX_CONNECTIONS=100

Pour des fichiers de configuration complets :

deployment-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
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-config

Le fichier /etc/nginx/conf.d/nginx.conf contient le contenu du ConfigMap.

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 :

Fenêtre de terminal
# Modifier le ConfigMap
kubectl patch configmap app-settings --type merge -p '{"data":{"APP_ENV":"staging"}}'
# La variable dans le Pod garde l'ancienne valeur
kubectl exec deploy/myapp -- printenv APP_ENV
# Affiche : production (pas staging !)

Solution : redémarrer les Pods

Fenêtre de terminal
kubectl rollout restart deployment myapp

Si vous utilisez subPath pour monter un fichier spécifique, il n’est jamais mis à jour :

NE SERA PAS MIS À JOUR
volumeMounts:
- name: config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf # ⚠️ Pas de refresh auto

Le fichier garde son contenu initial, même après modification du ConfigMap.

Solution : éviter subPath ou redémarrer le Pod

SE MET À JOUR
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d # Dossier entier, pas subPath

Même pour les volumes sans subPath, la propagation prend jusqu’à 60 secondes (selon le sync period du kubelet).

Fenêtre de terminal
# Modifier le ConfigMap
kubectl patch configmap nginx-config --type merge \
-p '{"data":{"nginx.conf":"server { listen 8080; }"}}'
# Attendre ~60 secondes
sleep 60
# Vérifier la mise à jour
kubectl exec deploy/nginx -- cat /etc/nginx/conf.d/nginx.conf
InjectionMise à jour auto ?Action requise
env / envFromNonkubectl rollout restart
VolumeOui (~60s)Attendre ou restart
Volume + subPathNonkubectl rollout restart

En production, marquez vos ConfigMaps comme immutables pour :

  • Empêcher les modifications accidentelles
  • Améliorer les performances (Kubernetes ne surveille plus les changements)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-settings-v1
data:
APP_ENV: production
immutable: true

Un 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 :

Fenêtre de terminal
kubectl patch configmap app-settings-v1 --type merge -p '{"data":{"APP_ENV":"staging"}}'
Sortie
The ConfigMap "app-settings-v1" is invalid: data: Forbidden: field is immutable when `immutable` is set

Workflow avec ConfigMaps immutables :

  1. Créer un nouveau ConfigMap avec un nom versionné (ex: app-settings-v2)
  2. Mettre à jour le Deployment pour pointer vers le nouveau ConfigMap
  3. Supprimer l’ancien ConfigMap quand il n’est plus utilisé
Bon
myapp-config
nginx-config-prod
database-settings
À éviter
config1
test-config
temp-settings

Un ConfigMap par environnement, dans son namespace :

Fenêtre de terminal
kubectl create configmap myapp-config -n production --from-file=config.yaml
kubectl create configmap myapp-config -n staging --from-file=config-staging.yaml

Un ConfigMap ne peut pas dépasser 1 Mo. Pour des fichiers volumineux, utilisez un PersistentVolume ou une ConfigMap par fichier.

Stockez vos ConfigMaps en YAML dans Git pour tracer les changements et permettre les rollbacks.

  1. Le ConfigMap existe-t-il ?

    Fenêtre de terminal
    kubectl get configmap app-settings

    Si “NotFound”, créez-le d’abord.

  2. 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é.

  3. Le Pod référence-t-il le bon ConfigMap ?

    Fenêtre de terminal
    kubectl describe pod myapp-xxx | grep -A5 "Environment\|Mounts"
  4. Le Pod a-t-il redémarré après modification ?

    Pour les variables d’environnement, un rollout restart est nécessaire.

ErreurCauseSolution
CreateContainerConfigErrorConfigMap ou clé introuvableVérifier le nom et la clé
Variable videClé mal orthographiéekubectl describe cm pour vérifier
Fichier non mis à joursubPath utiliséÉviter subPath ou restart

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80% requis

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

  1. Un ConfigMap stocke la configuration non sensible sous forme de paires clé-valeur
  2. Trois méthodes d’injection : env, envFrom, volume
  3. Les variables d’environnement ne sont jamais rafraîchies sans redémarrer le Pod
  4. Les volumes se mettent à jour automatiquement (~60s), sauf avec subPath
  5. Utiliser immutable: true en production pour éviter les modifications accidentelles
  6. Pour les données sensibles, utilisez un Secret

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn