当前位置: 首页 > 知识库问答 >
问题:

kubectl应用和kubectl替换之间的区别是什么

沃阳飙
2023-03-14

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

共有3个答案

夏侯弘量
2023-03-14

应用替换之间的区别与应用创建之间的区别类似。

创建/替换使用命令式方法,而应用使用声明式方法。

如果使用create创建资源,则使用replace进行更新。如果使用apply创建资源,则使用apply进行更新。

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

卫阳炎
2023-03-14

最新答案

我的原著颇具争议,事后看来,我甚至会说现在有一半是错误的。下面是一个更新的答案,我希望它会更有帮助:

  • 像kubectl补丁替换删除创建,甚至编辑这样的命令都是必须的:它们告诉kubectl要做什么
  • kubectlApplication命令是OTOH声明性的,因为它告诉kubernetes,这里是一个期望的状态(应用命令提供的文件中的yaml),现在弄清楚如何到达那里:创建、修补、替换对象等...你明白了。

所以这两个命令有很大的不同。

你可以给它你想要的改变:它会找出对象的哪些属性需要改变,而不管其他的;如果这些属性是“不可变的”(例如,一个pod的nodeName),它会抱怨,如果你然后用--force重复这个命令,它足够聪明,知道做相当于替换--force的事情。

一般来说,您应该倾向于应用(必要时使用--force),并且只有在声明性方法没有给出预期结果时才使用命令式命令(尽管我很想看到这方面的例子——我猜这只会发生在您需要几个步骤的时候,因为相互依赖会产生负面后果,如果使用应用程序的话)。

高迪
2023-03-14

我已经详细解释了应用、替换和补丁之间的区别:Kubernetes apply vs.replace vs.patch。它包括一个解释,即目前排名靠前的答案是错误的。

简而言之,kubectl应用程序使用提供的规范来创建不存在的资源,并更新,即补丁,如果存在的话。提供给应用程序的规范只需要包含规范的必要部分,当创建资源时,应用编程接口将使用默认值作为其余部分,当更新资源时,它将使用其当前值。

kubectl replace将现有资源完全替换为所提供规范定义的资源。replace需要一个完整规范作为输入,包括API提供的只读属性,如。元数据。resourceVersion。规范节点名用于吊舱,。服务和的spec.clusterIP。服务账户的秘密kubectl有一些内部技巧可以帮助您实现这一点,但通常情况下,replace的用例是获取资源规范,更改属性,然后使用更改后的完整规范替换现有资源。

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

 类似资料:
  • 我用使用下面的yaml,我看不出有任何区别,使用这两个命令创建一个pod。K8S文档提到了命令式和声明式命令。但是,create和apply的行为方式仍然相同。 有什么区别?另外,declarative和命令是如何实现的?它们都会获取一个或多个包含对象详细信息的yaml文件。

  • null 我的问题是 为什么在一个集群中有三个操作来执行相同的任务? 这些操作的用例是什么? 他们在引擎盖下有什么不同?

  • 字符串方法有什么区别? 在下面的示例中,代码给出了< code >相同的输出。在这两种情况下,字符串的< code >所有实例都会被替换。 输出: 这里有一只狗,那里有一只 输出: 这里有一只狗,那里有一只

  • 我有Kubernetes在两种不同的环境中工作良好,即在我的本地环境(运行minikube的MacBook)和谷歌的容器引擎(GCE,谷歌云上的Kubernetes)。我使用MacBook/local环境开发和测试我的YAML文件,完成后,在GCE上试用。 目前,我需要单独处理每个环境:我需要在本地环境中编辑YAML文件,准备好后,(git)将它们克隆到GCE环境中,然后使用/部署它们。这是一个有

  • kubectl端口转发(将端口从本地主机转发到集群中的pod以获得对集群资源的访问)和NodePort服务类型之间有什么区别?

  • 在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM以前在这里保存它的类。在Java 8中,它被移除并被称为元空间的区域所取代。 PermGen和Metaspace之间最重要的区别是什么? 我知道的唯一区别是,并且忽略了VM参数。