带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析(一)

简介: 带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析

CRD创建

通过对Kubebuilder的介绍,我们已经了解了Kubebuilder 的功能与原理。从本节开始,我们深入分析 Kubebuilder 各模块的运行原理。首先,我们通过添加几条命令来添加几个自定义 CRD,Group表示 CRD所属的组,它可以支持多种不同版本、不同类型的资源构建;Version表示 CRD的版本号;Kind表示 CRD的类型,具体见代码清单 3-2。

#kubebuildercreateapi--groupdemo--versionv1--kindDemo

#kubebuildercreateapi--groupship--versionv1beta1--kindTest1#kubebuildercreateapi--groupship--versionv1beta1--kindTest2

 

执行上述命令后,我们先来看一下API层多出来的 CRD 文件结构,按照版本号进行了资源的一级划分,在上述案例中,创建了 1v1 版本的 Demo 类型的资源,因此,它自动生成了 {kind}types.go的文件,即 demotypes.go;同时创建了 2v1beta1版本的不同类型的资源,可以看到生成了 2个资源文件,分别是 test1_types.go、test2_types.go。我们看到 Kind定义的资源类型在Kubernetes 中一定以大写字母开头,而它的资源文件都自动转化成小写字母,这是Kubernetes的一种约定。并且在每个版本的资源生成的过程中, 都会包含 groupversion_info.go、zz_generated.deepcopy.go 文件,它们的作用是什么呢? 这Scheme模块的原理有关,即 Scheme通过这 2个文件实现了 CRD的注册及资源的拷贝,具体见代码清单 3-3。

[root@crd/demo]#treeapi/api/

├──v1

│       ├──demo_types.go

│       ├──groupversion_info.go

│       └──zz_generated.deepcopy.go

└──v1beta1

├──groupversion_info.go

├──test1_types.go

├──test2_types.go

└──zz_generated.deepcopy.go


到这里,细心的读者会思考上述 3个资源的定义文件,除了类型、版本号、所属组不同,即   demo_types.gotest1_types.gotest2_types.go,这几个文件的内容有什么实质性的差异吗?下面我们继续看一下资源文件的具体内容,经过实践我们发现,资源本身的结构 除了名称上的差异,并无任何区别。换句话说,Kubebuilder创建出来的 CRD,结构体是相似的,用户只需要定义自己资源的结构体、做 Controller的协调部分的逻辑。这个简化 过程,对于初次接触 KubernetesCRD 的用户来说非常有益,可以帮助用户快速构建应用。


下面我们挑选其中的test1_types.go内容进行说明(截取部分内容。Test1表明资源的结构体,包括 metadata、spec、status,以及继承的 Kubernetes资源属性,如 kind、apiVersion等;Test1List 表明资源的列表结构体,即当用户查询这一类资源时,各test1内容放在了Items键的下面。另外,init() 初始化方法的作用是将资源的类型注册到Scheme对应的 ship组的 v1beta1版本下,在介绍 Kubebuilder框架的时候,我们提及了Scheme作用,在这里就体现了,具体见代码清单 3-4。

typeTest1struct{

metav1.TypeMeta        `json:",inline"`metav1.ObjectMeta`json:"metadata,omitempty"`Spec    Test1Spec          `json:"spec,omitempty"`StatusTest1Status`json:"status,omitempty"`

}

typeTest1Liststruct{

metav1.TypeMeta`json:",inline"`



metav1.ListMeta`json:"metadata,omitempty"`Items          []Test1`json:"items"`

}

funcinit(){

SchemeBuilder.Register(&Test1{},&Test1List{})

}

 

除了CRD的定义外,我们还需要思考它的 Controller部分,这也可以通过代码清单 3-2的几条命令初始化出来的 Controller 文件来理解。下面,我们先来看一下文件的结构,其中每一个 CRD,默认会创建对应的 {kind}controller.go文件,如 test1_controller.go,这就是 CRDController逻辑构造的位置,具体见代码清单 3-5。

文本框: 代码清单 3-5


[root@crd/demo]#treecontrollers/controllers/

├──demo_controller.go

├──suite_test.go

├──test1_controller.go

└──test2_controller.go

 

那么 {kind}controller.go 文件的内容是什么呢?为了阐明它的原理,我们截取部分代码。通过观察我们发现,自动生成的 Reconciler的对象名称是 {kind}Reconciler,它的主方法是 Reconcile(),即通过在这个函数的空白处填入逻辑完成对应的 CRD 构造工作,剩下的是安装、运行工作。另外,我们还发现了 SetupWithManager 方法,这个方法的作用是什么?下一节将会系统介绍。这里,我们只需要清楚,它用于 CRDController的安装。安装完成后,CRDController才能运行,具体内容见代码清单 3-6

typeDemoReconcilerstruct{client.Client

Loglogr.LoggerScheme*runtime.Scheme

}

func(r*DemoReconciler)Reconcile(reqctrl.Request)(ctrl.Result,error){

_=context.Background()

_=r.Log.WithValues("demo",req.NamespacedName)

//yourlogicherereturnctrl.Result{},nil



}

//SetupWithManagersetsupthecontrollerwiththeManager.

func (r*DemoReconciler)SetupWithManager(mgrctrl.Manager)error{returnctrl.NewControllerManagedBy(mgr).

For(&yangweiweiv1.Demo{}).

Complete(r)


}

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
国诚投顾携手阿里云,依托Serverless架构实现技术全面升级,构建高弹性、智能化技术底座,提升业务稳定性与运行效率。通过云原生API网关、微服务治理与智能监控,实现流量精细化管理与系统可观测性增强,打造安全、敏捷的智能投顾平台,助力行业数字化变革。
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods 技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
12月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
运维 Cloud Native 测试技术
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
|
10月前
|
人工智能 Cloud Native 算法
拔俗云原生 AI 临床大数据平台:赋能医学科研的开发者实践
AI临床大数据科研平台依托阿里云、腾讯云,打通医疗数据孤岛,提供从数据治理到模型落地的全链路支持。通过联邦学习、弹性算力与安全合规技术,实现跨机构协作与高效训练,助力开发者提升科研效率,推动医学AI创新落地。(238字)
625 7
|
12月前
|
弹性计算 运维 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生Serverless实践
简介: 通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
253 1
|
11月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
522 8
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
1389 1
云原生信息提取系统:容器化流程与CI/CD集成实践