使用 controllerutil 优化代码
代码在:
https://github.com/tangx/kubebuilder-zero-to-one
在之前的代码中, 对于 OwnerReference 和 Finalizers 操作我们自己实现了一些方法。 其实这些操作官方已经封好成包了, 开箱即用。
复制 /controllers/helper
保存为 /controllers/helper2
。 前者保存手工代码, 后者保存优化代码。
https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil
Finalizers 操作
之前
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
|
// 添加
func appendFinalizers(redis *appv1.Redis, name string){
// 如果 pod.Name 不在 finalizers 中, 则为新增 pod。
// 使用 Finalizer 管理创建的 Pod。 当 pod 被删除完的时候,才能删除 redis
redis.Finalizers = append(redis.Finalizers, name)
}
// 存在判断
func isPodExistInFinalizers2(redis *appv1.Redis, name string) bool {
for _, rname := range redis.Finalizers {
if rname == name {
return true
}
}
return false
}
// 删除
func deleteFromFinalizers(redis *appv1.Redis, name string) {
for i, rname := range redis.Finalizers {
if rname == name {
redis.Finalizers = append(redis.Finalizers[:i], redis.Finalizers[i+1:]...)
return
}
}
}
|
之后
1
2
3
4
5
6
7
8
| // 添加
controllerutil.AddFinalizer(redis, name)
// 存在判断
controllerutil.ContainsFinalizer(redis, pod.Name)
// 删除
controllerutil.RemoveFinalizer(redis, pod.Name)
|
OwnerReference 操作
之前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
func ownerReference(config appv1.Redis) metav1.OwnerReference {
return metav1.OwnerReference{
APIVersion: config.APIVersion,
Kind: config.Kind,
Name: config.Name,
UID: config.UID,
Controller: ptrBool(true),
BlockOwnerDeletion: ptrBool(true),
}
}
func ptrBool(b bool) *bool {
return &b
}
|
之后
1
2
| // 创建 pod 时添加 OwnerReference
controllerutil.SetOwnerReference(redis, pod, scheme)
|
其中 scheme 为 RedisReconciler
中的 Scheme 字段
1
2
3
4
5
| // RedisReconciler reconciles a Redis object
type RedisReconciler struct {
client.Client
Scheme *runtime.Scheme
}
|