web-dev-qa-db-fra.com

Quelle est la différence entre kubectl appliquer et kubectl remplacer

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?

35
JimmyCYJ

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.

10
Oliver

De: https://github.com/kubernetes/website/blob/master/content/en/docs/concepts/cluster-administration/manage-deployment.md

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.

3
Eyal Levin

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

2
Code

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
0
shuaihanhungry

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

0
Chris Stryczynski