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

SharedInformerFactoryWithOptions - 无法根据标签进行过滤

SharedInformerFactoryWithOptions - 无法根据标签进行过滤

Go
红糖糍粑 2022-10-10 19:04:02
我想查看某个应用程序的 Kubernetes pod 事件。我选择了 NewSharedInformerFactoryWithOptions。我添加了适当的标签选择器,但它没有被过滤掉。因为我想使用标签过滤它:'app=nats-box'这是代码 -req, err := labels.NewRequirement("app", selection.Equals, []string{"nats-box"})    if err != nil {        log.Fatalf("error %s, bad requirement", err.Error())    }selector := labels.NewSelector()selector.Add(*req)filteredFactory := informers.NewSharedInformerFactoryWithOptions(clientset, 0, informers.WithNamespace("default"), informers.WithTweakListOptions(func(options *metav1.ListOptions) {    options.LabelSelector = selector.String()}))podInformer := filteredFactory.Core().V1().Pods().Informer()podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{    AddFunc: func(obj interface{}) {        fmt.Println("pod add")        name := obj.(*corev1.Pod).Name        labels := obj.(*corev1.Pod).Labels        fmt.Printf("pod Name: %s\nLabels - %v\n\n", name, labels)    })我得到了所有 pod 的输出,命名空间被过滤但标签没有被过滤。无法弄清楚我在哪里犯了错误。
查看完整描述

2 回答

?
慕哥6287543

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

您可以直接在中提供标签字符串opts.LabelSelector:


labelOptions := informers.WithTweakListOptions(func(opts *metav1.ListOptions) {

    opts.LabelSelector = "app=nats-box"

})

factory := informers.NewSharedInformerFactoryWithOptions(clientset, 0, informers.WithNamespace("default") ,labelOptions)

informer := factory.Core().V1().Pods().Informer()

stopper := make(chan struct{})

defer close(stopper)

informer.AddEventHandler(cache.ResourceEventHandlerFuncs{

    AddFunc: func(obj interface{}) {

        fmt.Println("pod add")

        name := obj.(*corev1.Pod).Name

        labels := obj.(*corev1.Pod).Labels

        fmt.Printf("pod Name: %s\nLabels - %v\n\n", name, labels)

    },

})

informer.Run(stopper)


查看完整回答
反对 回复 2022-10-10
?
达令说

TA贡献1821条经验 获得超6个赞

如果您想继续使用k8s.io/apimachinery/pkg/labels和选择包,您需要在调用时重新分配选择器,selector.Add 因为它返回一个副本。


所以,更换


selector := labels.NewSelector()

selector.Add(*req)

fmt.Println(selector.String()) // empty string


selector := labels.NewSelector()

selector = selector.Add(*req)

fmt.Println(selector.String()) // app=nats-box


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

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