Контроллер Kubernetes не может обнаружить события для реестра ресурсов со ссылками на владельца как тот же объект контроллера - PullRequest
0 голосов
/ 27 апреля 2019

Я работаю над пользовательским контроллером kubernetes, который создает секреты kubernetes на основе некоторых входных данных. Как часть этого контроллера требуется скопировать эти секреты в несколько пространств имен. Который это успешно делает.

Например,

CustomSecretGenerator 

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

Выше - грубая CRD входа контроллера. Я могу копировать секреты из одного пространства имен в другое, указав ссылку на владельца на имя моего контроллера.

Моя проблема:

  1. Если я удалю секрет по умолчанию / 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

Кроме того, мой контроллер работает в пространстве имен по умолчанию и играет роль со всем доступом к секретам.

EDIT:

Это часть кода, которая создает Секрет.

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.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Поскольку контроллер не смог обнаружить изменения объекта в другом пространстве имен, я попытался отсканировать все пространства имен в кластере и завершил цикл согласования с

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

, чтобы разрешить сверку каждые 15 минут.Контроллер отвечает на события секретами, созданными в том же пространстве имен, в котором работает контроллер.

0 голосов
/ 27 апреля 2019

вам нужно добавить ссылки на владельцев в сгенерированные секреты, подобные этой.

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

, а затем вы проверяете тип ссылки владельца.

...