Aller au contenu
Conteneurs & Orchestration medium

kubectl edit, patch et replace : modifier des ressources Kubernetes

15 min de lecture

logo kubernetes

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.

À la fin de ce guide, vous saurez :

  • Choisir entre edit, patch, replace et apply selon votre besoin (urgence, scriptabilité, traçabilité)
  • Utiliser kubectl edit pour 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 --force et ses risques
  • Sécuriser toute modification en prod : snapshot avant, vérification après, rollback si nécessaire

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 ?

BesoinCommandePourquoi
Hotfix manuel en incidentkubectl editÉdition interactive via éditeur — immédiat, mais non tracé
Changement ciblé, scriptable, reproductiblekubectl patchMise à jour in-place d’un ou plusieurs champs sans toucher au reste
Remplacement complet depuis un fichierkubectl replace -fSoumet la spec entière — demande le YAML complet
Déclaratif standard (recommandé au quotidien)kubectl apply -fGestion déclarative avec 3-way merge — voir le guide create et apply

Avant les explications détaillées, voici les commandes que vous utiliserez le plus souvent :

Fenêtre de terminal
# 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ète
kubectl get deploy mon-app -n prod -o yaml > mon-app-backup.yaml
# (modifier le fichier)
kubectl replace -f mon-app-backup.yaml

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.

  • 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 -f depuis un fichier versionné
Fenêtre de terminal
kubectl edit <type> <nom> [-n namespace]

kubectl cherche un éditeur dans cet ordre :

  1. Variable KUBE_EDITOR (priorité maximale)
  2. Variable EDITOR
  3. Fallback : vi (Linux/macOS) ou notepad (Windows)
Fenêtre de terminal
# Forcer un éditeur pour cette commande
KUBE_EDITOR="nano" kubectl edit deploy mon-app -n prod
# Ou définir une fois pour toutes dans votre shell
export KUBE_EDITOR="code --wait" # VS Code
export KUBE_EDITOR="nano" # nano

Le 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é).

  1. Snapshotez l’état actuel avant la modification

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod -o yaml > mon-app.before.yaml
  2. Faites votre edit

    Fenêtre de terminal
    kubectl edit deploy mon-app -n prod
  3. Exportez le résultat après modification

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod -o yaml > mon-app.after.yaml
  4. 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.

Fenêtre de terminal
kubectl patch <type> <nom> [-n namespace] --type=<type-patch> -p '<modification>'

kubectl supporte 3 types de patch, chacun avec un comportement différent :

TypeFlagComportementUsage
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=mergeFusionne les objets, remplace les listes entièrement (RFC 7386)Quand vous voulez remplacer une liste (et non y ajouter)
JSON patch--type=jsonOpérations explicites add/replace/remove sur des chemins précis (RFC 6902)Maximum de contrôle, idéal pour les scripts

La façon la plus lisible pour changer une image est kubectl set image :

Fenêtre de terminal
kubectl set image deploy/mon-app mon-conteneur=nginx:1.27 -n prod

L’équivalent en patch strategic (si vous avez besoin du format patch, pour un script par exemple) :

Fenêtre de terminal
kubectl patch deploy mon-app -n prod -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"mon-conteneur","image":"nginx:1.27"}]}}}}'

Vérification :

Fenêtre de terminal
kubectl get deploy mon-app -n prod -o jsonpath='{.spec.template.spec.containers[0].image}'
# nginx:1.27
Fenêtre de terminal
kubectl patch deploy mon-app -n prod -p \
'{"metadata":{"annotations":{"incident-ref":"INC-2026-0142"}}}'

Avec le patch JSON pour cibler précisément le conteneur et la variable :

