Снова согласование триггеров при создании секрета, принадлежащего настраиваемому ресурсу

Я использовал operator-sdk для создания настраиваемого ресурса. Создание DatabaseService CR должен запускать функцию, которая создаст секрет в пространстве имен CR после его получения от третьей стороны.

Я установил CR как владельца секрета, чтобы всякий раз, когда секрет был удален вручную, функция согласования запускалась снова и воссоздала секрет.

Вот код:

      func (r *DatabaseServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    requeueResult := ctrl.Result{Requeue: true, RequeueAfter: time.Minute}
    emptyResult := ctrl.Result{Requeue: false, RequeueAfter: 0}

    ds := &operatorsv1alpha1.DatabaseService{}
    if err := r.Client.Get(context.Background(), req.NamespacedName, ds); err != nil {
        if misc.IsNotFound(err) {
            return emptyResult, nil
        })
        return requeueResult, err
    }

    secret, err := getSecretFromThirdParty(ds)
    if err != nil {
        return requeueResult, err
    }

    if err := controllerutil.SetControllerReference(ds, secret, r.Scheme); err != nil {
        logger.Error("failed to set controller reference for the secret", zap.Error(err))
        return requeueResult, err
    }

    if err := r.createOrUpdateSecret(secret, logger); err != nil {
        return requeueResult, err
    }

    return emptyResult, nil
}

func (r *DatabaseServiceReconciler) createOrUpdateSecret(secret *corev1.Secret) error {
    if err := r.createNamespaceIfNotExist(secret.Namespace, logger); err != nil {
        return err
    }
    if err := r.Client.Create(context.TODO(), secret); err == nil {
        return nil
    }
    if !apierrors.IsAlreadyExists(err) {
        return err
    }
    if err := r.Client.Update(context.TODO(), secret); err != nil {
        return err
    }
    return nil
}

Я наблюдаю, что если я установил CR как владельца секрета перед вызовом createOrUpdateSecret - Функция согласования будет запущена снова, потому что что-то в собственном объекте (секрете) изменилось.

Моя логика согласования идемпотентна, так что это не большая проблема. Однако мне не нужно запускать снова после изменений в собственном объекте, которые произошли изнутри. Прямо сейчас, каждый раз, когда Reconcile создает / обновляет секрет, он запускается снова. Такое поведение кажется немного неуклюжим и приводит к дополнительной работе для оператора и дополнительным вызовам третьей стороны.

Есть ли способ обойти повторную активацию создания / обновления согласованного объекта изнутри Reconcile? Или это не рекомендуется, и я должен разрешить повторный прогон повторно, пока ничего не изменится?

0 ответов

Другие вопросы по тегам