
Configurer ses pods Kubernetes
- Charles Fleury
- Kubernetes
- 30 août 2025
Sommaire
La configuration des pods Kubernetes est un élément clé pour déployer des applications de manière fiable et flexible. Entre les ConfigMaps, les Secrets et l’injection de variables d’environnement, il existe plusieurs façons de transmettre les paramètres nécessaires à vos conteneurs. Bien maîtriser ces mécanismes permet d’éviter les mauvaises pratiques (comme coder en dur des secrets) et d’optimiser le comportement de vos applications, notamment en termes de consommation de ressources.
Les configMaps
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: app-ns # attention les configMaps ne sont visibles que sur le même namespace
data:
APP_NAME: "catalog"
APP_PORT: "8080"
LOG_LEVEL: "info"
kubectl apply -f app-config.yml
Les secrets
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
namespace: app-ns # attention les secrets ne sont visibles que sur le même namespace
type: Opaque
stringData: # pratique en YAML : pas besoin de base64 ici
DB_USER: "catalog_user"
DB_PASS: "S3cr3t!"
kubectl apply -f app-secret.yml
kubectl create secret generic app-secrets \
--from-literal=KEY1=secretValue1 \
--from-literal=KEY2=secretValue2
Injection dans le pod
En bloc avec envFrom
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
spec:
replicas: 1
selector:
matchLabels: { app: catalog }
template:
metadata:
labels: { app: catalog }
spec:
containers:
- name: api
image: ghcr.io/example/catalog:1.0.0
envFrom:
- configMapRef:
name: app-config
# optional: true
- secretRef:
name: app-secrets
# optional: true
ports:
- containerPort: 8080
Au détail avec env[].valueFrom
env:
- name: APP_PORT
valueFrom:
configMapKeyRef:
name: app-config
key: APP_PORT
optional: false
- name: DB_USER
valueFrom:
secretKeyRef:
name: app-secrets
key: DB_USER
- name: DB_PASS
valueFrom:
secretKeyRef:
name: app-secrets
key: DB_PASS
- name: LOG_LEVEL
value: "debug" # valeur explicite qui écrase toute autre source
Règle de priorité
- Les entrées explicites dans env: (avec value ou valueFrom) prennent le dessus sur envFrom.
- Entre plusieurs envFrom, l’ordre compte : les éléments listés après peuvent écraser des clés définies par les éléments listés avant (utile pour définir des valeurs par défaut puis les surcharger avec des secrets).
Les limites de ressources
Mise en place
apiVersion: v1
kind: Pod
metadata:
name: mon-pod
spec:
containers:
- name: mon-container
image: nginx:latest
resources:
requests:
memory: "256Mi" # mémoire minimum garantie
cpu: "250m" # 0.25 vCPU garanti
limits:
memory: "512Mi" # mémoire maximum autorisée
cpu: "500m" # 0.5 vCPU maximum
Explications
Requests
Quantité de ressources que Kubernetes garantit au conteneur.
Sert au scheduler pour placer le Pod sur un nœud disposant des ressources nécessaires.
Limits
Quantité maximale que le conteneur peut consommer. Si le conteneur dépasse :
- CPU : il est limité (throttling).
- Mémoire : il est killé (OOMKilled) par le kernel.
Cas Particuliers: Les Pods Java
Java < 10
Laisser 20–25% de la mémoire pour :
- Metaspace
- Direct buffers (notamment avec Netty, gRPC, etc.)
- Threads (stack memory)
- Overhead du GC
Exemple : si limit.memory = 1Gi, mets -Xmx750m.
Java >= 10
Pour la RAM
Depuis Java 10, la JVM est container-aware grâce à UseContainerSupport. Cela permet à la JVM de détecter la limite mémoire cgroup (Kubernetes) et d’ajuster automatiquement Xmx.
Exemple :
java -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -jar app.jar
Ici, Xmx sera automatiquement fixé à 75% de la limite mémoire du Pod.
Pour le CPU
On peut aussi ajouter une option pour forcer le nombre de threads utilisables en cohérence avec cpu.limits.
java -XX:ActiveProcessorCount -jar app.jar
Sinon, la JVM peut croire qu’elle a accès à tous les cores du nœud, et créer trop de threads ce qui peut mener à une contention.
Conclusion
Configurer correctement vos pods n’est pas seulement une question de syntaxe, mais un véritable levier de stabilité et de performance. En combinant ConfigMaps, Secrets, et bonnes pratiques d’injection, vous obtenez des déploiements reproductibles et sécurisés. Et en ajustant les limites de ressources et les réglages spécifiques (comme pour les applications Java), vous vous assurez que vos services tournent de façon optimale dans tous les environnements.