亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

觀察特定對象的事件

觀察特定對象的事件

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 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號