修改 Operator 单分组为多分组.
背景
如果同个项目需要多个分组来区分不同的资源类型,那么我们需要要启用多个分组管理的特性来实现。
实现
kubebuilder 对多分组功能的支持很有限,很多地方都需要我们自己手动去修改。
要启用多分组特性,在项目目录下执行命令:kubebuilder edit --multigroup=true
执行完成后,项目目录下的 PROJECT 文件里面发生以下变化:
1
2
3
4
|
version: "3"
domain: isekiro.com
repo: github.com/isekiro/ops-operator
multigroup: true
|
查看 api/v1/groupversion_info.go
,通常我们使用 API 组的前缀作为目录名称,这里是 batch 。
1
2
|
//+groupName=batch.isekiro.com
package v1
|
为了让 api 结构更清晰,我们将 api 重命名为 apis,并将现有的 API 移动到新的子目录 batch 中。
1
2
3
4
5
6
|
# 创建新的目录 apis
mkdir apis/batch
mv api/* apis/batch
# 移动完目录后删除旧目录 api
rm -rf api/
|
将 API 移至新目录后,控制器也需要做相同的处理。
1
2
|
mkdir controllers/batch
mv controllers/* controllers/batch/
|
修改 main.go
文件 import
部分的的引用:
1
2
|
batchv1 "github.com/isekiro/ops-operator/apis/batch/v1"
"github.com/isekiro/ops-operator/controllers/batch"
|
修改 apis/batch/v1/webhook_suite_test.go
路径的配置,多了一层 ".."
:
1
2
3
4
5
6
7
|
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "config", "crd", "bases")},
ErrorIfCRDPathMissing: false,
WebhookInstallOptions: envtest.WebhookInstallOptions{
Paths: []string{filepath.Join("..", "..", "..", "config", "webhook")},
},
}
|
修改 controller 中控制器 import 部分的引用:
1
|
batchv1 "github.com/isekiro/ops-operator/apis/batch/v1"
|
修改 controller 目录下 suite_test.go
import 引用和路径:
1
2
3
4
5
6
7
|
batchv1 "github.com/isekiro/ops-operator/apis/batch/v1"
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
ErrorIfCRDPathMissing: true,
}
|
现在调整完了以后,我们再来看看完整的目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
├── apis
│ └── batch
│ └── v1
│ ├── groupversion_info.go
│ ├── mysqlbackup_types.go
│ ├── mysqlbackup_webhook.go
│ ├── webhook_suite_test.go
│ └── zz_generated.deepcopy.go
├── bin
│ ├── controller-gen
│ ├── kustomize
│ ├── manager
│ └── setup-envtest
├── config
│ ├── certmanager
│ │ ├── certificate.yaml
│ │ ├── kustomization.yaml
│ │ └── kustomizeconfig.yaml
│ ├── crd
│ │ ├── bases
│ │ │ └── batch.isekiro.com_mysqlbackups.yaml
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_mysqlbackups.yaml
│ │ └── webhook_in_mysqlbackups.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ ├── manager_config_patch.yaml
│ │ ├── manager_webhook_patch.yaml
│ │ └── webhookcainjection_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
│ │ ├── mysqlbackup_editor_role.yaml
│ │ ├── mysqlbackup_viewer_role.yaml
│ │ ├── role_binding.yaml
│ │ ├── role.yaml
│ │ └── service_account.yaml
│ ├── samples
│ │ └── batch_v1_mysqlbackup.yaml
│ └── webhook
│ ├── kustomization.yaml
│ ├── kustomizeconfig.yaml
│ ├── manifests.yaml
│ └── service.yaml
├── controllers
│ └── batch
│ ├── mysqlbackup_controller.go
│ └── suite_test.go
├── cover.out
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT
|
注意
请注意,在 Multi-group 项目中,Kind API 的文件被生成在 apis/<group>/<version>
目录下。 另外,请注意控制器也将在 controllers/<group>
目录下创建。