Aller au contenu principal

Chapitre 5.1 - ConfigMaps

Objectifs d'Apprentissage

À la fin de ce chapitre, vous serez capable de:

  • Comprendre ce qu'est un ConfigMap et pourquoi l'utiliser
  • Créer des ConfigMaps de différentes manières
  • Utiliser des ConfigMaps dans vos Pods
  • Séparer la configuration du code applicatif
  • Appliquer les bonnes pratiques pour les ConfigMaps

Introduction

Dans le développement d'applications, la configuration change souvent selon l'environnement (développement, staging, production). Hardcoder la configuration dans le code ou dans les images Docker n'est pas une bonne pratique.

Les ConfigMaps permettent de séparer la configuration du code applicatif.


Qu'est-ce qu'un ConfigMap?

Un ConfigMap est un objet Kubernetes qui stocke des données de configuration non sensibles sous forme de paires clé-valeur. Ces données peuvent être utilisées par les Pods comme variables d'environnement, arguments de commande, ou fichiers de configuration.


Pourquoi Utiliser des ConfigMaps?

Problèmes Sans ConfigMaps

Problèmes:

  • Configuration hardcodée dans le code
  • Besoin de rebuild l'image pour changer la config
  • Difficile de gérer différents environnements
  • Pas de séparation des préoccupations

Avantages Avec ConfigMaps

Avantages:

  • Configuration séparée du code
  • Pas besoin de rebuild l'image
  • Facile de gérer plusieurs environnements
  • Réutilisable entre plusieurs Pods

Création de ConfigMaps

Méthode 1: Depuis des Littéraux

kubectl create configmap app-config \
--from-literal=database_url=postgresql://localhost:5432/mydb \
--from-literal=log_level=info \
--from-literal=max_connections=100

Méthode 2: Depuis un Fichier

Créer un fichier config.properties:

database_url=postgresql://localhost:5432/mydb
log_level=info
max_connections=100
kubectl create configmap app-config --from-file=config.properties

Méthode 3: Depuis un Fichier YAML

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
database_url: "postgresql://localhost:5432/mydb"
log_level: "info"
max_connections: "100"
# Fichier complet
application.properties: |
server.port=8080
server.host=0.0.0.0
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb

Utilisation dans les Pods

Méthode 1: Variables d'Environnement (Une Clé)

apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database_url
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level

Méthode 2: Toutes les Clés (envFrom)

apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- configMapRef:
name: app-config

Résultat: Toutes les clés du ConfigMap deviennent des variables d'environnement.

Méthode 3: Comme Volume (Fichiers)

apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: config
configMap:
name: app-config

Résultat: Chaque clé devient un fichier dans /etc/config/ avec la valeur comme contenu.


Exemple Complet

Étape 1: Créer le ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
name: webapp-config
data:
# Variables simples
APP_NAME: "My Web Application"
APP_VERSION: "1.0.0"
ENVIRONMENT: "production"

# Fichier de configuration
nginx.conf: |
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
index index.html;
}

Étape 2: Utiliser dans un Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:1.20
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: webapp-config
key: APP_NAME
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: webapp-config
key: ENVIRONMENT
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: nginx-config
configMap:
name: webapp-config
items:
- key: nginx.conf
path: default.conf

Cas d'Usage

1. Configuration d'Application

apiVersion: v1
kind: ConfigMap
metadata:
name: app-settings
data:
database_host: "db.example.com"
database_port: "5432"
cache_ttl: "3600"
feature_flags: "feature1,feature2"

2. Fichiers de Configuration

apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
}

3. Scripts

apiVersion: v1
kind: ConfigMap
metadata:
name: init-scripts
data:
init.sh: |
#!/bin/bash
echo "Initializing application..."
/app/setup.sh
exec /app/start.sh

Bonnes Pratiques

1. Organisation par Environnement

Créer des ConfigMaps séparés pour chaque environnement:

# Développement
kubectl create configmap app-config-dev --from-file=config-dev.properties

# Production
kubectl create configmap app-config-prod --from-file=config-prod.properties

2. Versioning

Utiliser des labels pour versionner:

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
labels:
version: v1
environment: production
data:
# ...

3. Ne Pas Stocker de Données Sensibles

Ne jamais mettre dans un ConfigMap:

  • Mots de passe
  • Tokens d'API
  • Clés privées
  • Certificats

Utiliser des Secrets à la place.


Commandes Utiles

Voir un ConfigMap

kubectl get configmap app-config
kubectl describe configmap app-config
kubectl get configmap app-config -o yaml

Modifier un ConfigMap

kubectl edit configmap app-config

Note: Les Pods existants ne verront pas les changements immédiatement. Il faut les redémarrer.

Supprimer un ConfigMap

kubectl delete configmap app-config

Limitations

Taille Maximale

  • 1 MiB par entrée dans un ConfigMap
  • Total limité par etcd (généralement ~1.5 MiB par objet)

Mise à Jour

  • Variables d'environnement: Ne changent pas sans redémarrer le Pod
  • Volumes: Mis à jour périodiquement (délai de quelques secondes)

Résumé

Dans ce chapitre, vous avez appris:

ConfigMap: Objet Kubernetes pour stocker la configuration non sensible
Création: kubectl create, YAML, depuis fichiers
Utilisation: Variables d'environnement (env/envFrom) ou volumes
Avantages: Séparation config/code, flexibilité, réutilisabilité
Bonnes pratiques: Organisation par environnement, versioning, pas de secrets
Limitations: Taille maximale, mise à jour nécessite redémarrage pour env vars


Prochaines Étapes

Chapitre 5.2: Secrets - Gestion des données sensibles
Lab 5.1: Création et Utilisation de ConfigMaps


Chapitre créé le: Décembre 2024