3.1.1 什么是 Kubebuilder
通过前面章节的介绍,我们了解到 Kubebuilder是一个用 Go语言构建 KubernetesAPIs的框架,通过使用Kubebuilder,用户可以遵循一套简单的编程框架,使用 CRD构建 API、Controllers和 AdmissionWebHooks,实现对 k8s的扩展。
Kubebuilder中 的 主 要 组 件 包 含 Manager、Cache、Client与 Finalizers。 其 中,Manager组件主要实现管理外层,负责初始化Controller、Cache、Client的工作;Cache组件负责生成SharedInformer,Watch关注的GVK下的GVR 的变化(增、删、改),以触发 Controller的 Reconcile逻辑;Client组件在工作中实现对资源进行 CURD操作,CURD操作封装到 Client 中进行,其中的写操作(增、删、改)直接访问 APIServer,读操作(查)对接的是本地的 Cache;Finalizers组件主要用于处理 Kubernetes资源的预删除逻辑,保障资源被删除后能够从 Cache中读取到,清理相关的其他资源。
3.1.2 Kubebuilder 架构
Kubebuilder 这 种“ 脚手架”工具,将 Kubernetes的可扩展能力 CRD 进 行了简化封装, 那么它是如何实现的呢? 下面来介绍Kubebuilder的架构及实现原理。Kubebuilder架构如图 3-1所示。
Kubebuil-der 总体上将它涉及的资源所属位置划分为四大块:UserDefined、APIScaffolds、ControllerRuntime、
Kubernetes集群。
KubebuilderScaffolds是实现这个脚手架最核心的逻辑,它借助 APIScaffolder对象模块,实现了 CRD的 Template和 Controller的核心代码块。
CRD的定义和 Controller 两个最核心的内容构建完成后,Userdefined 的模块开始发挥作用,主要是用户根据实际场景,设计 CRD的结构定义,当然这里的 CRD的数量可以有多个;另外,用户需要实现 Reconcile的逻辑,Reconcile 有什么用?为什么要实现它?这是我们即将介绍的ControllerRuntime模块的重点工作。这里,首先了解 Reconcile的含义,用户自定义了CRD结构,而在 Kubernetes集群中,想要实现这样的 CRD 结构定义,Reconcile 需要协调逻辑。举例来说,假设用户定义了 MysqlCluster{Name:demo,Num:3} 这样的结构体,而希望在系统中创建MySQL的集群,而构造 MySQL 集群的构造过程,就是 Reconcile过程做的工作。
用户自定义的部分能工作的前提是要有一个 Kubernetes集群,即架构中最下面的部分,它负责安装 CRD及运行 Controller。而如何运行 Controller及其核心逻辑?通过ControllerRuntime库可以实现。
在 ControllerRuntime模块中,Kubebuilder构建出来的 CRD会注册到 Scheme模块,它提供了 Kinds与对应的 GoType的映射,即给定了 GoType,就能够知道它的GKV(GroupKindVerision),这也是Kubernetes所有资源的注册模式。举例来说,我们给定了一个Scheme,“demo1.example.org/v1”.Demo{},这个GoType映射到demo1. example.org/v1的 DemoGVK,从 Kubernetes的 APIServer获取的部分 JSON内容见代码清单 3-1。
{
"apiVersion":"demo1.example.org/v1","kind":"Demo",
"metadata":{
...
}
通过这个 GoType,能够正确地获取 GVR的信息,从而提供给 Controller, 获取期望的状态,即协调的逻辑。而在ControllerRuntime中Controller最依赖的除了Scheme之外,还包括 Manager 的初始化、安装和启动工作。Manager 的初始化依赖 ControllerRuntime库初始化 Manager对象,包括 Client、Cache 等模块的生成工作。然后 Client就可以实现对CRD的“增、删、改、查”,即创建、删除、更新、查询等过程,而查询的逻辑是通过本地的Cache 模块实现的。这里的Cache 负责监听CRD 的变化,它是通过监听Scheme,从而收集所有与 Controller有关的GVR 资源,并创建对应的监听器,从而实现当监听到Kubernetes集群中的CRD发生变化触发 Controller的协调进程Reconcile工作。
除此之外,Kuberbuilder工具生成的内容还包括 Finalizer,它用于处理 Kubernetes资源的预删除逻辑,保障资源被删除后能够从 Cache中读取到,清理相关的其他资源;OwnerReference用于清理资源时, 对于任何一个对象, 若它的 OwnerReference字段值为待删除对象,则这个对象也会被清理,支持对象的变更,也会触发 Owner对象的Controller 的协调过程;Index 用于提供资源的缓存,提升客户端资源的查询效率。