Kubernetes - Les configMaps

Le manifest d’un pod permet de positionner des variables d’environnements.

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
spec:
  containers:
  - name: simple-webapp-color
    image: mmumshad/simple-webapp-color
    ports:
      - containerPort: 8080
    env:
      - name: APP_COLOR
        value: blue
      - name: APP_MODE
        value: prod

Une bonne pratique est d’externaliser cette configuration, une configMap permet cela dans kubernetes.

Création d’une configMap

Via un manifest configMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: color-configmap
data:
  APP_COLOR: red
  APP_MODE: dev

Via la CLI

kubectl create configmap <config-name> --from-literal=<key>=<value>

kubectl create configmap color-configmap-cli --from-literal=APP_COLOR=red --from-literal=APP_MODE=dev

Via la CLI avec un fichier

file-configmap-def.txt

APP_COLOR=yellow
APP_MODE=staging
kubectl create configmap color-configmap-cli-file --from-file=./file-configmap-def.txt

Utilisation dans un pod

Il existe 2 méthodes pour utiliser un configMap dans un pod

Méthode 1

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color-env-configmap
spec:
  containers:
  - name: simple-webapp-color
    image: mmumshad/simple-webapp-color
    ports:
      - containerPort: 8080
    env:
      - name: APP_COLOR
        valueFrom:
           configMapKeyRef:
             name: color-configmap
             key: APP_COLOR
      - name: APP_MODE
        valueFrom:
           configMapKeyRef:
             name: color-configmap
             key: APP_MODE

Note: on sélectionne les variables que l’on souhaite utiliser.

Méthode 2

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color-envfrom-configmap
spec:
  containers:
  - name: simple-webapp-color
    image: mmumshad/simple-webapp-color
    ports:
      - containerPort: 8080
    envFrom:
      - configMapRef:
          name: color-configmap

Note: plus simple car on référence que la confiMap et on récupère toutes les variables.

configMap

ConfigMap fichier

En plus des variables, les configMaps permettent aussi des fichiers comme un certificat.

kubectl create configmap my-ca-configmap --from-file ca.crt

kubectl get configmap my-ca-configmap -o yaml
apiVersion: v1
kind: ConfigMap
data:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    kL5lkjKsA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
    MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
    DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
    SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
    GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
    AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
    q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
    SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
    Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
    a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
    /PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
    AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
    CCsUos7lBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
    bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
    c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
    VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
    ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
    MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
    Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
    AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
    uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
    wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
    X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
    PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
    KOqkqm57TH2H3eDJAkSnh6/DNFu0Qa==
    -----END CERTIFICATE-----

Note: avec l’option –from-file il est possible de mettre un dossier au lieu d’un fichier pour charger tous les fichiers de ce dossier.

Dans ce cas on n’utilise pas cela comme une variable mais on monte cela dans un volume au niveau du pod.

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color-envfrom-configmap
spec:
  containers:
  - name: simple-webapp-color
    image: mmumshad/simple-webapp-color
    ports:
      - containerPort: 8080
    volumeMounts:
    - name: config-volume      <--- ref au volume
      mounthPath: /etc/certs
  volumes:
    - name: config-volume       <--- nom du volume
      config-Map:
        name: my-ca-configmap  <--- configMap crée précédement

Kubernetes - Les secrets

Les secrets ne sont pas différent des configMaps sauf que le contenu est “masquée à l’affichage” (codé en base64) et peut être un binaire.

Secret à protéger

echo "my-very-secret" | base64
bXktdmVyeS1zZWNyZXQK

Création du secret

apiVersion: v1
data:
  password: bXktdmVyeS1zZWNyZXQK
kind: Secret
metadata:
  name: my-secret

Lister les secrets:

k get secrets
NAME        TYPE                             DATA   AGE
my-secret   Opaque                           1      4s

Voir le contenu:

k get secrets my-secret -o yaml
apiVersion: v1
data:
  password: bXktdmVyeS1zZWNyZXQK
kind: Secret
metadata:
  creationTimestamp: "2024-08-22T21:13:03Z"
  name: my-secret
  namespace: default
  resourceVersion: "41356"
  uid: 673ea79d-2448-4179-b026-1089b952573b
type: Opaque

Valider le secret

echo "bXktdmVyeS1zZWNyZXQK" | base64 -d
my-very-secret

Tout comme les configMaps les secrets peut être utilisé en variable ou fichier (via le volume), il y a même la possibilité de lui donner des droits d’accès sur le fichier.