ConfigMaps - Le jumeau non-secret des Secrets#

Dans cette section, vous allez manipuler les ConfigMaps. Ils sont conceptuellement très similaires aux Secrets, mais avec une différence fondamentale : ils sont destinés à stocker des données de configuration non sensibles en clair (et donc versionnables).

ConfigMap vs. Secret

  • ConfigMap : Pour les données de configuration non confidentielles. Les données sont stockées en texte brut et sont facilement lisibles. Idéal pour les fichiers de configuration, les arguments de ligne de commande, etc.

  • Secret : Pour les données sensibles comme les mots de passe, les tokens d’API ou les clés SSH. Les données sont encodées en Base64 (ce qui n’est pas un chiffrement).

ConfigMap - manipulation#

Création d’un ConfigMap via un manifest YAML#

Créez un fichier my-configmap.yaml avec le contenu suivant :

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
data:
  # Clé-valeur simple
  app.environment: "production"
  # Contenu de type fichier
  app.config.properties: |
    feature.x.enabled=true
    feature.y.enabled=false
    log.level=info

Appliquez ensuite ce manifest pour créer le ConfigMap :

kubecl apply -f my-configmap.yaml

Exercice : Vérification et utilisation#

  1. Affichez le contenu du ConfigMap au format YAML et observez que les données sont en clair.

    kubectl get configmap my-app-config -o yaml
    
  2. Utilisez le ConfigMap pour injecter des variables d’environnement dans un Pod. Créez un fichier pod-with-configmap-env.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-with-configmap-env
    spec:
      containers:
      - name: my-container
        image: ubuntu:22.04
        command: [ "/bin/sh", "-c", "env && sleep 3600" ]
        envFrom:
        - configMapRef:
            name: my-app-config
      restartPolicy: Never
    
  3. Appliquez le manifest et vérifiez les logs du Pod pour voir les clés du ConfigMap en tant que variables d’environnement.

    kubectl apply -f pod-with-configmap-env.yaml
    kubectl logs pod-with-configmap-env
    
  4. Montez le ConfigMap en tant que volume. Créez pod-with-configmap-volume.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-with-configmap-volume
    spec:
      containers:
      - name: my-container
        image: ubuntu:22.04
        command: [ "/bin/sh", "-c", "sleep 3600" ]
        volumeMounts:
        - name: config-volume
          mountPath: "/etc/config"
      volumes:
      - name: config-volume
        configMap:
          name: my-app-config
    
  5. Appliquez-le, puis listez et lisez les fichiers dans le Pod pour voir comment chaque clé du ConfigMap est devenue un fichier.

    kubectl apply -f pod-with-configmap-volume.yaml
    kubectl exec -it pod-with-configmap-volume -- ls /etc/config
    kubectl exec -it pod-with-configmap-volume -- cat /etc/config/app.config.properties
    

Exercice : Créer un Helm Chart avec un ConfigMap#

En vous basant sur les connaissances acquises précédemment, vous allez créer un nouveau Helm Chart de zéro qui déploie une application et sa configuration via un ConfigMap.

Objectif#

  • Créer un Helm Chart qui déploie un ConfigMap et un Pod.

  • Le ConfigMap contiendra une variable MESSAGE définie dans le fichier values.yaml.

  • Le Pod utilisera l’image jrobert2/demok8senv et affichera la valeur de la variable d’environnement DEMOK8S, qui sera tirée du ConfigMap.

Structure du Chart#

Créez l’arborescence suivante :

monchart-cm/
├── Chart.yaml
├── values.yaml
└── templates/
    ├── configmap.yaml
    └── pod.yaml

Contenu des fichiers#

  1. Chart.yaml

    apiVersion: v2
    name: monchart-cm
    description: Un chart pour déployer une app avec un ConfigMap.
    type: application
    version: 0.1.0
    appVersion: "1.0.0"
    
  2. values.yaml

    config:
      message: "Bonjour depuis un ConfigMap Helm!"
    
  3. templates/configmap.yaml

    Ici, on crée le ConfigMap en utilisant la valeur de config.message.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-configmap
    data:
      DEMOK8S: "{{ .Values.config.message }}"
    
  4. templates/pod.yaml

    Ce Pod va charger ses variables d’environnement depuis le ConfigMap que nous venons de définir.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
        - name: demokenv-container
          image: "jrobert2/demok8senv:1.0.0"
          envFrom:
            - configMapRef:
                name: my-configmap
    

Test et Déploiement#

  1. Testez le rendu du template : Depuis le dossier monchart-cm, exécutez :

    helm template .
    

    Vérifiez que le ConfigMap contient bien le message du values.yaml et que le Pod référence correctement le nom du ConfigMap.

  2. Déployez le chart : Installez le chart avec Argo CD.

  3. Vérifiez les logs du pod pour vous assurer que le message s’affiche correctement.

  4. Nettoyez en désinstallant l’application dans Argo CD.