
Produire des manifests Kubernetes rapidement, c’est savoir générer un
squelette avec kubectl, le compléter avec les bons champs, et valider avant
d’appliquer. Ce guide vous donne les réflexes CKAD : kubectl explain,
--dry-run=client -o yaml, correction rapide, et validation côté serveur.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Workflow examen : générer → compléter → valider → appliquer
- Deux approches : génération assistée vs écriture manuelle
- Namespace et contexte : éviter les erreurs de cible
- Snippets fréquents :
resources, probes,command,envFrom - Correction rapide :
kubectl edit,kubectl patch - Validation complète :
--dry-run=client,--dry-run=server,kubectl diff
Prérequis
Section intitulée « Prérequis »- Un cluster Kubernetes fonctionnel : K3s, Kind, ou Minikube
- kubectl installé et configuré
- Connaissance de base de la syntaxe YAML
Workflow CKAD : produire vite
Section intitulée « Workflow CKAD : produire vite »En examen, chaque seconde compte. Voici le workflow le plus efficace :
-
Configurer le namespace de travail
Fenêtre de terminal kubectl create namespace ckadkubectl config set-context --current --namespace=ckadEn changeant le namespace courant, vous évitez de répéter
-nà chaque commande. -
Générer un squelette
Fenêtre de terminal kubectl create deployment web --image=nginx:stable --dry-run=client -o yaml > web.yaml -
Compléter le manifest
Fenêtre de terminal vim web.yamlAjoutez les champs manquants :
resources, probes, labels… -
Valider avant application
Fenêtre de terminal kubectl apply --dry-run=client -f web.yamlkubectl diff -f web.yaml # si la ressource existe déjà -
Appliquer et vérifier
Fenêtre de terminal kubectl apply -f web.yamlkubectl get allkubectl describe deploy web
Deux approches pour produire un manifest
Section intitulée « Deux approches pour produire un manifest »Génération assistée par kubectl
Section intitulée « Génération assistée par kubectl »Utile pour : gagner du temps, éviter les erreurs de base, partir d’un squelette valide.
kubectl create deployment web --image=nginx:stable --dry-run=client -o yaml > web.yamlLe YAML généré est un squelette. Vous devez presque toujours l’ajuster : labels, ports, resources, probes…
Écriture manuelle
Section intitulée « Écriture manuelle »Utile pour : comprendre la structure, corriger un YAML existant, maîtriser les champs importants.
Quand vous connaissez bien la structure, vous pouvez écrire directement. Mais en examen, la génération assistée reste plus rapide.
Structure d’un Manifest Kubernetes
Section intitulée « Structure d’un Manifest Kubernetes »Kubernetes utilise un langage déclaratif : vous décrivez l’état souhaité, et Kubernetes se charge de l’atteindre. Chaque manifest YAML suit une structure commune avec quatre champs obligatoires.
Les quatre champs essentiels
Section intitulée « Les quatre champs essentiels »apiVersion: v1kind: Podmetadata: name: web namespace: ckad labels: app: nginxspec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80| Champ | Description | Exemples |
|---|---|---|
apiVersion | Version de l’API Kubernetes | v1, apps/v1, networking.k8s.io/v1 |
kind | Type de ressource | Pod, Deployment, Service, ConfigMap |
metadata | Identité de l’objet | name, namespace, labels, annotations |
spec | Spécification détaillée | Varie selon le kind |
Namespace et contexte courant
Section intitulée « Namespace et contexte courant »Créer et utiliser un namespace
Section intitulée « Créer et utiliser un namespace »# Créer le namespacekubectl create namespace monprojet
# Définir comme namespace courantkubectl config set-context --current --namespace=monprojet
# Vérifier le contexte actuelkubectl config get-contextsPourquoi c’est important
Section intitulée « Pourquoi c’est important »| Problème | Conséquence | Solution |
|---|---|---|
Oublier -n | Ressource créée dans default | Changer le namespace courant |
| Mauvais namespace | Ressource introuvable | kubectl get pods -A pour chercher |
| ConfigMap/Secret ailleurs | not found au démarrage du Pod | Créer dans le même namespace |
Explorer l’API avec kubectl
Section intitulée « Explorer l’API avec kubectl »Découvrir les ressources disponibles
Section intitulée « Découvrir les ressources disponibles »kubectl api-resources | head -15NAME SHORTNAMES APIVERSION NAMESPACED KINDconfigmaps cm v1 true ConfigMapnamespaces ns v1 false Namespacepods po v1 true Podsecrets v1 true Secretservices svc v1 true Servicedeployments deploy apps/v1 true DeploymentCette commande liste tous les types de ressources avec leur abréviation,
leur apiVersion et si elles sont namespacées.
Explorer la structure avec kubectl explain
Section intitulée « Explorer la structure avec kubectl explain »kubectl explain documente chaque champ directement depuis le cluster :
kubectl explain pod.spec.containersKIND: PodVERSION: v1
FIELD: containers <[]Container>
DESCRIPTION: List of containers belonging to the pod.
FIELDS: args <[]string> command <[]string> env <[]EnvVar> image <string> name <string> -required- ports <[]ContainerPort> resources <ResourceRequirements> ...Générer des manifests avec —dry-run
Section intitulée « Générer des manifests avec —dry-run »Au lieu d’écrire un YAML de zéro, générez-le avec --dry-run=client -o yaml :
kubectl run web --image=nginx:stable --dry-run=client -o yamlapiVersion: v1kind: Podmetadata: labels: run: web name: webspec: containers: - image: nginx:stable name: web restartPolicy: Alwayskubectl create deployment web --image=nginx:stable --replicas=3 \ --dry-run=client -o yamlapiVersion: apps/v1kind: Deploymentmetadata: labels: app: web name: webspec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - image: nginx:stable name: nginxkubectl expose deployment web --port=80 --target-port=80 \ --dry-run=client -o yamlapiVersion: v1kind: Servicemetadata: labels: app: web name: webspec: ports: - port: 80 targetPort: 80 selector: app: webNote : kubectl expose récupère automatiquement les labels du Deployment.
C’est plus fiable que kubectl create service qui utilise son propre label.
kubectl create configmap app-config --from-literal=APP_ENV=production \ --dry-run=client -o yamlapiVersion: v1data: APP_ENV: productionkind: ConfigMapmetadata: name: app-configkubectl create secret generic db-creds --from-literal=password=secret \ --dry-run=client -o yamlapiVersion: v1data: password: c2VjcmV0kind: Secretmetadata: name: db-credsSnippets fréquents (à connaître par cœur)
Section intitulée « Snippets fréquents (à connaître par cœur) »Ces champs reviennent constamment en CKAD. Gardez-les en mémoire.
command et args
Section intitulée « command et args »containers:- name: app image: busybox:1.36 command: ["sh", "-c"] args: ["echo hello && sleep 3600"]Variables d’environnement simples
Section intitulée « Variables d’environnement simples »env:- name: APP_ENV value: production- name: APP_DEBUG value: "false"envFrom (injecter toute une ConfigMap)
Section intitulée « envFrom (injecter toute une ConfigMap) »envFrom:- configMapRef: name: app-configresources (requests et limits)
Section intitulée « resources (requests et limits) »resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"readinessProbe et livenessProbe
Section intitulée « readinessProbe et livenessProbe »readinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 5 periodSeconds: 10
livenessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 15 periodSeconds: 20ports:- containerPort: 80 name: http- containerPort: 443 name: httpsvolumeMounts et volumes (ConfigMap)
Section intitulée « volumeMounts et volumes (ConfigMap) »containers:- name: app image: nginx:stable volumeMounts: - name: config-volume mountPath: /etc/configvolumes:- name: config-volume configMap: name: app-configCréer un Pod
Section intitulée « Créer un Pod »Un Pod est l’unité de base dans Kubernetes. Il exécute un ou plusieurs conteneurs.
Manifest complet
Section intitulée « Manifest complet »apiVersion: v1kind: Podmetadata: name: web namespace: ckad labels: app: nginxspec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi" readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10kubectl apply -f pod.yamlkubectl get pods -l app=nginx --show-labelsNAME READY STATUS RESTARTS AGE LABELSweb 1/1 Running 0 19s app=nginxCréer un Deployment
Section intitulée « Créer un Deployment »Un Deployment gère un ensemble de Pods identiques et permet les mises à jour progressives.
Manifest avec 3 réplicas
Section intitulée « Manifest avec 3 réplicas »apiVersion: apps/v1kind: Deploymentmetadata: name: web namespace: ckad labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi"kubectl apply -f deployment.yamlkubectl get deploymentNAME READY UP-TO-DATE AVAILABLE AGEweb 3/3 3 3 10sCréer un Service
Section intitulée « Créer un Service »Un Service expose un ensemble de Pods sur le réseau.
Types de Services
Section intitulée « Types de Services »| Type | Usage | Accessibilité |
|---|---|---|
| ClusterIP | Trafic interne | Dans le cluster uniquement |
| NodePort | Tests, accès externe simple | <NodeIP>:<nodePort> |
| LoadBalancer | Production cloud | IP externe via load balancer |
Service ClusterIP
Section intitulée « Service ClusterIP »apiVersion: v1kind: Servicemetadata: name: web namespace: ckadspec: type: ClusterIP selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80Créer une ConfigMap
Section intitulée « Créer une ConfigMap »Une ConfigMap stocke des configurations non sensibles.
ConfigMap avec clés/valeurs et fichier
Section intitulée « ConfigMap avec clés/valeurs et fichier »apiVersion: v1kind: ConfigMapmetadata: name: app-config namespace: ckaddata: APP_ENV: production APP_DEBUG: "false" config.json: | { "database": "postgres", "port": 5432 }Utilisation avec envFrom
Section intitulée « Utilisation avec envFrom »apiVersion: v1kind: Podmetadata: name: app namespace: ckadspec: containers: - name: app image: busybox:1.36 command: ["sleep", "3600"] envFrom: - configMapRef: name: app-configToutes les clés de la ConfigMap deviennent des variables d’environnement.
Créer un Secret
Section intitulée « Créer un Secret »Un Secret stocke des
données sensibles. Utilisez stringData pour écrire en clair dans le manifest.
Secret avec stringData
Section intitulée « Secret avec stringData »apiVersion: v1kind: Secretmetadata: name: db-credentials namespace: ckadtype: OpaquestringData: username: admin password: S3cr3tP@ssw0rd!Utilisation dans un Pod
Section intitulée « Utilisation dans un Pod »apiVersion: v1kind: Podmetadata: name: app namespace: ckadspec: containers: - name: app image: busybox:1.36 command: ["sleep", "3600"] env: - name: DB_USER valueFrom: secretKeyRef: name: db-credentials key: username - name: DB_PASS valueFrom: secretKeyRef: name: db-credentials key: passwordMulti-document YAML
Section intitulée « Multi-document YAML »Regroupez plusieurs ressources liées dans un seul fichier avec --- :
apiVersion: v1kind: ConfigMapmetadata: name: app-config namespace: ckaddata: APP_ENV: production---apiVersion: apps/v1kind: Deploymentmetadata: name: app namespace: ckadspec: replicas: 2 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: app image: nginx:stable envFrom: - configMapRef: name: app-config---apiVersion: v1kind: Servicemetadata: name: app namespace: ckadspec: selector: app: myapp ports: - port: 80kubectl apply -f app-stack.yamlToutes les ressources sont créées en une seule commande.
Corriger rapidement une ressource existante
Section intitulée « Corriger rapidement une ressource existante »kubectl edit (modification interactive)
Section intitulée « kubectl edit (modification interactive) »kubectl edit deployment webOuvre le manifest dans votre éditeur. Les changements sont appliqués à la sauvegarde.
kubectl patch (modification ciblée)
Section intitulée « kubectl patch (modification ciblée) »# Changer le nombre de réplicaskubectl patch deployment web --type merge -p '{"spec":{"replicas":5}}'
# Changer l'imagekubectl patch deployment web --type merge \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.25"}]}}}}'kubectl set (raccourcis courants)
Section intitulée « kubectl set (raccourcis courants) »# Changer l'imagekubectl set image deployment/web nginx=nginx:1.25
# Changer les resourceskubectl set resources deployment/web -c=nginx --limits=cpu=500m,memory=256MiValider avant d’appliquer
Section intitulée « Valider avant d’appliquer »Validation côté client
Section intitulée « Validation côté client »kubectl apply --dry-run=client -f mon-manifest.yamlVérifie la syntaxe YAML et la structure de base. Rapide mais limité.
Validation côté serveur
Section intitulée « Validation côté serveur »kubectl apply --dry-run=server -f mon-manifest.yamlEnvoie le manifest à l’API server pour validation complète :
- Vérifie les admission controllers
- Détecte les champs inconnus
- Valide les contraintes (quotas, policies…)
Voir les changements avec kubectl diff
Section intitulée « Voir les changements avec kubectl diff »kubectl diff -f mon-manifest.yamlCompare le manifest local avec la ressource existante :
replicas: 3replicas: 5Erreurs qui font perdre du temps en CKAD
Section intitulée « Erreurs qui font perdre du temps en CKAD »| Erreur | Conséquence | Solution |
|---|---|---|
| Oublier le namespace | Ressource dans default | Changer le namespace courant |
| Mauvais label Service/Pod | Service sans Endpoints | Aligner les selectors |
port vs targetPort inversés | Connexion impossible | port = Service, targetPort = conteneur |
| Indentation YAML incorrecte | Erreur de parsing | Utiliser 2 espaces, pas de tabs |
Modifier selector d’un Deployment | Erreur “immutable” | Supprimer et recréer |
| Champ au mauvais niveau | Champ ignoré | kubectl explain pour vérifier |
| ConfigMap dans un autre namespace | not found | Même namespace que le Pod |
Exemple de piège : selector immutable
Section intitulée « Exemple de piège : selector immutable »# Impossible de modifier le selector d'un Deployment existantkubectl patch deployment web --type merge -p '{"spec":{"selector":{"matchLabels":{"app":"newapp"}}}}'# Erreur: spec.selector is immutableSolution : supprimer et recréer le Deployment.
kubectl delete deployment webkubectl apply -f web.yaml # avec le nouveau selectorChecklist de validation
Section intitulée « Checklist de validation »Avant chaque kubectl apply :
- Namespace : suis-je dans le bon namespace ?
- Labels : sont-ils cohérents entre Deployment, Pod et Service ?
- Image : nom et tag corrects ?
- Ports :
portettargetPortalignés ? - Resources : requests ≤ limits ?
- Probes : path et port corrects ?
- Volumes : même nom entre
volumesetvolumeMounts?
Tableau récapitulatif
Section intitulée « Tableau récapitulatif »| Ressource | Rôle | Champs clés |
|---|---|---|
| Pod | Exécuter des conteneurs | containers[].image, ports, resources |
| Deployment | Gérer des réplicas | replicas, selector, template |
| Service | Exposer des Pods | selector, ports, type |
| ConfigMap | Configuration non sensible | data (clé/valeur ou fichier) |
| Secret | Données sensibles | stringData (écriture) ou data (base64) |
Commandes de référence rapide
Section intitulée « Commandes de référence rapide »# Explorer l'APIkubectl api-resourceskubectl explain deployment.spec.template.spec.containers
# Générer des manifestskubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yamlkubectl expose deployment web --port=80 --dry-run=client -o yaml > svc.yaml
# Validerkubectl apply --dry-run=client -f manifest.yamlkubectl apply --dry-run=server -f manifest.yamlkubectl diff -f manifest.yaml
# Corriger rapidementkubectl edit deployment webkubectl patch deployment web --type merge -p '{"spec":{"replicas":5}}'kubectl set image deployment/web nginx=nginx:1.25
# Débuggerkubectl get pods -A # tous les namespaceskubectl describe pod webkubectl logs webkubectl exec -it web -- shContrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Workflow examen : namespace → générer → compléter → valider → appliquer
kubectl explaindocumente chaque champ depuis le cluster--dry-run=client -o yamlgénère un squelette à compléterkubectl exposecrée un Service avec les bons labels automatiquement- Labels cohérents entre Deployment, Pod template et Service selector
--dry-run=servervalide contre l’API et les admission controllerskubectl editetkubectl patchpour corriger rapidement- Multi-document YAML (
---) pour regrouper les ressources liées - Namespace courant : le changer évite les erreurs de cible
- stringData dans les Secrets évite l’encodage base64 manuel