我最近在学习Kubernetes,我不太清楚“kubectl apply”和“kubectl replace”之间的区别。是否存在我们只能使用其中一个的情况?
应用
和替换
之间的区别与应用
和创建
之间的区别类似。
创建
/替换
使用命令式方法,而应用
使用声明式方法。
如果使用create
创建资源,则使用replace
进行更新。如果使用apply
创建资源,则使用apply
进行更新。
请注意,replace
和apply
都需要一个完整的规范,并且都在删除旧资源之前先创建新资源(除非指定了--force
)。
最新答案
我的原著颇具争议,事后看来,我甚至会说现在有一半是错误的。下面是一个更新的答案,我希望它会更有帮助:
补丁
,替换
,删除
,创建
,甚至编辑
这样的命令都是必须的:它们告诉kubectl要做什么Application
命令是OTOH声明性的,因为它告诉kubernetes,这里是一个期望的状态(应用命令提供的文件中的yaml),现在弄清楚如何到达那里:创建、修补、替换对象等...你明白了。所以这两个命令有很大的不同。
你可以给它你想要的改变:它会找出对象的哪些属性需要改变,而不管其他的;如果这些属性是“不可变的”(例如,一个pod的nodeName),它会抱怨,如果你然后用--force
重复这个命令,它足够聪明,知道做相当于替换--force
的事情。
一般来说,您应该倾向于应用
(必要时使用--force
),并且只有在声明性方法没有给出预期结果时才使用命令式命令(尽管我很想看到这方面的例子——我猜这只会发生在您需要几个步骤的时候,因为相互依赖会产生负面后果,如果使用应用程序的话)。
我已经详细解释了应用、替换和补丁之间的区别: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参数。