Снова согласование триггеров при создании секрета, принадлежащего настраиваемому ресурсу
Я использовал 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
? Или это не рекомендуется, и я должен разрешить повторный прогон повторно, пока ничего не изменится?