为了账号安全,请及时绑定邮箱和手机立即绑定

观察特定对象的事件

观察特定对象的事件

Go
明月笑刀无情 2023-02-21 12:58:29
我们有一个按预期工作的 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: v1kind: Secretmetadata:  labels:    foo: bar  name: mysecret  namespace: devtype: Opaquedata:  USER_NAME: YWRtaW4=  PASSWORD: dGVzdBo=我不是在谈论if statement我得到事件之后的事件,因为它已经将所有秘密事件带到了集群中。
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

根据这个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

}


查看完整回答
反对 回复 2023-02-21
?
烙印99

TA贡献1829条经验 获得超13个赞

这是可能的,以一种迂回的方式。您需要将选择器配置到用于设置协调器的控制器管理器中。


您可以为此使用标签或字段选择器。您可以使用 为所有类型的对象设置相同的选择器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

    }


查看完整回答
反对 回复 2023-02-21
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信