作者:Antoine Pelisse(谷歌)
服务器端应用(Server-side Apply)是什么?
服务器端应用是将“kubectl apply”迁移到apiserver的重要工作。该项目由Apply工作组于2018年启动。
使用kubectl以声明方式应用资源有以下挑战:
服务器端应用是一种新的合并算法,以及跟踪字段所有权,运行在Kubernetes api-server上。服务器端应用支持新的特性,比如冲突检测,这样系统就可以知道两个参与者何时试图编辑相同的字段。
它是如何工作的,managedFields是什么?
服务器端应用通过跟踪系统的哪个参与者更改了对象的每个字段来工作。它将所有更新分散到对象,并记录所有已更改的字段以及操作的时间。所有这些信息都存储在对象元数据中的managedFields中。由于对象可以有许多字段,所以这个字段可能非常大。
当有人应用时,我们可以使用存储在managedFields中的信息来报告相关冲突,并帮助合并算法执行正确的操作。
它不是在1.18之前就已经是Beta版了吗?
是的,服务器端应用程序从1.16起就已经是Beta版了,但是它没有跟踪与未应用的对象相关联的字段的所有者。这意味着大多数对象没有存储managedFields元数据,这些对象的冲突无法解决。在Kubernetes 1.18中,所有新对象都将附加managedFields,并提供关于冲突的准确信息。
我如何使用它?
最常用的方法是通过kubectl:kubectl apply --server-side。这可能会显示与其他参与者的冲突,包括客户端应用。当发生这种情况时,可以使用--force-conflicts标志强制冲突,该标志将获取已更改字段的所有权。
当前的限制
目前我们有两个重要的限制,特别是在子资源方面。第一种情况是,如果你应用了一个状态,那么该状态将被忽略。我们仍在尝试获取字段,这可能会导致无效的冲突。另一个是我们没有更新某些子资源(包括scale)上的managedFields,因此你可能看不到关于水平pod自动调度器更改副本数量的信息。
下一步是什么?
我们正在努力改进用kubectl使用服务器端应用程序的体验,并试图使其成为默认设置。作为其中的一部分,我们希望改进从客户端到服务器端的迁移。
我能帮忙吗?
当然!Apply工作小组申请可以在slack #wg-apply上找到,通过邮件列表,以及我们每隔一个星期二在Zoom上9.30PT见面。我们有许多令人兴奋的特性要构建,并且可以使用各种帮助。
我们也想借此机会感谢所有贡献者的辛勤工作,使这个新的测试版成为可能:
点击【https://kubernetes.cn/blog/2020/04/01/kubernetes-1.18-feature-server-side-apply-beta-2/】阅读英文原文。