kubectl apply和kubectl replace有什么区别

What is the difference between kubectl apply and kubectl replace

我最近正在学习Kubernetes,对于" kubectl apply"和" kubectl replace"之间的区别我不太清楚。 有什么情况我们只能使用其中一种吗?


不同之处在于replace首先删除资源,然后从您提供的文件中创建资源;而apply尝试直接在当前活动资源中直接更新文件中赋予它的属性。请参阅就地更新和破坏性更新。

这样的结果是,您在apply中使用的文件可能是不完整的规范,即仅是您要更改的文件。而对于replace,规范必须完整。

因此,您可以apply一个仅更改注释的文件,而无需指定资源的任何其他属性。但是,如果您尝试通过replace命令使用同一文件,则由于缺少信息,该命令将失败。

另外,apply仅适用于资源的某些属性;如果您需要更新不适用于apply的属性(对不起,双关语!),则必须使用replace


我已经对Apply,Replace和Patch之间的区别进行了详尽的解释:Kubernetes Apply与Replace与Patch。它包含一个解释,表明当前对该问题的排名最高的答案是错误的。

简而言之,kubectl apply使用提供的规范来创建资源(如果该资源不存在)并进行更新(即修补)(如果存在的话)。提供给apply的规范仅需包含规范的必需部分,创建资源时,API将使用默认值作为其余部分,更新资源时,API将使用其当前值。

kubectl replace用提供的规范定义的资源完全替换现有资源。 replace希望输入完整的规范,包括API提供的只读属性,例如.metadata.resourceVersion,用于pods的.spec.nodeName,用于服务的.spec.clusterIP和用于服务帐户的.secretskubectl有一些内部技巧可以帮助您实现正确的目标,但是通常replace的用例是获取资源规范,更改属性,然后使用更改后的完整规范替换现有资源。

kubectl replace命令具有一个--force选项,该选项实际上不使用替换即PUT的API端点。它使用提供的规范强制删除(DELETE),然后重新创建(POST)资源。


applyreplace之间的差异类似于applycreate之间的差异。

create / replace使用命令式方法,而apply使用声明式方法。

如果使用create创建资源,则使用replace进行更新。如果使用apply创建资源,则使用apply进行更新。

请注意,replaceapply都需要完整的规范,并且都必须在删除旧资源之前先创建新资源(除非指定了--force)。


来自: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.


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