
Vous devez modifier une ressource Kubernetes en production — vite, proprement, sans casser. Faut-il ouvrir un éditeur avec kubectl edit, envoyer un patch ciblé avec kubectl patch, ou remplacer l’objet depuis un fichier avec kubectl replace ? Ce guide vous aide à choisir la bonne commande selon le contexte, avec des recettes copier-coller prêtes pour la prod.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »À la fin de ce guide, vous saurez :
- Choisir entre
edit,patch,replaceetapplyselon votre besoin (urgence, scriptabilité, traçabilité) - Utiliser
kubectl editpour un hotfix en incident, en évitant le piège du drift non tracé - Écrire des patches ciblés avec les 3 types (strategic merge, JSON merge, JSON patch) et savoir lequel choisir
- Remplacer une ressource complète avec
kubectl replace, comprendre--forceet ses risques - Sécuriser toute modification en prod : snapshot avant, vérification après, rollback si nécessaire
Choisir la bonne commande
Section intitulée « Choisir la bonne commande »Avant de modifier quoi que ce soit, posez-vous cette question : est-ce un changement ponctuel d’urgence, un ajustement scriptable, ou une mise à jour complète du manifest ?
| Besoin | Commande | Pourquoi |
|---|---|---|
| Hotfix manuel en incident | kubectl edit | Édition interactive via éditeur — immédiat, mais non tracé |
| Changement ciblé, scriptable, reproductible | kubectl patch | Mise à jour in-place d’un ou plusieurs champs sans toucher au reste |
| Remplacement complet depuis un fichier | kubectl replace -f | Soumet la spec entière — demande le YAML complet |
| Déclaratif standard (recommandé au quotidien) | kubectl apply -f | Gestion déclarative avec 3-way merge — voir le guide create et apply |
3 recettes de prod à copier
Section intitulée « 3 recettes de prod à copier »Avant les explications détaillées, voici les commandes que vous utiliserez le plus souvent :
# 1) Changer l'image d'un conteneur (le plus courant)kubectl set image deploy/mon-app mon-conteneur=nginx:1.27 -n prod
# 2) Patch ciblé : scaler à 5 réplicas (scriptable)kubectl patch deploy mon-app -n prod \ --type='json' -p='[{"op":"replace","path":"/spec/replicas","value":5}]'
# 3) Sauvegarder puis remplacer une ressource complètekubectl get deploy mon-app -n prod -o yaml > mon-app-backup.yaml# (modifier le fichier)kubectl replace -f mon-app-backup.yamlkubectl edit : l’outil d’incident
Section intitulée « kubectl edit : l’outil d’incident »kubectl edit ouvre une ressource dans un éditeur de texte. Après sauvegarde et fermeture, Kubernetes applique automatiquement les changements. C’est rapide, mais non tracé : aucun fichier n’est commité, aucune PR n’est créée.
Quand l’utiliser
Section intitulée « Quand l’utiliser »- Incident en cours : vous devez modifier quelque chose maintenant
- Exploration : vous voulez voir et modifier un objet rapidement en dev
- Jamais en routine : pour les changements planifiés, préférez
apply -fdepuis un fichier versionné
kubectl edit <type> <nom> [-n namespace]Comment kubectl choisit l’éditeur
Section intitulée « Comment kubectl choisit l’éditeur »kubectl cherche un éditeur dans cet ordre :
- Variable
KUBE_EDITOR(priorité maximale) - Variable
EDITOR - Fallback :
vi(Linux/macOS) ounotepad(Windows)
# Forcer un éditeur pour cette commandeKUBE_EDITOR="nano" kubectl edit deploy mon-app -n prod
# Ou définir une fois pour toutes dans votre shellexport KUBE_EDITOR="code --wait" # VS Codeexport KUBE_EDITOR="nano" # nanoLe piège du drift : toujours snapshoter avant et après
Section intitulée « Le piège du drift : toujours snapshoter avant et après »Le danger de edit : la modification existe uniquement dans le cluster. Si quelqu’un refait kubectl apply -f depuis le repo Git, votre changement sera écrasé. C’est ce qu’on appelle le drift (divergence entre le cluster et la source de vérité).
-
Snapshotez l’état actuel avant la modification
Fenêtre de terminal kubectl get deploy mon-app -n prod -o yaml > mon-app.before.yaml -
Faites votre edit
Fenêtre de terminal kubectl edit deploy mon-app -n prod -
Exportez le résultat après modification
Fenêtre de terminal kubectl get deploy mon-app -n prod -o yaml > mon-app.after.yaml -
Reportez le changement dans votre repo Git
Comparez les deux fichiers, intégrez la modification dans le manifest versionné, et créez une PR.
Fenêtre de terminal diff mon-app.before.yaml mon-app.after.yaml
kubectl patch : le cœur de la modification ciblée
Section intitulée « kubectl patch : le cœur de la modification ciblée »kubectl patch modifie un ou plusieurs champs d’une ressource sans toucher au reste. C’est la commande idéale pour les changements scriptables et reproductibles.
kubectl patch <type> <nom> [-n namespace] --type=<type-patch> -p '<modification>'Quel type de patch choisir ?
Section intitulée « Quel type de patch choisir ? »kubectl supporte 3 types de patch, chacun avec un comportement différent :
| Type | Flag | Comportement | Usage |
|---|---|---|---|
| Strategic merge | --type=strategic (défaut) | Fusionne intelligemment les listes (ajoute au lieu de remplacer) | Ressources natives K8s — choix par défaut |
| JSON merge | --type=merge | Fusionne les objets, remplace les listes entièrement (RFC 7386) | Quand vous voulez remplacer une liste (et non y ajouter) |
| JSON patch | --type=json | Opérations explicites add/replace/remove sur des chemins précis (RFC 6902) | Maximum de contrôle, idéal pour les scripts |
Recettes de patches classiques en production
Section intitulée « Recettes de patches classiques en production »Changer l’image d’un conteneur
Section intitulée « Changer l’image d’un conteneur »La façon la plus lisible pour changer une image est kubectl set image :
kubectl set image deploy/mon-app mon-conteneur=nginx:1.27 -n prodL’équivalent en patch strategic (si vous avez besoin du format patch, pour un script par exemple) :
kubectl patch deploy mon-app -n prod -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"mon-conteneur","image":"nginx:1.27"}]}}}}'Vérification :
kubectl get deploy mon-app -n prod -o jsonpath='{.spec.template.spec.containers[0].image}'# nginx:1.27Ajouter une annotation (ex: référence incident)
Section intitulée « Ajouter une annotation (ex: référence incident) »kubectl patch deploy mon-app -n prod -p \ '{"metadata":{"annotations":{"incident-ref":"INC-2026-0142"}}}'Modifier une variable d’environnement
Section intitulée « Modifier une variable d’environnement »Avec le patch JSON pour cibler précisément le conteneur et la variable :
# D'abord, trouvez l'index du conteneur et de la variablekubectl get deploy mon-app -n prod -o jsonpath='{.spec.template.spec.containers[0].env}' | python3 -m json.tool
# Puis patchéz (ici : ajout d'une variable)kubectl patch deploy mon-app -n prod --type='json' \ -p='[{"op":"add","path":"/spec/template/spec/containers/0/env/-","value":{"name":"LOG_LEVEL","value":"debug"}}]'Augmenter un timeout de probe
Section intitulée « Augmenter un timeout de probe »kubectl patch deploy mon-app -n prod --type='json' \ -p='[{"op":"replace","path":"/spec/template/spec/containers/0/readinessProbe/timeoutSeconds","value":10}]'Scaler le nombre de réplicas
Section intitulée « Scaler le nombre de réplicas »kubectl patch deploy mon-app -n prod --type='json' \ -p='[{"op":"replace","path":"/spec/replicas","value":5}]'Comparer strategic merge et JSON merge
Section intitulée « Comparer strategic merge et JSON merge »Pour comprendre la différence, imaginez que votre deployment a 2 conteneurs et que vous patchéz la liste containers :
| Type de patch | Comportement sur la liste containers |
|---|---|
| Strategic merge | Ajoute ou met à jour le conteneur ciblé (par name), conserve les autres |
| JSON merge | Remplace toute la liste par celle du patch — les conteneurs non listés disparaissent |
| JSON patch | Opère sur un index précis (/containers/0) — contrôle total |
C’est pourquoi le strategic merge est le défaut pour les ressources natives : il évite de supprimer accidentellement des conteneurs, des volumes ou des ports.
kubectl replace : le remplacement complet
Section intitulée « kubectl replace : le remplacement complet »kubectl replace soumet une spec complète au serveur API. Contrairement à patch qui touche un champ, replace remplace tout l’objet tel que décrit dans le fichier.
Quand l’utiliser
Section intitulée « Quand l’utiliser »- Vous avez un fichier YAML complet et vérié comme source de vérité
- Vous voulez appliquer un gros changement structurel d’un coup
- La ressource a été exportée, modifiée hors du cluster, et doit être réamorcée
kubectl replace -f <fichier.yaml>Workflow typique
Section intitulée « Workflow typique »-
Exportez la ressource actuelle
Fenêtre de terminal kubectl get deploy mon-app -n prod -o yaml > mon-app.yaml -
Modifiez le fichier YAML dans votre éditeur
-
Remplacez la ressource
Fenêtre de terminal kubectl replace -f mon-app.yaml -
Vérifiez le résultat
Fenêtre de terminal kubectl get deploy mon-app -n prodkubectl describe deploy mon-app -n prod | tail -20
replace —force : delete + create (danger)
Section intitulée « replace —force : delete + create (danger) »L’option --force supprime d’abord la ressource, puis la recrée à partir du fichier. C’est un delete + create sous le capot.
kubectl replace --force -f mon-app.yamlreplace vs apply : quelle différence ?
Section intitulée « replace vs apply : quelle différence ? »| Critère | kubectl replace | kubectl apply |
|---|---|---|
| Ce qui est envoyé | La spec complète (tout le YAML) | Uniquement les champs modifiés (3-way merge) |
| Champs manuels conservés | Non — tout est remplacé | Oui — merge intelligent |
Annotation last-applied | Non utilisée | Utilisée pour le merge |
| Idempotent | Non (échoue si l’objet n’existe pas) | Oui (crée ou met à jour) |
| Usage recommandé | Remplacement intégral contrôlé | Gestion déclarative quotidienne |
Avant toute modification en prod
Section intitulée « Avant toute modification en prod »Quelle que soit la commande, suivez cette checklist avant de modifier quoi que ce soit en production.
-
Vérifiez votre contexte et votre namespace
Fenêtre de terminal kubectl config current-context# ⚠️ Êtes-vous bien sur le bon cluster ? -
Identifiez précisément la ressource
Fenêtre de terminal kubectl get deploy mon-app -n prod -
Snapshotez l’état actuel
Fenêtre de terminal kubectl get deploy mon-app -n prod -o yaml > mon-app.$(date +%F-%H%M).yaml -
Faites la modification (edit, patch ou replace)
-
Vérifiez immédiatement le résultat
Fenêtre de terminal kubectl get deploy mon-app -n prodkubectl rollout status deploy/mon-app -n prod
Rollback en cas de problème
Section intitulée « Rollback en cas de problème »Si la modification casse quelque chose :
-
Pour un Deployment : utilisez le rollback natif
Fenêtre de terminal # Voir l'historique des révisionskubectl rollout history deploy/mon-app -n prod# Revenir à la révision précédentekubectl rollout undo deploy/mon-app -n prod# Revenir à une révision spécifiquekubectl rollout undo deploy/mon-app -n prod --to-revision=3Pour aller plus loin : voir le guide scale, autoscale et rollout.
-
Pour les autres ressources : réappliquez le snapshot
Fenêtre de terminal kubectl replace -f mon-app.2026-02-27-1430.yaml
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
error: no changes made (edit) | Aucune modification détectée à la sauvegarde | Vérifiez que vous avez bien modifié un champ et sauvegardé |
error: the object has been modified | Quelqu’un a modifié la ressource entre votre lecture et votre écriture | Recommencez l’opération (edit ou replace) |
field is immutable (replace) | Tentative de modifier un champ immuable (selector, volumeName…) | Supprimez et recréez la ressource, ou utilisez replace --force |
error: cannot find path (patch JSON) | Le chemin JSON est incorrect | Vérifiez avec kubectl get <type> <nom> -o json |
invalid JSON/YAML (patch) | Erreur de syntaxe dans le patch | Validez vos guillemets, crochets et accolades |
| Le patch ne change rien (strategic) | Le champ patché est identique à la valeur actuelle | Vérifiez la valeur avec kubectl get -o jsonpath='{...}' |
| Patch sur CRD échoue | Strategic merge non supporté pour les CRD | Utilisez --type=merge ou --type=json |
| Regression après edit | Quelqu’un a fait apply -f depuis Git et écrasé votre changement | Reportez toujours vos changements dans le repo Git |
À retenir
Section intitulée « À retenir »kubectl editest un outil d’urgence — modifiez en live, mais snapshotez avant et reportez dans Git après.kubectl patchest votre outil de modification ciblée — scriptable, reproductible, idéal pour l’automatisation.- Les 3 types de patch : strategic merge (défaut, intelligent sur les listes), JSON merge (remplace les listes), JSON patch (opérations explicites add/replace/remove).
- Strategic merge patch ne fonctionne pas sur les CRD — utilisez
--type=mergeou--type=json. kubectl replaceremplace l’intégralité de l’objet — il exige la spec complète dans le fichier.replace --force= delete + create = downtime. À n’utiliser qu’en dernier recours.- Avant toute modification en prod : vérifiez le contexte, snapshotez, modifiez, vérifiez, commitez.