我正在研究一个自定义kubernetes控制器,它根据一些输入创建kubernetes秘密。作为此控制器的一部分,需要将这些秘密复制到多个名称空间。它成功地做了什么。
对于例如
CustomSecretGenerator
metadata:
names : mypersonalsecret
spec:
secret:
name: mysecret
namespace: default
target:
namespaces:
- dev
- personal
以上是控制器输入的粗略CRD。我可以将秘密从一个名称空间复制到另一个名称空间,并将所有者引用设置为我的控制器名称。
我的问题:
这是手表代码块
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
是控制对象创建的自定义控制器对象。
我尝试将ownerrefence从default / 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,
}),
}
}
然后检查所有者引用类型。