我最近在学习Kubernetes,我不太清楚“kubectl apply”和“kubectl replace”之间的区别。有什么情况我们只能使用其中一个吗?
答案 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 updates和disruptive updates。
其结果是,您在apply
中使用的文件可能是不完整的规范,即仅是您要更改的文件;而对于replace
,规范必须完整。
因此,您可以apply
仅更改注释的文件,而无需指定资源的任何其他属性;但是如果您尝试通过replace
命令使用同一文件,则该命令将由于缺少信息而失败。
此外,apply
仅适用于资源的某些属性;如果您需要更新不适用于apply
的属性(对不起,双关语!),则必须使用replace
。
答案 2 :(得分:2)
破坏性更新
在某些情况下,您可能需要更新不能 初始化后更新,或者您可能只想进行递归 立即更改,例如修复由 部署。要更改此类字段,请使用
replace --force
,该字段将删除 并重新创建资源。
答案 3 :(得分:2)
apply
和replace
之间的区别类似于apply
和create
之间的区别。
create
/ replace
使用imperative方法,而apply
使用declarative方法。
如果使用create
创建资源,请使用replace
更新资源。如果您使用apply
创建资源,请使用apply
更新资源。
请注意,replace
和apply
都需要完整的规范,并且在删除旧资源之前都先创建新资源(除非指定了--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