Gestion des Configurations avec ConfigMap dans Kubernetes

Le ConfigMap est une API essentielle introduite dans Kubernetes v1.2, conçue pour dissocier la confiugration des applications de leur code. Il permet de gérer les informations de configuration, qu'elles proviennent de fichiers, d'arguments de ligne de commande ou de variables d'environnement, en les injectant dans les conteneurs. ConfigMap peut stocker des paires clé-valeur simples, des fichiers de configuration entiers ou même des objets binaires volumineux comme des JSON.

Création de ConfigMaps

  1. À partir d'un répertoire Cette méthode utilise l'option --from-file pointant vers un répertoire. Tous les fichiers de ce répertoire seront créés comme des entrées distinctes dans le ConfigMap, où le nom du fichier devient la clé et le contenu du fichier devient la valeur.
# Créer un répertoire et des fichiers de configuration exemple
mkdir config-files
cd config-files

cat << EOF > app.properties
database.url=jdbc:mysql://localhost:3306/mydb
database.username=admin
database.pool.size=10
EOF

cat << EOF > api.json
{
  "rateLimit": {
    "enabled": true,
    "requestsPerMinute": 100
  }
}
EOF

cd ..

# Créer le ConfigMap à partir du répertoire
kubectl create configmap app-config --from-file=./config-files

Après la création, vous pouvez inspecter le ConfigMap :

kubectl get configmap app-config
kubectl describe configmap app-config

Le résultat de describe montrera que app.properties et api.json sont maintenant des clés dans le ConfigMap app-config, contenant respectivement leur contenu.

  1. À partir d'un fichier spécifique Utilisez --from-file suivi du chemin du fichier pour créer une entrée spécifique dans le ConfigMap.
# Créer un autre fichier
echo "feature.flag.newUI=true" > feature.flags

# Créer un ConfigMap à partir de ce fichier
kubectl create configmap feature-flags --from-file=feature.flags

Vous pouvez spécifier plusieurs fichiers en utilisant plusieurs options --from-file, ce qui aura le même effet que de pointer vers un répertoire.

  1. À partir de valeurs littérales Pour injecter des configurations directement sous forme de chaînes de caractères, utilisez l'potion --from-literal. Cette option peut être répétée pour ajouter plusieurs paires clé-valeur.
kubectl create configmap app-settings --from-literal=logLevel=INFO --from-literal=environment=production

Alternativement, vous pouvez définir un ConfigMap via un fichier manifeste YAML :

apiVersion: v1
kind: ConfigMap
metadata:
  name: deployment-vars
data:
  replicas: "3"
  region: "us-east-1"

kubectl apply -f deployment-vars.yaml

Utilisation de ConfigMaps dans les Pods

  1. Comme variables d'environnement Les ConfigMaps peuvent injecter des valeurs dans les conteneurs sous forme de variables d'environnement.
apiVersion: v1
kind: Pod
metadata:
  name: config-env-pod
spec:
  containers:
  - name: app-container
    image: nginx:latest # Remplacez par votre image applicative
    env:
      # Injection d'une clé spécifique du ConfigMap comme variable d'environnement
    - name: APP_LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: app-config # Nom du ConfigMap
          key: logLevel    # Clé à extraire
      # Injection de toutes les clés d'un ConfigMap comme variables d'environnement
    envFrom:
    - configMapRef:
        name: deployment-vars # Nom du ConfigMap
  restartPolicy: Never

Après avoir appliqué ce manifeste et vérifié les logs du pod (en supposant que votre image exécute une commande pour afficher les variables d'environnement), vous verrez les variables injectées.

  1. Comme volumes montés Les ConfigMaps peuvent être montés comme des volumes dans les Pods, rendant les fichiers de configuration accessibles directement dans le système de fichiers du conteneur.
apiVersion: v1
kind: Pod
metadata:
  name: config-volume-pod
spec:
  containers:
  - name: app-container
    image: nginx:latest # Remplacez par votre image applicative
    volumeMounts:
    - name: config-data
      mountPath: /etc/app-config # Chemin où le ConfigMap sera monté
  volumes:
  - name: config-data
    configMap:
      name: app-config # Nom du ConfigMap à monter
  restartPolicy: Never

Une fois le pod démarré, vous pouvez executer dans le conteneur et lister le contenu de /etc/app-config. Vous y trouverez les fichiers app.properties et api.json (ou les clés créées si vous utilisez d'autres types de ConfigMaps).

# Exemple pour un ConfigMap créé à partir de valeurs littérales, où les clés deviennent des noms de fichiers
kubectl exec <pod-name> -- ls /etc/app-config
# Exemple : cat /etc/app-config/logLevel

Mise à jour des Configurations (Rolling Update) Kubernetes permet de mettre à jour les ConfigMaps sans interrompre les Pods existants. Lorsqu'un ConfigMap monté en volume est mis à jour, les fichiers correspondants dans le volume du Pod sont mis à jour après un court délai (généralement quelques secondes).

# Créer un ConfigMap initial avec un fichier HTML
echo "<h1>Version 1</h1>" > index.html
kubectl create configmap nginx-content --from-file=index.html

# Créer un Deployment qui utilise ce ConfigMap comme volume
# (Manifeste simplifié pour l'exemple)
# ... [Déploiement utilisant nginx-content et le montant dans /usr/share/nginx/html] ...
# kubectl apply -f deployment.yaml

# Vérifier le contenu accédé via l'IP du service ou du NodePort
# curl http://<node-ip>:<node-port>/index.html

# Mettre à jour le fichier et le ConfigMap
echo "<h1>Version 2 - Mise à jour</h1>" > index.html
kubectl delete configmap nginx-content
kubectl create configmap nginx-content --from-file=index.html

# Attendre quelques secondes, puis tester à nouveau l'accès.
# Vous devriez voir "Version 2 - Mise à jour".

Notez que les Pods utilisant les ConfigMaps comme variables d'environnement ne seront pas mis à jour automatiquement. Pour refléter ces changements, les Pods devront être redémarrés.

Étiquettes: kubernetes ConfigMap Gestion de configuration YAML Variables d'environnement

Publié le 8 juillet à 05h30