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

开发者社区> 人民邮电出版社> 正文

带你读《云原生应用开发 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 文件结构,按照版本号进行了资源的一级划分,在上述案例中,创建了 1个 v1 版本的 Demo 类型的资源,因此,它自动生成了 {kind}types.go的文件,即 demotypes.go;同时创建了 2个 v1beta1版本的不同类型的资源,可以看到生成了 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.go、test1_types.go、test2_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)


}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
柯镇:物联网时代的阿里云一站式开发平台
本文由阿里云首席智联网科学家柯镇在苏州云栖大会分享,物联网的使命是数字化物理世界,而AI则是依赖数据而生。当物联网碰上AI,它们会碰撞出什么样的火花呢?阿里云将在整个碰撞过程中起到什么样的作用呢?让我们来瞧一瞧柯镇怎么说?
3536 0
iOS开发中 关于阿里云服务器的使用与安全策略 韩俊强的博客
使用背景:         云服务已经很多年了,早期没能加入使用云大军中的一员,后来后悔莫及。2015年记得当时没办法租用的虚拟主机三天两天挂了,导致我认认真真的考虑了一次,觉得还是要使用云服务器! 从免费的主机屋学习版到各种虚拟机的实验,再到之前是用300元左右买的别人的虚拟主机,空间有几G,感觉还行,正好又值他们搞活动,买两年送一年!预存还有返还!心动了,就没有任何考虑就预存了一千块! 开始的几个月感觉还行,速度什么的还过得去,就没去管网站的事了。
1268 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6915 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7758 0
iOS开发笔记 5、开发工具Xcode,Inteface Builder
开发工具使用Mac的安装盘或从apple站点下载 Xcode 开发代码使用 扩展名的分类 application delegate 需要处理的内容 ƒAt launch time, it must create an application’s windows and display them to the user.
589 0
DockOne微信分享(八十七):基于Docker的开发云提高资源利用率的实践
本文讲的是DockOne微信分享(八十七):基于Docker的开发云提高资源利用率的实践【编者的话】Docker的出现,为更简便、更细粒度地对云资源的调控提供了一个强有力的支撑,WeX5开发者云基于Rancher+Docker,在如何提高物理资源利用率的课题上做了一些探索和研究,在保障用户体验良好的前提下,大大提高了物理资源的利用率,有效地降低了运营成本。
1900 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载