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

Jim*_*CYJ 27 kubectl

我最近在学习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) 资源。


Oli*_*ver 8

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

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

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

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

  • 这个答案是完全不正确的,似乎在描述命令`patch`和`replace --force`。 (4认同)
  • 如果您更新答案并删除其原始内容,我们将无法追踪历史记录,并且不知道评论是否适用于原始答案或更新后的答案 (2认同)

Cod*_*ode 6

apply和之间的区别replace类似于apply和之间的区别create

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

如果您用于create创建资源,则用于replace更新它。如果您用于apply创建资源,则用于apply更新它。

请注意, 和 都replace需要apply完整的规范,并且都先创建新资源,然后再删除旧资源(除非--force指定)。


shu*_*gry 6

使用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)


Eya*_*vin 3

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

破坏性更新

在某些情况下,您可能需要更新初始化后无法更新的资源字段,或者您可能只想立即进行递归更改,例如修复 Deployment 创建的损坏的 pod。要更改此类字段,请使用replace --force,这会删除并重新创建资源。

  • 我认为这更多的是关于“--force”选项而不是“kubectl Replace”本身,正如“kubectl Replace --help”所示:“--​​force=false:删除并重新创建指定的资源” 。这些文档不包含有关“kubectl Replace”与“kubectl apply”的区别的信息。 (6认同)