kubectl apply命令(kubectl apply create)

kubectl apply命令(kubectl apply create)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> 

讯享网

kubectl create 和apply命令的区别如下:
在这里插入图片描述
讯享网

(1)kubectl create:kubectl create命令可创建新资源。如果再次运行该命令,则会抛出错误,因为资源名称在名称空间中应该是唯一的。根据yaml文件生成新的资源,所以要求yaml文件中的配置必须是完整的。

(2)kubectl apply:将配置应用于资源。 如果资源不在那里,那么它将被创建。 kubectl apply命令可以第二次运行,因为它只是应用如下所示的配置。 在这种情况下,配置没有改变。 所以,资源没有改变。

(3)kubectl apply:根据配置文件里面列出来的内容,可只更新现有的资源配置。所以yaml文件的内容可以只写需要升级的属性。

(4)kubectl replace:使用配置文件或stdin来替换资源。支持JSON和YAML格式。如果替换当前资源,则必须提供完整的资源规范。


Kubernetes 是一个声明式的资源管理系统。用户在本地定义期望的状态,然后通过 kubectl apply 去跟更新当前集群状态中被用户指定的那一部分。然而它远没有听起来那么简单。原来的 kubectl apply 是基于客户端实现的。Apply 的时候不能简单地替换掉单个资源的整体状态,因为还有其他人也会去更改资源,比如 controllers、admissions、webhooks。那么怎样保证在改一个资源的同时,不会覆盖掉别人的改动呢?

three way merge:用户把 last applied state 存在 Pod annotations 里,在下次 apply 的时候根据 (最新状态,last applied,用户指定状态) 做 3 way diff,然后生成 patch 发送到 APIServer。但是这样做还是有问题!Apply 的初衷是让个体去指定哪些资源字段归他管理。但是原有实现既不能阻止不同个体之间互相篡改字段,也没有在冲突发生时告知用户和解决。举个例子, CoreOS 产品里自带的 controller 和用户都会去更改 Node 对象的一些特殊 labels,结果出现冲突,导致集群出故障了只能派人去修。

而现在我们终于迎来了胜利的曙光——那就是服务器端 apply。APIServer 会做 diff 和 merge 操作,很多原本易碎的现象都得到了解决。更重要的是,相比于原来用 last-applied annotations,服务器端 apply 新提供了一种声明式 API (叫 ManagedFields) 来明确指定谁管理哪些资源字段。而当发生冲突时,比如 kubectl 和 controller 都改同一个字段时,非 Admin(管理员)的请求会返回错误并且提示去解决。1.6后的新版本将跟踪并管理所有新Kubernetes对象的字段变更,确保用户及时了解哪些资源在何时进行过更改。这样一来,不同组件同时更改同一资源将会变得更加安全可靠。使用服务器端Apply实现的合并策略通常提供了更稳定的对象生命周期。服务器端Apply试图根据谁管理字段来合并字段,而不是仅仅根据值来否决字段。这样做的目的是通过减少意外干扰,使多个参与者更新同一个对象更容易、更稳定。


1、获取需要apply的资源objs, 发送到服务端(k8s的apiserver)。 因为一个yaml文件中可有多个资源创建,因此需要循环遍历objs进行apply。 关于如何使用户输入的yaml文件转换为资源的obj输入到apply的run函数中,请参考下一章节。

讯享网

2、若为ServerSideApply时, 直接patch数据。

 

2.1、patch之前可以先 dryrun 进行校验,没问题再真正执行,dryrun 会将需要做的步骤模拟执行并输出,不会真正记录操作。dry中每个阶段均正常运行,最后一个存储阶段除外。运行准入控制器以检查请求是否有效,所做的更改不会持久保存到存储中,但是将被持久保存的最终对象以及正常状态代码仍会返回给用户。

2.2、若为ServerSideApply时, 由资源映射器mapping和客户端client构建helper(Helper提供了检索或改变RESTful资源的方法)。调用helper的Patch方法通过向apiServer发送patch请求更新资源对象并返回。判断服务端apply命令是否可执行。

讯享网

3、若不为ServerSideApply时。查询需要apply的obj资源名(kind-ns-name),是否在k8s中已经创建。apply命令用来判断是更新资源还是创建资源。资源是新创建的,跳过three-way merge,直接创建即可。 如下是创建资源:

 

4.、apply命令更新资源,采用three way merge的策略用patch方法对资源进行更新

讯享网

小讯
上一篇 2025-04-29 14:00
下一篇 2025-04-25 07:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/180637.html