K8S code-generator
一、前言:如何操作自定义资源
client-go为每种K8S内置资源提供对应的clientset和informer。那么如果我们要监听和操作自定义资源对象,应该如何做呢?这里我们有两种方式:
方式一:使用client-go提供的dynamicClient来操作自定义资源对象,当然也可以使用RESTClient实现
方式二:使用code-generator来帮助我们生成我们需要的代码,这样我们就可以像使用client-go为内置K8S资源对象提供的方式监听和操作自定义资源
二、code-generator 生成器
代码 code-generator/cmd 目录下,包括如下:
client-gen
conversinon-gen
deepcopy-gen
go-go-protobuf
import-boss
informer-gen
lister-gen
openapi-gen
register-gen
set-gen
三. 创建自定义 CRD
其中 pkg/apis是固定的
apps是groupname,比如 apps.k8s.io/v1
v1 是 version
doc.go types.go register.go 都是自己写的,或者使用 operator-sdk 生成,在填充
四、常用code-generator标记
deep-copy标记
五、生成代码命令:
输出指令为:
$ vendor/k8s.io/code-generator/generate-groups.sh "deepcopy,client,informer,lister" \ sample-controller/pkg/generated sample-controller/pkg/apis \ samplecontroller:v1alpha1 \ --output-base "${GOPATH}/src" \ --go-header-file "${GOPATH}/src/sample-controller/hack/boilerplate.go.txt"
案例:进入项目根目录下,执行
/home/gocode/src/sample-controller/vendor/k8s.io/code-generator/generate-groups.sh all
operator-test/pkg/generated operator-test/pkg/apis crd.example.com:v1 --go-header-file=/home/gocode/src/sample-controller/hack/boilerplate.go.txt
--output-base ../
这个命令一共有6个参数,其中,第一个参数"deepcopy,client,informer,lister",可用all代替,其代表着4种标准代码生成器:
deepcopy-gen:生成DeepCopy方法实现对对象的深拷贝。
client-gen:生成强类型的客户端集合。
informer-gen:为自定义资源生成informer。
lister-gen:为自定义资源生成lister对象。
接着,我们看看其他参数含义:
1、第二个参数用于指定客户端、lister和informer代码框架的包名;
2、第三个参数是API组的基础包名;
3、第四个参数是API组列表与版本号;
4、第五个参数–output-base用于代码生成器查找包输出的基础路径;
5、第六个参数是自定义代码所用到的版权信息头