我最近在学习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选项,它实际上不使用替换,即PUTAPI 端点。它使用提供的规范强制删除 ( 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 次 |
| 最近记录: |