La configuration via ConfigMap & Secret
Pourquoi utiliser ConfigMap et Secret ?
Type | Usage | Contenu |
---|---|---|
ConfigMap | Stocke des données non sensibles | Variables d’environnement, fichiers de config, flags |
Secret | Stocke 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