Kubernetes目前常使用CRD+Controller的方式擴充套件API,官方提供了CRD程式碼的自動生成器code-generator
,主要介紹下如何使用code-generator
去生成CRD中重複的程式碼。
準備環境
首先準備go語言環境,配置好環境變數。以我當前為例,GOPATH如下:
準備初始化程式碼
因為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版本為準。
生成程式碼
預設的生成指令碼在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
。如圖:
遺留問題
由於在doc.go types.go regsiter.go
三個檔案中,只是宣告瞭package
,並未在程式碼中新增一些初始化的定義,所以目前看到目錄下沒有生成listers
和informers
。後續補充如何生成相應的程式碼。