Configmaps

Les configmaps permettent de spécifier des petites données de configuration sans avoir à monter un volume spécifique.

Ces données sont sockées sous la forme de clés/valeur dans un fichier.

Elles peuvent ensuite être récupérées par le Pod en tant que variable d’environnement ou dans un répertoire.

Limitations :

  • Pas de chiffrement : Ne pas mettre d’information sensible, utiliser les secrets Kubernetes pour ça
  • Taille : Une donnée est limitée à 1Mo

Exemple de données stockées en configmap

Un exemple avec différents types de données :

# my-configs.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configs
data:
  # Les données sont stockées sous la forme clé: valeur
  my-string: "Hello World"
  my-number: "123"
  my-boolean: "true"
  my-multiline-value: |
    Here you can store multiline configs
    like little config files
    but the limit is 1MB
  my-list: |
    - first
    - second
    - third

On l’applique avec kubectl

k apply -f my-configs.yaml

Et on regarde si on voit bien les données :

k get configmap my-configs
k describe configmap my-configs
k get configmap my-configs -o jsonpath='{.data.my-list}'

Utilisation de configmap dans un Pod

Il y a deux méthodes pour voir les données dans le Pod :

  • Monter un volume dans un répertoire du Pod
  • Passer les secrets en variable d’environnement

Avec un volume :

# pod-config-vars.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-pod
      image: ubuntu
      command: ["sleep", "infinity"]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-configs
  restartPolicy: Never

Dans le pod, on peut voir les valeurs dans /etc/config :

k exec -it test-pod -- ls /etc/config
k exec -it test-pod -- cat /etc/config/my-string

Avec des variables d’environnement :

# pod-env-vars.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-pod
      image: ubuntu
      command: ["sleep", "infinity"]
      env:
        - name: CONFIG_STRING
          valueFrom:
            configMapKeyRef:
              name: my-configs
              key: my-string
        - name: CONFIG_NUMBER
          valueFrom:
            configMapKeyRef:
              name: my-configs
              key: my-number

Dans le pod, on peut voir les secrets en affichant les variables d’environnement :

k exec my-pod -- env |grep CONFIG_

Secrets

Les secrets fonctionnent sur le même principe que les configsmaps mais ils sont stockés de manière chiffrée. De plus, quand Kubernetes, les affiche c’est en Base64.

Création et manipulation de secrets

Créer simplement un secret en CLI

kubectl create secret generic my-secret \
 --from-literal=username=admin \
 --from-literal=password='chiefee4Aitaiphi'

Ou avec un fichier Yaml :

D’abord on récupère les données en base64 :

echo "admin" | base64 # Donne YWRtaW4K
echo "chiefee4Aitaiphi" | base64 # Donne Q29oVzlFaW1pZWo3dmFpNwo=

Puis on les écrit dans le fichier Yaml

# mysecret.yaml
apiVersion: v1
kind: Secret
metadata:  
  name: my-secret
type: Opaque
data:
  # A injecter en Base64
  username: YWRtaW4K
  password: Q29oVzlFaW1pZWo3dmFpNwo=

Et on injecte le fichier :

k apply -f mysecret.yaml

On peut ensuite les voir (en base64) :

k get secrets my-secret
k describe secrets/my-secret
k get secrets my-secret -o jsonpath='{.data}'

Reste à décoder la donnée en base64

echo "[donnée en base64]" |base64 -d

Utilisation de secrets dans un Pod

Il y a deux méthodes pour voir les secrets dans le Pod :

  • Monter un volume dans un répertoire du Pod
  • Passer les secrets en variable d’environnement

Avec un volume :

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-pod
      image: ubuntu
      command: ["sleep", "infinity"]
      volumeMounts:
        - name: my-secret
          mountPath: "/etc/my-secret"
          readOnly: true
  volumes:
    - name: my-secret
      secret:
        secretName: my-secret

Dans le pod, on peut voir les secrets dans /etc/my-secret :

k exec -it test-pod -- cat /etc/my-secret/username /etc/my-secret/password

Avec des variables d’environnement :

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: ubuntu
    command: ["sleep", "infinity"]
    env: 
      - name: SECRET_USERNAME 
        valueFrom: 
          secretKeyRef: 
            name: my-secret 
            key: username 
      - name: SECRET_PASSWORD 
        valueFrom: 
          secretKeyRef: 
            name: my-secret 
            key: password

Dans le pod, on peut voir les secrets en affichant les variables d’environnement :

k exec -it test-pod -- env |grep SECRET_
# echo $SECRET_USERNAME $SECRET_PASSWORD