我最近正在学习Kubernetes,对于" kubectl apply"和" kubectl replace"之间的区别我不太清楚。 有什么情况我们只能使用其中一种吗?
-
这可能会帮助stackoverflow.com/questions/47369351/
-
很好的阅读主题:kubernetes.io/docs/concepts/overview/working-with-objects/
-
这回答了你的问题了吗? kubectl申请vs kubectl创建?
不同之处在于replace首先删除资源,然后从您提供的文件中创建资源;而apply尝试直接在当前活动资源中直接更新文件中赋予它的属性。请参阅就地更新和破坏性更新。
这样的结果是,您在apply中使用的文件可能是不完整的规范,即仅是您要更改的文件。而对于replace,规范必须完整。
因此,您可以apply一个仅更改注释的文件,而无需指定资源的任何其他属性。但是,如果您尝试通过replace命令使用同一文件,则由于缺少信息,该命令将失败。
另外,apply仅适用于资源的某些属性;如果您需要更新不适用于apply的属性(对不起,双关语!),则必须使用replace。
-
实际上这似乎没有发生。 如果我kubectl apply没有指定副本数的新部署-它似乎默认为0或1。
-
这个答案是完全错误的,似乎在描述命令patch和replace --force。
我已经对Apply,Replace和Patch之间的区别进行了详尽的解释:Kubernetes Apply与Replace与Patch。它包含一个解释,表明当前对该问题的排名最高的答案是错误的。
简而言之,kubectl apply使用提供的规范来创建资源(如果该资源不存在)并进行更新(即修补)(如果存在的话)。提供给apply的规范仅需包含规范的必需部分,创建资源时,API将使用默认值作为其余部分,更新资源时,API将使用其当前值。
kubectl replace用提供的规范定义的资源完全替换现有资源。 replace希望输入完整的规范,包括API提供的只读属性,例如.metadata.resourceVersion,用于pods的.spec.nodeName,用于服务的.spec.clusterIP和用于服务帐户的.secrets。 kubectl有一些内部技巧可以帮助您实现正确的目标,但是通常replace的用例是获取资源规范,更改属性,然后使用更改后的完整规范替换现有资源。
kubectl replace命令具有一个--force选项,该选项实际上不使用替换即PUT的API端点。它使用提供的规范强制删除(DELETE),然后重新创建(POST)资源。
apply和replace之间的差异类似于apply和create之间的差异。
create / replace使用命令式方法,而apply使用声明式方法。
如果使用create创建资源,则使用replace进行更新。如果使用apply创建资源,则使用apply进行更新。
请注意,replace和apply都需要完整的规范,并且都必须在删除旧资源之前先创建新资源(除非指定了--force)。
-
有关更详尽的解释和比较,请参阅Kubernetes文档中的本节。
来自:https://github.com/kubernetes/website/blob/master/content/en/docs/concepts/cluster-administration/manage-deployment.md
Disruptive updates
In some cases, you may need to update resource fields that cannot be
updated once initialized, or you may just want to make a recursive
change immediately, such as to fix broken pods created by a
Deployment. To change such fields, use replace --force, which deletes
and re-creates the resource.
-
我认为这与--force选项有关,而不是与kubectl replace本身有关,如kubectl replace --help:--force=false: Delete and re-create the specified resource所示。 文档不包含有关" kubectl replace"和" kubectl apply"有何区别的信息。
kubectl apply ..将使用各种试探法来有选择地更新资源内指定的值。
kubectl replace ...将用指定的值替换/覆盖整个对象。在避免选择性启发式更新的复杂性方面,这应该是首选。但是,诸如入口/负载平衡器之类的某些资源是不可变的,因此实际上无法替换。
导致不明显操作的启发式更新示例:https://github.com/kubernetes/kubernetes/issues/67135
您可以在使用kubectl时添加选项-v = 8,并且您会发现这样的日志
1 2 3 4 5 6 7 8 9 10 11 12 13
| apply --force
patch 422
delete 200
get 200
get 200
get 404
post 201
replace --force
get 200
delete 200
get 404
post 201 |