一個demo項目來了解kubebuilder的項目結構
初始化項目
mkdir demo-operator
cd demo-operator
kubebuilder init --domain demo.com --repo demo.com/tutorial
這一步建立了 Go module 工程基本的模闆檔案,引入了必要的依賴
如果不用--repo參數,也可以先
go mod init demo.com/tutorial
手動初始化一個go module工程
列印的日志
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/[email protected]
Update dependencies:
$ go mod tidy
Next: define a resource with:
$ kubebuilder create api
可以看到我這裡使用的controller-runtime是0.10.0版本。
檢視
[root@paas-m-k8s-master-1 demo-operator]# tree
.
├── config
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ └── rbac
│ ├── auth_proxy_client_clusterrole.yaml
│ ├── auth_proxy_role_binding.yaml
│ ├── auth_proxy_role.yaml
│ ├── auth_proxy_service.yaml
│ ├── kustomization.yaml
│ ├── leader_election_role_binding.yaml
│ ├── leader_election_role.yaml
│ ├── role_binding.yaml
│ └── service_account.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT
6 directories, 24 files
就是一個标準的go module項目
一些重要的檔案
- Makefile:非常重要的工具,以後編譯建構、部署、運作都會用到;
- PROJECT:kubebuilder工程的中繼資料,在生成各種API的時候會用到這裡面的資訊;
- config/default:基于kustomize制作的配置檔案,為controller提供标準配置,也可以按需要去修改調整;
- config/manager:一些和manager有關的細節配置,例如鏡像的資源限制;
- config/rbac:如果需要限制operator在kubernetes中的操作權限,就要通過rbac來做精細的權限配置了
main.go是程式的入口,初始化了Manager,由manager來管理api和controller
我們現在捋一下,k8s接收crd資源描述,crd被我們将要編寫的controllrt控制。那麼manager是什麼
manager是用來管理controller的控制器,代碼的主要功能就是啟動controller,并使多個controller共存
下面我們繼續建立crd檔案和對應的controller代碼
建立crd檔案和controller
建立api的指令如下:但先别急着執行
kubebuilder create api --group tutorial --version v1 --kind Demo
也就是常說的GVK
1)group參數表示組的概念
2)version定義版本
3)kind定義自定義資源類型
4)以上參數組成了自定義資源的yaml 的 apiVersion和kind
如果直接執行,你可能會遇到這個錯誤
原因是
在執行過程中,會根據Makefile來執行操作。
其中有一步是使用controller-gen來生成代碼
image-20240129164517895
這裡尋找controller-gen的路徑是$(shell pwd)/bin/controller-gen
并不是我之前安裝的controller-gen路徑,是以需要修改以下。
否則找不到,就會去下載下傳,但是我目前工作目錄下并沒有bin目錄。會失敗
改成
CONTROLLER_GEN = controller-gen
因為我上一篇準備工作,已經放到全局可執行了。
同理,把kustomize也順手改掉,後面的make會用到
image-20240129164933847KUSTOMIZE = kustomize
現在執行一下建立指令
image-20240129165802014
執行成功之後,檢視下目錄
image-20240129165924556
可以看到,kubebuilder自動為我們建立了幾個關鍵的目錄和檔案
- api/v1 :對應于建立時指定的version v1。 名字demo對應我們建立時指定的Kind
- config/crd
- controllers
我們檢視幾個重要的檔案
-
在PROJECT檔案中新增了API資源聲明
domain: demo.com
layout:
- go.kubebuilder.io/v3
projectName: demo-operator
repo: demo.com/tutorial
resources:
- api:
crdVersion: v1
namespaced: true
controller: true
domain: demo.com
group: tutorial
kind: Demo
path: demo.com/tutorial/api/v1
version: v1
version: "3"
- 新增了api目錄,包含crd的類型定義
- 新增了crd目錄,是crd的描述檔案
- 在rbac目錄中新增了對應的role檔案
- 新增controller目錄,包含controller檔案
-
還有一個不容易發現的修改點是main.go檔案
if err = (&controllers.DemoReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Demo")
os.Exit(1)
}
注冊了我們的controller
一些不重要的檔案
可以看到在api下還有兩個檔案
- groupversion_info.go
- zz_generated.deepcopy.go
這兩個檔案都不需要去修改。groupversion_info是一些group和version資訊,zz_generated.deepcopy.go是會自動生成的。