Points clés
- ✓Tout manifeste Kubernetes requiert apiVersion, kind, metadata.name et spec
- ✓6 types de ressources couverts : Pod, Deployment, Service, ConfigMap, Secret, Ingress
TL;DR : Ce guide vous donne les templates YAML essentiels pour Pod, Deployment, Service, ConfigMap, Secret et Ingress. Copiez, adaptez, déployez. Chaque bloc inclut les champs obligatoires et les options courantes que vous utiliserez quotidiennement en production.
Cette compétence est au cœur de la formation LFD459 Kubernetes pour développeurs.
Structure de base d'un manifeste
Tout manifeste Kubernetes suit cette structure. Mémorisez-la :
apiVersion: v1|apps/v1|networking.k8s.io/v1
kind: Pod|Deployment|Service|ConfigMap|Secret|Ingress
metadata:
name: mon-ressource # Obligatoire
namespace: default # Optionnel, default si omis
labels: # Recommandé pour le filtrage
app: mon-app
spec:
# Configuration spécifique au kind
| Champ | Description | Obligatoire |
|---|---|---|
apiVersion | Version de l'API Kubernetes | Oui |
kind | Type de ressource | Oui |
metadata.name | Nom unique dans le namespace | Oui |
metadata.labels | Paires clé-valeur pour le filtrage | Non |
spec | Configuration de la ressource | Oui |
À retenir : Vérifiez toujours l'apiVersion avec kubectl api-resources | grep . Les versions changent entre releases Kubernetes.
Pod : unité de base
Vous créez rarement des Pods directement. Préférez les Deployments. Mais voici la syntaxe de référence :
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 3
periodSeconds: 10
Commande rapide : kubectl run nginx --image=nginx:1.27 --dry-run=client -o yaml > pod.yaml
Deployment : gestion déclarative
82% des utilisateurs de conteneurs exécutent Kubernetes en production (CNCF Annual Survey 2025). Vous utiliserez des Deployments dans 90% des cas.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-backend
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: mon-registry/api:v2.1.0
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"
| Stratégie | Usage | Paramètres |
|---|---|---|
RollingUpdate | Zero-downtime (défaut) | maxSurge, maxUnavailable |
Recreate | Stateful apps, incompatibilité versions | Aucun |
À retenir : Toujours définir resources. Sans limites, vos pods peuvent consommer toute la mémoire du node et déclencher des OOMKill.
Pour approfondir le design d'applications conteneurisées, consultez notre guide complet.
Service : exposition réseau
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
type: ClusterIP # ClusterIP | NodePort | LoadBalancer
selector:
app: api # Doit matcher les labels du Pod
ports:
- port: 80 # Port exposé
targetPort: 8080 # Port du conteneur
protocol: TCP
Types de Services
| Type | Accessibilité | Cas d'usage |
|---|---|---|
ClusterIP | Interne cluster uniquement | Communication inter-services |
NodePort | IP_Node:30000-32767 | Tests, accès direct |
LoadBalancer | IP externe (cloud) | Production, trafic externe |
ExternalName | Alias DNS | Services externes |
Vérifiez vos endpoints : kubectl get endpoints api-service
ConfigMap et Secret
ConfigMap pour la configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
config.json: |
{
"feature_flags": {
"new_ui": true
}
}
Secret pour les données sensibles
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
stringData: # En clair, encodé automatiquement
username: admin
password: "p@ssw0rd!"
data: # Base64 pré-encodé
api-key: YXBpLWtleS12YWx1ZQ==
Injection dans un Pod :
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: db-credentials
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
À retenir : Les Secrets ne sont pas chiffrés par défaut. Activez le chiffrement at-rest ou utilisez un gestionnaire externe (Vault, Sealed Secrets).
Consultez les commandes kubectl essentielles pour manipuler vos ConfigMaps et Secrets.
Ingress : routage HTTP
Traefik compte plus de 3.4 milliards de téléchargements (Traefik Labs). 70% des organisations utilisent Helm pour déployer leurs Ingress Controllers (Orca Security 2025).
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
secretName: api-tls
rules:
- host: api.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /v2
pathType: Prefix
backend:
service:
name: api-v2-service
port:
number: 80
| pathType | Comportement |
|---|---|
Prefix | /api matche /api, /api/users, /api/v1 |
Exact | /api matche uniquement /api |
ImplementationSpecific | Dépend du controller |
Pour maîtriser Helm avec vos Ingress, référez-vous à l'aide-mémoire Helm Charts.
Erreurs fréquentes et corrections
Selector mismatch
# ❌ ERREUR : selector ne matche pas template.labels
spec:
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: backend # Doit être "api"
Port confusion
# ❌ ERREUR : targetPort != containerPort
# Service
spec:
ports:
- port: 80
targetPort: 3000 # Le conteneur écoute sur 8080
# Pod
spec:
containers:
- ports:
- containerPort: 8080 # Mismatch!
Resources manquantes
67% des organisations retardent leurs déploiements à cause de problèmes de sécurité Kubernetes (Mend.io). Définissez toujours vos limites.
# ✅ CORRECT : requests et limits définis
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
À retenir : Validez vos manifestes avant déploiement avec kubectl apply --dry-run=server -f manifest.yaml
Commandes de validation rapide
# Vérifier la syntaxe YAML
kubectl apply --dry-run=client -f deployment.yaml
# Valider côté serveur (vérifie les quotas, policies)
kubectl apply --dry-run=server -f deployment.yaml
# Générer un template depuis une commande
kubectl create deployment nginx --image=nginx:1.27 \
--dry-run=client -o yaml > deployment.yaml
# Diff avant application
kubectl diff -f deployment.yaml
# Appliquer avec suivi
kubectl apply -f deployment.yaml && kubectl rollout status deployment/nginx
Pour approfondir le monitoring de vos applications, 75% des équipes utilisent Prometheus et Grafana (Grafana Labs).
Ressources complémentaires
Explorez le guide complet Formation Kubernetes et la section Sécurité Kubernetes pour sécuriser vos manifestes.
Passez à la pratique
Vous voulez maîtriser la création de manifestes YAML en conditions réelles et préparer la certification CKAD ?. Pour approfondir, consultez notre formation Kubernetes ingénieur logiciel. Pour approfondir, consultez notre administrateur système Kubernetes.
- Formation LFD459 Kubernetes pour développeurs : 3 jours pour créer, déployer et gérer des applications sur Kubernetes
- Formation LFS458 Administration Kubernetes : 4 jours pour administrer vos clusters en production
- Kubernetes, les fondamentaux : 1 journée pour découvrir les concepts essentiels