J'apprends Kubernetes récemment, et je ne suis pas très clair sur la différence entre "kubectl appliquer" et "kubectl remplacer". Y a-t-il une situation où nous ne pouvons utiliser qu'un seul d'entre eux?
La différence est que replace
supprime d'abord les ressources, puis les crée à partir du fichier que vous lui donnez; tandis que apply
tente de mettre à jour directement, dans la ressource active actuelle, uniquement les attributs que vous lui donnez dans le fichier. Voir Mises à jour sur place et mises à jour perturbatrices .
Une conséquence de cela est que le fichier que vous utilisez dans un apply
peut être une spécification incomplète, c'est-à-dire uniquement ce que vous voulez changer; alors qu'avec replace
, la spécification doit être complète.
Vous pouvez donc apply
un fichier qui ne modifie qu'une annotation, sans spécifier aucune autre propriété de la ressource; mais si vous essayez d'utiliser le même fichier avec une commande replace
, la commande échouera en raison d'informations manquantes.
De plus, apply
ne fonctionne que sur certaines propriétés des ressources; si vous devez mettre à jour des propriétés pour lesquelles apply
ne s'applique pas (désolé pour le jeu de mots!), vous devez utiliser replace
à la place.
Mises à jour perturbatrices
Dans certains cas, vous devrez peut-être mettre à jour les champs de ressources qui ne peuvent pas être mis à jour une fois initialisés, ou vous pouvez simplement apporter une modification récursive immédiatement, par exemple pour corriger les pods cassés créés par un déploiement. Pour modifier ces champs, utilisez
replace --force
, qui supprime et recrée la ressource.
La différence entre apply
et replace
est similaire à la différence entre apply
et create
.
create
/replace
utilise l'approche impérative , tandis que apply
utilise l'approche déclarative .
Si vous avez utilisé create
pour créer la ressource, utilisez replace
pour la mettre à jour. Si vous avez utilisé apply
pour créer la ressource, utilisez apply
pour la mettre à jour.
Notez que replace
et apply
nécessitent une spécification complète et que les deux créent d'abord les nouvelles ressources avant de supprimer les anciennes (sauf si --force
est spécifié).
vous pouvez ajouter l'option -v = 8 lorsque vous utilisez kubectl, et vous trouverez le journal comme celui-ci
apply --force
patch 422
delete 200
get 200
get 200
get 404
post 201
replace --force
get 200
delete 200
get 404
post 201
kubectl apply ..
utilisera diverses heuristiques pour mettre à jour de manière sélective les valeurs spécifiées dans la ressource.
kubectl replace ...
remplacera/écrasera tout l'objet par les valeurs spécifiées. Cela devrait être préféré car vous évitez la complexité de la mise à jour heuristique sélective.
Exemple de mise à jour heuristique conduisant à une opération non évidente: https://github.com/kubernetes/kubernetes/issues/67135