kubectl apply和kubectl replace之间有什么区别

时间:2017-11-11 18:53:33

标签: kubectl

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

6 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:4)

区别在于replace首先删除资源,然后从您提供的文件中创建资源;而apply尝试直接在当前活动资源中直接更新文件中赋予它的属性。参见In-place updatesdisruptive updates

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

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

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

答案 2 :(得分:2)

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

  

破坏性更新

     

在某些情况下,您可能需要更新不能   初始化后更新,或者您可能只想进行递归   立即更改,例如修复由   部署。要更改此类字段,请使用replace --force,该字段将删除   并重新创建资源。

答案 3 :(得分:2)

applyreplace之间的区别类似于applycreate之间的区别。

create / replace使用imperative方法,而apply使用declarative方法。

如果使用create创建资源,请使用replace更新资源。如果您使用apply创建资源,请使用apply更新资源。

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

答案 4 :(得分:1)

kubectl apply ..将使用各种试探法来有选择地更新资源内指定的值。

kubectl replace ...将用指定的值替换/覆盖整个对象。 这是首选,因为您可以避免选择性启发式更新的复杂性。但是,诸如入口/负载平衡器之类的某些资源是不可变的,因此实际上无法替换。

导致不明显操作的启发式更新示例:https://github.com/kubernetes/kubernetes/issues/67135

答案 5 :(得分:0)

使用kubectl时,您可以添加选项-v = 8,您将找到类似的日志

apply --force
patch 422
delete 200
get 200
get 200
get 404
post 201

replace --force
get 200
delete 200
get 404
post 201