我正在开发一个自定义的 kubernetes 控制器,它根据一些输入创建 kubernetes 机密。作为此控制器的一部分,需要将这些机密复制到多个命名空间。它成功地做到了。
例如
CustomSecretGenerator
metadata:
names : mypersonalsecret
spec:
secret:
name: mysecret
namespace: default
target:
namespaces:
- dev
- personal
以上是控制器输入的粗略CRD。我能够将机密从一个命名空间复制到另一个命名空间,并将所有者引用设置为我的控制器名称。
我的问题:
- 如果我删除默认/mysecret 密钥,它将自动生成(使用自动生成逻辑)。但是,如果我删除其他命名空间中的密钥,即dev/mysecret或personal/mysecret,控制器不会自动生成(使用自动生成逻辑)。我试图捕获所有事件,但我怀疑控制器无法监视目标命名空间中生成的机密。
这是手表代码块
err = c.Watch(&source.Kind{Type: &corev1.Secret{}}, &handler.EnqueueRequestForOwner{
IsController: true,
OwnerType: &appv1alpha1.MyCustomController{},
})
这是使用控制器生成的所有机密的元数据部分
name: mysecret
namespace: dev
ownerReferences:
- apiVersion: com.company.app/v1alpha1
blockOwnerDeletion: true
controller: true
kind: MyCustomController
name: example-customer-controller
uid: ed2fa8c5-6855-11e9-94c6-0050569d445e
此外,我的控制器在默认命名空间中运行,并且具有对机密的所有访问权限的角色。
编辑:
这是创建密钥的代码部分。
mySecret := &corev1.Secret{
TypeMeta: meta_v1.TypeMeta{
APIVersion: "v1",
Kind: "Secret",
},
ObjectMeta: meta_v1.ObjectMeta{
Name: secretName,
Namespace: secretNamespace,
Labels: labelsforRegistryToken(crt.Name),
},
Data: map[string][]byte{
v1.DockerConfigJsonKey: jsonValue,
},
Type: corev1.SecretTypeDockerConfigJson,
}
controllerutil.SetControllerReference(crt, mySecret, r.scheme)
注意:crt
是控制对象创建的自定义控制器对象。
我尝试将所有者引用从默认/mysecret复制到dev/mysecret,控制器仍然无法检测到dev/mysecret的删除。
由于控制器无法检测到来自其他命名空间中对象的更改,因此我尝试扫描集群中的所有命名空间,并将协调循环结束
return reconcile.Result{RequeueAfter: time.Duration(15) * time.Minute}, nil
允许每 15 分钟对帐一次。控制器会响应在控制器正在运行的同一命名空间中创建的机密的事件。
您需要像这样将所有者引用添加到生成的密钥中。
func setOwnerRef(secret *corev1.Secret)error{
ownerRef := generateOwneRef(secret)
secret.SetOwnerRefrences(ownerRef)
return nil
}
func generateOwnerRef(secret *corev1.Secret) []metav1.OwnerReference {
return []metav1.OwnerReference{
*metav1.NewControllerRef(secret, schema.GroupVersionKind{
Group: appv1alpha1.SchemeGroupVersion.Group,
Version: appv1alpha1.SchemeGroupVersion.Version,
Kind: constants.ObjectKind,
}),
}
}
然后检查所有者引用类型。