Comprendre Kubernetes ConfigMaps

Effectué

Dans le référentiel d’applications, il existe un fichier config chargé dans le fichier index.html pour permettre la mise à jour des variables d’environnement sans qu’une build d’image complète soit nécessaire.

Le fichier config ne contient pas d’informations sensibles, il doit simplement être chargé avec le conteneur. Comment le fichier peut-il être monté dans le conteneur sans nécessiter de chiffrement ou d’encodage ?

Comprendre les ConfigMaps

Les ConfigMaps sont les équivalents des secrets. Alors que les secrets fournissent un moyen de stocker et de délivrer des données sensibles, les ConfigMaps sont des objets qui offrent un moyen de stocker des données non sensibles en utilisant la même structure clé-valeur qu’un secret. L’objet ConfigMaps vous autorise à découpler des configurations des images conteneur, ce qui permet à ces images de rester sans état.

Vous créez un ConfigMap pour stocker les données de configuration séparément du code de l’application et de les charger presque de manière similaire à la façon dont nous chargeons des objets Secret dans le pod. Vous pouvez référencer des ConfigMaps uniquement à l’aide d’une variable d’environnement, ou en les montant en tant que fichier dans un volume à l’intérieur du conteneur.

Les ConfigMaps ont une limitation pour la taille des données : vous pouvez stocker jusqu’à 1 Mio de données dans un ConfigMap. La limitation de taille vous permet d’éviter les grands fichiers config complexes, en vous faisant diviser les grandes configurations en blocs plus petits. Avec les ConfigMaps, vous pouvez monter seulement les fichiers config nécessaires dans vos conteneurs, ce qui permet davantage de granularité.

Comme les secrets, les ConfigMaps sont limités à un espace de noms. Vous pouvez accéder à un ConfigMap et le monter uniquement à l’aide des conteneurs présents dans le même espace de noms que celui dans lequel il a été créé.

Les ConfigMaps sont aussi largement utilisés par d’autres outils, comme Helm et les opérateurs Kubernetes, pour stocker et lire des états.

Mises à jour des ConfigMaps

Tous les ConfigMaps qui sont montés en tant que volumes à l’intérieur d’un pod sont automatiquement mis à jour quand leur valeur est modifiée. Cette modification peut ne pas se produire immédiatement en raison de la configuration de Kubelet, mais elle se produit automatiquement ; il n’est par conséquent pas nécessaire de redémarrer le pod.

Lorsqu’un ConfigMap est lié à des variables d’environnement, il n’est pas mis à jour automatiquement. Dans ce cas, il est nécessaire de redémarrer le pod pour que les modifications prennent effet.

Créer et utiliser des ConfigMaps

Vous pouvez créer un ConfigMap en utilisant la même approche que pour le secret : un fichier YAML. La spécification du ConfigMap se fait comme suit :

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-name
  namespace: default
data:
  key-name: "value as key"
  key.name: |
    multi line
    property, called "file-like" values

Vous pouvez référencer les ConfigMaps par une ou plusieurs clés dans la spécification d’un pod ou d’un déploiement, comme dans l’exemple suivant :

apiVersion: v1
kind: Pod
metadata:
  name: configmap-as-env
  namespace: default
spec:
  containers:
    - name: configmap-env
      image: alpine
      command: ["sleep", "3600"]
      env:
        - name: ENVIRONMENT_VARIABLE_NAME
          valueFrom:
            configMapKeyRef:
              name: configmap-name
              key: key-name

Vous pouvez également les monter en tant que fichiers à l’intérieur du pod à l’aide de volumes en lecture seule, comme dans l’exemple suivant :

apiVersion: v1
kind: Pod
metadata:
  name: configmap-as-env
  namespace: default
spec:
  containers:
    - name: configmap-env
      image: alpine
      command: ["sleep", "3600"]
      volumeMounts:
      - name: volume-name
        mountPath: "/path/to/mount"
        readOnly: true
  volumes:
    - name: volume-name
      configMap:
        name: configmap-name
        items:
        - key: "key-name"
          path: "path/to/mount/the/key"

Contrôle des connaissances

1.

Pourquoi utiliser des ConfigMaps ?

2.

Comment pouvez-vous utiliser des ConfigMaps dans une application ?

3.

L’espace de noms est-il une limitation pour les ConfigMaps ?