Kubernetes目前常使用CRD+Controller的方式扩展API,官方提供了CRD代码的自动生成器code-generator
,主要介绍下如何使用code-generator
去生成CRD中重复的代码。git
首先准备go语言环境,配置好环境变量。以我当前为例,GOPATH以下:github
由于code-generator
是在kubernetes官网代码中截取的,因此按照kubernetes的代码生成规则,在$GOPATH/src/
下新建文件夹k8s.io
,在k8s.io文件夹下载code-generator
代码库,git clone https://github.com/kubernetes/code-generator
, cd code-generator/
,git checkout kubernetes-1.13.3
,当前以最新版的1.13.3版本为准。api
默认的生成脚本在code-generator
下的generate-groups.sh
,如我想生成./generate-groups.sh all github.com/nevermore/project/pkg/client github.com/nevermore/project/pkg/apis "foo:v1 bar:v1beta1"
,则须要在$GOPATH/src/
新建好相应的路径,mkdir -p $GOPATH/src/github.com/nevermore/project/pkg/client
,mkdir -p $GOPATH/src/github.com/nevermore/project/pkg/apis/foo/v1
,进入到v1路径下,新建三个文件touch doc.go types.go regsiter.go
,修改每一个文件开头为package v1
;同理配置apis/bar/v1beta1
相应的文件。 最终生成相应的clientset
、listers
、informers
。如图:3d
因为在doc.go types.go regsiter.go
三个文件中,只是声明了package
,并未在代码中添加一些初始化的定义,因此目前看到目录下没有生成listers
和informers
。后续补充如何生成相应的代码。code