Retour au cours

configuration et secrets dans kubernetes

Objectifs

  • Comprendre pourquoi la configuration doit être séparée du code de l’application.
  • Créer une ConfigMap pour stocker de la configuration non sensible.
  • Créer un Secret pour stocker des données sensibles (mots de passe, clés d’API).
  • Injecter cette configuration dans vos conteneurs, soit comme variables d’environnement, soit comme fichiers.

Le problème : La configuration “en dur”

Une image Docker doit être immuable et portable. On doit pouvoir utiliser la même image en développement, en staging et en production. Or, la configuration (l’URL d’une base de données, un niveau de log, une clé d’API) change d’un environnement à l’autre.

L’écrire en dur dans le code ou l’image est une très mauvaise pratique. Kubernetes fournit deux objets pour gérer cela proprement : ConfigMap et Secret.

ConfigMap : Pour la configuration non sensible

Une ConfigMap est un objet Kubernetes qui stocke des données de configuration sous forme de paires clé-valeur. C’est l’endroit idéal pour stocker des URLs, des noms de fichiers, des niveaux de log, etc.

Exemple de ConfigMap en YAML

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mon-app-config
data:
  # Les clés sont les noms des paramètres
  DATABASE_HOST: postgres-svc
  LOG_LEVEL: "info"
  # On peut aussi stocker le contenu d'un fichier entier
  config.json: |
    {
      "feature_a_enabled": true,
      "retries": 3
    }

Secret : Pour les données sensibles

Un Secret est très similaire à une ConfigMap, mais il est destiné à stocker des informations sensibles.

  • Les valeurs d’un Secret sont stockées en Base64. Attention : ce n’est PAS du chiffrement, c’est juste un encodage. N’importe qui pouvant lire le Secret peut le décoder.
  • La vraie sécurité des Secrets vient des contrôles d’accès (RBAC) de Kubernetes et de la possibilité de les stocker dans des backends chiffrés (comme Vault).

Exemple de Secret en YAML

# Pour créer la valeur en base64 :
# echo -n 'mon_mot_de_passe_super_secret' | base64
# -> bW9uX21vdF9kZV9wYXNzZV9zdXBlcl9zZWNyZXQ=
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ma-db-secret
type: Opaque # Type par défaut pour des données clé-valeur
data:
  # Les clés sont les noms, les valeurs sont encodées en base64
  POSTGRES_PASSWORD: bW9uX21vdF9kZV9wYXNzZV9zdXBlcl9zZWNyZXQ=

Injecter la configuration dans un Pod

Il existe deux manières principales de fournir les données d’une ConfigMap ou d’un Secret à un conteneur.

1. En tant que variables d’environnement

C’est la méthode la plus simple. Chaque clé dans l’objet devient une variable d’environnement.

# deployment.yaml
# ...
spec:
  containers:
  - name: mon-app
    image: mon-image
    envFrom:
      - configMapRef:
          name: mon-app-config # Injecte toutes les clés de la ConfigMap
      - secretRef:
          name: ma-db-secret   # Injecte toutes les clés du Secret

2. En tant que fichiers montés dans un volume

C’est une méthode plus flexible et souvent recommandée. Kubernetes monte la ConfigMap ou le Secret comme un volume, et chaque clé devient un fichier dans le dossier de montage.

# deployment.yaml
# ...
spec:
  containers:
  - name: mon-app
    image: mon-image
    volumeMounts:
      - name: config-volume
        mountPath: /etc/config # Le dossier dans le conteneur
  volumes:
    - name: config-volume
      configMap:
        name: mon-app-config

Dans cet exemple, le conteneur verra un fichier /etc/config/LOG_LEVEL contenant “info”, un fichier /etc/config/config.json, etc.

Bonnes pratiques

  • Externalisez toujours votre configuration. Une image ne doit contenir que le code.
  • Utilisez des Secrets pour toute information sensible, même si l’encodage base64 n’est pas une sécurité forte en soi. C’est une déclaration d’intention qui permet d’appliquer des politiques de sécurité plus strictes.
  • Préférez monter les configurations comme des fichiers plutôt que des variables d’environnement. Les fichiers peuvent souvent être mis à jour sans avoir à redémarrer l’application.

Exercices

  1. Créez une ConfigMap :

    • Écrivez un fichier YAML pour une ConfigMap nommée mon-test-cm contenant une clé MESSAGE avec la valeur Bonjour Kubernetes.
    • Appliquez-la avec kubectl apply -f ....
    • Vérifiez sa création avec kubectl get configmap mon-test-cm -o yaml.
  2. Injectez en variable d’environnement :

    • Créez un Pod simple (pas un Deployment) qui utilise cette ConfigMap pour définir une variable d’environnement SALUTATION.
    • La commande du conteneur doit être ["/bin/sh", "-c", "echo $SALUTATION && sleep 3600"].
    • Appliquez le Pod, puis utilisez kubectl logs <nom-du-pod> pour vérifier que le message s’affiche.
  3. Nettoyez :

    • Supprimez le Pod et la ConfigMap que vous avez créés avec kubectl delete.