Aide-mémoire5 min de lecture

Manifestes YAML Kubernetes : référence rapide pour développeurs

SFEIR Institute

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
ChampDescriptionObligatoire
apiVersionVersion de l'API KubernetesOui
kindType de ressourceOui
metadata.nameNom unique dans le namespaceOui
metadata.labelsPaires clé-valeur pour le filtrageNon
specConfiguration de la ressourceOui
À 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égieUsageParamètres
RollingUpdateZero-downtime (défaut)maxSurge, maxUnavailable
RecreateStateful apps, incompatibilité versionsAucun
À 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

TypeAccessibilitéCas d'usage
ClusterIPInterne cluster uniquementCommunication inter-services
NodePortIP_Node:30000-32767Tests, accès direct
LoadBalancerIP externe (cloud)Production, trafic externe
ExternalNameAlias DNSServices 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
pathTypeComportement
Prefix/api matche /api, /api/users, /api/v1
Exact/api matche uniquement /api
ImplementationSpecificDé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.