La configuration via ConfigMap & Secret

La configuration via ConfigMap & Secret

Pourquoi utiliser ConfigMap et Secret ?

TypeUsageContenu
ConfigMapStocke des données non sensiblesVariables d’environnement, fichiers de config, flags
SecretStocke des données sensibles (encodé en base64)Mots de passe, clés API, certificats
  • Facilite la modification de la configuration sans modifier le déploiement.
  • Sépare la configuration des images (bonnes pratiques DevOps). Permet de modifier les valeurs sans redéployer le pod, en mettant simplement à jour le ConfigMap.
  • Sécurise les informations sensibles avec Secret.
  • Réutilisation : Si plusieurs pods utilisent ces mêmes variables, un ConfigMap évite la duplication des valeurs dans plusieurs manifestes.

Exemple de ConfigMap Postgresql

configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  namespace: default
data:
  POSTGRES_DB: "mydatabase"
  POSTGRES_USER: "dbuser"
  POSTGRES_HOST: "postgres-service"
  POSTGRES_PORT: "5432"
  MAX_CONNECTIONS: "100"
  TIMEZONE: "UTC"

Exemple d’un Secret Postgresql

secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
  namespace: default
type: Opaque
data:
  POSTGRES_PASSWORD: TW9uU3VwZXJNb3REZVBhc3Nl  # "MonSuperMotDePasse" encodé en base64

Encodage Base64 du mot de passe ( ⚠️ ce n’est pas un chiffrement !) :

echo -n "MonSuperMotDePasse" | base64

Pour decoder:

echo "TW9uU3VwZXJNb3REZVBhc3Nl" | base64 --decode

Warning

Kubernetes Secrets n’est PAS chiffré par défaut. Pour vraiment protéger les secrets, il est préférable d’utiliser RBAC, chiffrement KMS, ou un gestionnaire externe comme Vault.

Utilisation dans un Deployment

deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app-image:latest
->        envFrom:        
->          - configMapRef:
->             name: postgres-config
          env:
            - name: POSTGRES_PASSWORD
->           valueFrom:
->            secretKeyRef:
->             name: postgres-secret
->               key: POSTGRES_PASSWORD

Si on souhaite injecter qu’une seule variable et non tout le fichier de variable:

deployment.yml
containers:
  - name: my-app
    image: my-app-image:latest
    env:
      - name: POSTGRES_HOST
        valueFrom:
->        configMapKeyRef:
->          name: db-config
->          key: POSTGRES_HOST

Monter le ConfigMap en fichier

Si PostgreSQL utilise un fichier de configuration (postgresql.conf), il est possible de le stocker dans un ConfigMap et le monter en volume :

deployment.yml
volumes:
  - name: config-volume
    configMap:
      name: postgres-config-file
containers:
  - name: postgres
    image: postgres:latest
    volumeMounts:
      - mountPath: "/etc/postgresql/postgresql.conf"
        subPath: postgresql.conf
        name: config-volume

Cela remplace le fichier /etc/postgresql/postgresql.conf avec la config du ConfigMap.

Warning

L’indentation est très importante en YAML, un espace de trop, et rien ne fonctionne

Dernière modification