Kubernetes Controller无法检测具有所有者引用的资源寄存器的事件作为相同的控制器对象

问题描述 投票:0回答:2

我正在研究一个自定义kubernetes控制器,它根据一些输入创建kubernetes秘密。作为此控制器的一部分,需要将这些秘密复制到多个名称空间。它成功地做了什么。

对于例如

CustomSecretGenerator 

metadata:
 names : mypersonalsecret
spec:
 secret:
  name: mysecret
  namespace: default
 target:
  namespaces:
   - dev
   - personal

以上是控制器输入的粗略CRD。我可以将秘密从一个名称空间复制到另一个名称空间,并将所有者引用设置为我的控制器名称。

我的问题:

  1. 如果我删除默认/ mysecret秘密,它将自动生成(使用自动生成逻辑)。但是如果我删除其他命名空间中的秘密,即dev / mysecret或personal / mysecret,则控制器不会自动生成(使用自动生成逻辑)。我试图捕获所有事件,但我怀疑Controller无法监视目标命名空间中生成的秘密。

这是手表代码块

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的删除。

kubernetes controller operator-keyword watch
2个回答
1
投票

由于控制器无法检测到其他命名空间中对象的更改,因此我尝试扫描群集中的所有命名空间,并使协调循环结束

return reconcile.Result{RequeueAfter: time.Duration(15) * time.Minute}, nil

允许每15分钟进行一次和解。控制器确实响应事件到控制器运行时在同一命名空间中创建的机密。


0
投票

你需要将所有者引用添加到这样生成的秘密中。

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,
        }),
    }
}

然后检查所有者引用类型。

© www.soinside.com 2019 - 2024. All rights reserved.