crdstart demo学习笔记

github demo链接: https://github.com/idevz/crd-start

crdstart demo业务逻辑概述:
通过crd定义一个crdstart分组下v1alpha1版本的Dcreater API资源类型,
每创建一个creater-from-name的Dcreater对象时,k8s就会获取它的deploymentName和replicas属性,
并根据事先准备好的Deployment模板创建deployment.
如果这个对象有更新,就会根据更新信息,同步之前创建的deployment进行调谐。
当这个对象被删除以后,我们会将其创建的deployment所关联的pod日志落地,然后将其清理。

自定义资源控制器的开发流程概述:
首先定义资源类型 //通过crd定义
通过apply在k8s中注册它 //通过kubectl apply -f xxx-crd.yaml

CrdContoller的控制逻辑主干代码在controller.go文件中,
先是CrdController的结构体定义,
两组Clientset用于和apiserver直接通信,
各资源对象对应的Lister和InformerSynced对,表明了数据同步基于经典的List-Watch机制 ,
本地预先同步了所有关心的数据,后面通过watch机制进行增量更新。
InformerSynced标记了相关数据是否已经同步到本地。

然后在主控逻辑Run方法中,我们先要等各个资源的Informer,将目前集群中的相关数据同步到本地缓存后,再启动worker协程。
在worker处理过程中,从前面的工作队列中获取待处理的对象,
并据此构建deployment。

这里deployment对象构建相关逻辑在helper.go中实现,
其中为Deployment对象添加对应对象所有者引用和终结器,为后面在资源对象回收的过程中,能够利用k8s的级联删除垃圾回收机制打下基础。

另外helper中,关于获取Deployment对象的对应Pods对象的列表的方法,是直接引用的k8s内建的DeploymentController。
这当然不是唯一的方法,我们也可以通过client-go提供的Informer机制来实现,这里直接引用pkg/apis/apps包,是为了演示对k8s项目的整包引用。
因为当前k8s为了简化引用,将之前的一些核心模块导出到了staging目录下单独分拆提供,有时候我们为了研读k8s的源代码,希望能对它的核心逻辑做一些实验,就可以采用这种方式对k8s项目进行整包引用。

logSaveAndClean展示了通过Patch的方式,去除Deployment对象的Finalizers终结器,使Deployment对象进入K8s级联删除的垃圾回收处理过程。

原文地址:https://www.cnblogs.com/abcdef/p/13816109.html