目录

Operator基础-Operator多分组管理

目录

修改 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> 目录下创建。