观察特定对象的事件

我们有一个按预期工作的 k8s 操作符(基于 kubebuilder),现在我们需要支持监听集群上的秘密。


以下代码正在运行,但是我得到了集群中所有秘密的事件,效率不高,


我只想为特定的秘密获取事件,让我们说特定的秘密labels/annotation,我们该怎么做?


func (r *InvReconciler) SetupWithManager(mgr ctrl.Manager) error {

    manager := ctrl.NewControllerManagedBy(mgr).

        For(&corev1alpha1.Inv{}, builder.WithPredicates(predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))).

        WithOptions(controller.Options{

        })


    manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {

        return r.secretHandler.GetSecret(a.GetNamespace(), a.GetName())

    }))


    return manager.Complete(r)

}

这是功能


func (secretReq secretHandler) GetSecret(namespace string, name string) []reconcile.Request {


    fmt.Println("secret is: ", namespace, "--", name)

    return nil

}

让我们像下面这样说秘密,并且只针对这个秘密(带有标签foo: bar)我会在创建或修改事件时得到它


apiVersion: v1

kind: Secret

metadata:

  labels:

    foo: bar

  name: mysecret

  namespace: dev

type: Opaque

data:

  USER_NAME: YWRtaW4=

  PASSWORD: dGVzdBo=

我不是在谈论if statement我得到事件之后的事件,因为它已经将所有秘密事件带到了集群中。


明月笑刀无情
浏览 131回答 2
2回答

holdtom

根据这个github源代码,您应该能够使用EnqueueRequestForObject. 但是,不可能(目前)只关注特定的秘密 CRUD 更改。EnqueueRequestForObject以监视您的 CRD 资源更改。在您的 CRD 协调器中,您将使用基于搜索定义的标签选择器获取所有 TLS 机密,然后使用匹配的机密运行您的合并逻辑。EnqueueRequestFromMapFunc以监视秘密更改并触发一个或多个 CR 的协调。在您的映射器函数中,您将获取所有 CR。对于每个具有与传递的秘密匹配的搜索定义的 CR,您将为 CR 创建一个新的 reconcile.Request,并返回请求列表,这将为每个匹配的 CR 触发您的 CRD 协调器。最干净的方法是使用标签选择器,然后将结果与现有代码合并。这篇文章中给出了使用标签选择器的示例:func GetSecret(version string) (retVal interface{}, err error){  clientset := GetClientOutOfCluster()  labelSelector := metav1.LabelSelector{MatchLabels: map[string]string{"version":version}}  listOptions := metav1.ListOptions{    LabelSelector: labels.Set(labelSelector.MatchLabels).String(),    Limit:         100,  }  secretList, err := clientset.CoreV1().Secrets("namespace").List(listOptions)  retVal = secretList.Items[0]  return retVal, err}

烙印99

这是可能的,以一种迂回的方式。您需要将选择器配置到用于设置协调器的控制器管理器中。您可以为此使用标签或字段选择器。您可以使用 为所有类型的对象设置相同的选择器DefaultSelector,也可以SelectorsByObject为不同类型的对象设置不同的选择器。import (    corev1 "k8s.io/api/core/v1"    "k8s.io/apimachinery/pkg/labels"    "k8s.io/apimachinery/pkg/selection"    "k8s.io/client-go/rest"    ctrl "sigs.k8s.io/controller-runtime"    "sigs.k8s.io/controller-runtime/pkg/cache"    "sigs.k8s.io/controller-runtime/pkg/manager")func startReconciler(cnf *rest.Config) error {    mgr, err := ctrl.NewManager(cnf, manager.Options{        NewCache: func(conf *rest.Config, opts cache.Options) (cache.Cache, error) {            // Use this selector for everything that is not mentioned in SelectorsByObject            opts.DefaultSelector = cache.ObjectSelector{                Label: labels.SelectorFromSet(labels.Set{"foo": "bar"}),            }            // Specific selectors per type of object            opts.SelectorsByObject[&corev1.Secret{}] = cache.ObjectSelector{                Label: labels.SelectorFromSet(labels.Set{"foo": "bar"}),            }            return cache.New(conf, opts)        },    })    if err != nil {        return err    }    r := &InvReconciler{}    if err := r.SetupWithManager(mgr); err != nil {        return err    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go