我最近在学习Kubernetes,我不太清楚"kubectl apply"和"kubectl replace"之间的区别.有什么情况我们只能使用其中一个吗?
Dav*_*ing 14
我写了一篇关于 apply、replace 和 patch 之间差异的详尽解释:Kubernetes Apply vs. Replace vs. Patch。它包括对这个问题当前排名靠前的答案是错误的解释。
简而言之,kubectl apply
如果资源不存在,则使用提供的规范创建资源,如果存在则更新(即修补)。提供的规范apply
只需要包含规范的必需部分,在创建资源时,API 将使用其余部分的默认值,而在更新资源时,它将使用其当前值。
将kubectl replace
完全取代与所提供的规范中定义的现有资源。replace
想要一个完整的规范作为输入,包括像API提供的只读属性.metadata.resourceVersion
,.spec.nodeName
用于吊舱,.spec.clusterIP
用于服务和.secrets
服务帐户。kubectl
有一些内部技巧可以帮助您做到这一点,但通常的用例replace
是获取资源规范,更改属性,然后使用更改后的完整规范来替换现有资源。
该kubectl replace
命令有一个--force
选项,它实际上不使用替换,即PUT
API 端点。它使用提供的规范强制删除 ( DELETE
) 然后重新创建 ( POST
) 资源。
不同之处在于,replace
首先删除资源,然后从您提供的文件中创建资源;而apply
尝试直接在当前活动资源中仅更新文件中赋予它的属性。请参阅就地更新和破坏性更新。
结果是,您在中使用的文件apply
可能是不完整的规范,即仅是您要更改的文件;而使用replace
,则规范必须完整。
因此,您可以apply
只更改注释,而不指定资源的任何其他属性的文件;但是,如果您尝试通过replace
命令使用同一文件,则由于缺少信息,该命令将失败。
而且,apply
仅适用于资源的某些属性;如果您需要更新apply
不适用的属性(对不起,双关语!),则必须使用replace
。
使用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
Run Code Online (Sandbox Code Playgroud)
破坏性更新
在某些情况下,您可能需要更新初始化后无法更新的资源字段,或者您可能只想立即进行递归更改,例如修复 Deployment 创建的损坏的 pod。要更改此类字段,请使用
replace --force
,这会删除并重新创建资源。
归档时间: |
|
查看次数: |
5892 次 |
最近记录: |