天天看點

kubebuilder(2)建立項目及初始化

一個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項目

一些重要的檔案

  1. Makefile:非常重要的工具,以後編譯建構、部署、運作都會用到;
  2. PROJECT:kubebuilder工程的中繼資料,在生成各種API的時候會用到這裡面的資訊;
  3. config/default:基于kustomize制作的配置檔案,為controller提供标準配置,也可以按需要去修改調整;
  4. config/manager:一些和manager有關的細節配置,例如鏡像的資源限制;
  5. config/rbac:如果需要限制operator在kubernetes中的操作權限,就要通過rbac來做精細的權限配置了

main.go是程式的入口,初始化了Manager,由manager來管理api和controller

kubebuilder(2)建立項目及初始化

我們現在捋一下,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

如果直接執行,你可能會遇到這個錯誤

kubebuilder(2)建立項目及初始化

原因是

在執行過程中,會根據Makefile來執行操作。

其中有一步是使用controller-gen來生成代碼

kubebuilder(2)建立項目及初始化

image-20240129164517895

這裡尋找controller-gen的路徑是$(shell pwd)/bin/controller-gen

并不是我之前安裝的controller-gen路徑,是以需要修改以下。

否則找不到,就會去下載下傳,但是我目前工作目錄下并沒有bin目錄。會失敗

改成

CONTROLLER_GEN = controller-gen

因為我上一篇準備工作,已經放到全局可執行了。

同理,把kustomize也順手改掉,後面的make會用到

kubebuilder(2)建立項目及初始化

image-20240129164933847KUSTOMIZE = kustomize

現在執行一下建立指令

kubebuilder(2)建立項目及初始化

image-20240129165802014

執行成功之後,檢視下目錄

kubebuilder(2)建立項目及初始化

image-20240129165924556

可以看到,kubebuilder自動為我們建立了幾個關鍵的目錄和檔案

  • api/v1 :對應于建立時指定的version v1。 名字demo對應我們建立時指定的Kind
  • config/crd
  • controllers

我們檢視幾個重要的檔案

  1. 在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"

  2. 新增了api目錄,包含crd的類型定義
  3. 新增了crd目錄,是crd的描述檔案
  4. 在rbac目錄中新增了對應的role檔案
  5. 新增controller目錄,包含controller檔案
  6. 還有一個不容易發現的修改點是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是會自動生成的。