Fenêtre de terminal
# D'abord, trouvez l'index du conteneur et de la variable
kubectl 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"}}]'
Fenêtre de terminal
kubectl patch deploy mon-app -n prod --type='json' \
-p='[{"op":"replace","path":"/spec/template/spec/containers/0/readinessProbe/timeoutSeconds","value":10}]'
Fenêtre de terminal
kubectl patch deploy mon-app -n prod --type='json' \
-p='[{"op":"replace","path":"/spec/replicas","value":5}]'

Pour comprendre la différence, imaginez que votre deployment a 2 conteneurs et que vous patchéz la liste containers :

Type de patchComportement sur la liste containers
Strategic mergeAjoute ou met à jour le conteneur ciblé (par name), conserve les autres
JSON mergeRemplace toute la liste par celle du patch — les conteneurs non listés disparaissent
JSON patchOpè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 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.

  • 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
Fenêtre de terminal
kubectl replace -f <fichier.yaml>
  1. Exportez la ressource actuelle

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod -o yaml > mon-app.yaml
  2. Modifiez le fichier YAML dans votre éditeur

  3. Remplacez la ressource

    Fenêtre de terminal
    kubectl replace -f mon-app.yaml
  4. Vérifiez le résultat

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod
    kubectl describe deploy mon-app -n prod | tail -20

L’option --force supprime d’abord la ressource, puis la recrée à partir du fichier. C’est un delete + create sous le capot.

Fenêtre de terminal
kubectl replace --force -f mon-app.yaml
Critèrekubectl replacekubectl apply
Ce qui est envoyéLa spec complète (tout le YAML)Uniquement les champs modifiés (3-way merge)
Champs manuels conservésNon — tout est remplacéOui — merge intelligent
Annotation last-appliedNon utiliséeUtilisée pour le merge
IdempotentNon (échoue si l’objet n’existe pas)Oui (crée ou met à jour)
Usage recommandéRemplacement intégral contrôléGestion déclarative quotidienne

Quelle que soit la commande, suivez cette checklist avant de modifier quoi que ce soit en production.

  1. Vérifiez votre contexte et votre namespace

    Fenêtre de terminal
    kubectl config current-context
    # ⚠️ Êtes-vous bien sur le bon cluster ?
  2. Identifiez précisément la ressource

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod
  3. Snapshotez l’état actuel

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod -o yaml > mon-app.$(date +%F-%H%M).yaml
  4. Faites la modification (edit, patch ou replace)

  5. Vérifiez immédiatement le résultat

    Fenêtre de terminal
    kubectl get deploy mon-app -n prod
    kubectl rollout status deploy/mon-app -n prod

Si la modification casse quelque chose :

  • Pour un Deployment : utilisez le rollback natif

    Fenêtre de terminal
    # Voir l'historique des révisions
    kubectl rollout history deploy/mon-app -n prod
    # Revenir à la révision précédente
    kubectl rollout undo deploy/mon-app -n prod
    # Revenir à une révision spécifique
    kubectl rollout undo deploy/mon-app -n prod --to-revision=3

    Pour 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
SymptômeCause probableSolution
error: no changes made (edit)Aucune modification détectée à la sauvegardeVérifiez que vous avez bien modifié un champ et sauvegardé
error: the object has been modifiedQuelqu’un a modifié la ressource entre votre lecture et votre écritureRecommencez 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 incorrectVérifiez avec kubectl get <type> <nom> -o json
invalid JSON/YAML (patch)Erreur de syntaxe dans le patchValidez vos guillemets, crochets et accolades
Le patch ne change rien (strategic)Le champ patché est identique à la valeur actuelleVérifiez la valeur avec kubectl get -o jsonpath='{...}'
Patch sur CRD échoueStrategic merge non supporté pour les CRDUtilisez --type=merge ou --type=json
Regression après editQuelqu’un a fait apply -f depuis Git et écrasé votre changementReportez toujours vos changements dans le repo Git
  • kubectl edit est un outil d’urgence — modifiez en live, mais snapshotez avant et reportez dans Git après.
  • kubectl patch est 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=merge ou --type=json.
  • kubectl replace remplace 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn