【问题标题】:How to watch events on a kubernetes service using its go client如何使用其 go 客户端在 kubernetes 服务上观看事件
【发布时间】:2017-04-19 21:47:54
【问题描述】:

我希望在 kubernetes 上使用 client-go 更改服务时收到通知。

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

    这可以这样完成:

    package main
    
    import (
        "fmt"
        "flag"
        "time"
    
        "k8s.io/client-go/kubernetes"
        "k8s.io/client-go/pkg/api/v1"
        "k8s.io/client-go/tools/clientcmd"
        "k8s.io/client-go/tools/cache"
        "k8s.io/client-go/pkg/fields"
    )
    
    var (
        kubeconfig = flag.String("kubeconfig", "./config", "absolute path to the kubeconfig file")
    )
    
    func main() {
        flag.Parse()
        config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
        if err != nil {
            panic(err.Error())
        }
        clientset, err := kubernetes.NewForConfig(config)
        if err != nil {
            panic(err.Error())
        }
    
        watchlist := cache.NewListWatchFromClient(clientset.Core().RESTClient(), "services", v1.NamespaceDefault,
            fields.Everything())
        _, controller := cache.NewInformer(
            watchlist,
            &v1.Service{},
            time.Second * 0,
            cache.ResourceEventHandlerFuncs{
                AddFunc: func(obj interface{}) {
                    fmt.Printf("service added: %s \n", obj)
                },
                DeleteFunc: func(obj interface{}) {
                    fmt.Printf("service deleted: %s \n", obj)
                },
                UpdateFunc:func(oldObj, newObj interface{}) {
                    fmt.Printf("service changed \n")
                },
            },
        )
        stop := make(chan struct{})
        go controller.Run(stop)
        for{
            time.Sleep(time.Second)
        }
    }
    

    【讨论】:

    • 由于导入,这不会编译。可以更新一下吗?
    【解决方案2】:

    这是最新版本的client-go的使用示例。根据上面的代码。

        package main
    
        import (
            "fmt"
            "time"
    
             "github.com/golang/glog"
    
             "k8s.io/api/core/v1"
             "k8s.io/apimachinery/pkg/fields"
             "k8s.io/client-go/kubernetes"
             "k8s.io/client-go/tools/cache"
             "k8s.io/client-go/tools/clientcmd"
        )
    
        func main() {
            config, err := clientcmd.BuildConfigFromFlags("", "")
            if err != nil {
                glog.Errorln(err)
            }
            clientset, err := kubernetes.NewForConfig(config)
            if err != nil {
                glog.Errorln(err)
            }
    
            watchlist := cache.NewListWatchFromClient(
                clientset.CoreV1().RESTClient(),
                string(v1.ResourceServices),
                v1.NamespaceAll,
                fields.Everything(),
            )
            _, controller := cache.NewInformer( // also take a look at NewSharedIndexInformer
                watchlist,
                &v1.Service{},
                0, //Duration is int64
                cache.ResourceEventHandlerFuncs{
                    AddFunc: func(obj interface{}) {
                        fmt.Printf("service added: %s \n", obj)
                    },
                    DeleteFunc: func(obj interface{}) {
                        fmt.Printf("service deleted: %s \n", obj)
                    },
                    UpdateFunc: func(oldObj, newObj interface{}) {
                        fmt.Printf("service changed \n")
                    },
                 },
             )
             // I found it in k8s scheduler module. Maybe it's help if you interested in.
             // serviceInformer := cache.NewSharedIndexInformer(watchlist, &v1.Service{}, 0, cache.Indexers{
             //     cache.NamespaceIndex: cache.MetaNamespaceIndexFunc,
             // })
             // go serviceInformer.Run(stop)
            stop := make(chan struct{})
            defer close(stop)
            go controller.Run(stop)
            for {
                time.Sleep(time.Second)
            }
        }
    

    【讨论】:

      【解决方案3】:

      这是一个使用 SharedInformerFactory 的简单方法。

      package main
      
      import (
          "fmt"
          "time"
      
          "github.com/golang/glog"
      
          kubeinformers "k8s.io/client-go/informers"
          "k8s.io/client-go/kubernetes"
          "k8s.io/client-go/tools/cache"
          "k8s.io/client-go/tools/clientcmd"
      )
      
      func main() {
          config, err := clientcmd.BuildConfigFromFlags("", "")
          if err != nil {
              glog.Errorln(err)
          }
          clientset, err := kubernetes.NewForConfig(config)
          if err != nil {
              glog.Errorln(err)
          }
      
          kubeInformerFactory := kubeinformers.NewSharedInformerFactory(clientset, time.Second*30)
          svcInformer := kubeInformerFactory.Core().V1().Services().Informer()
      
          svcInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
              AddFunc: func(obj interface{}) {
                  fmt.Printf("service added: %s \n", obj)
              },
              DeleteFunc: func(obj interface{}) {
                  fmt.Printf("service deleted: %s \n", obj)
              },
              UpdateFunc: func(oldObj, newObj interface{}) {
                  fmt.Printf("service changed: %s \n", newObj)
              },
          },)
      
          stop := make(chan struct{})
          defer close(stop)
          kubeInformerFactory.Start(stop)
          for {
              time.Sleep(time.Second)
          }
      }
      

      【讨论】:

        【解决方案4】:
        package main
        
        import (
            "fmt"
            "flag"
            "time"
            "log"
        
            "k8s.io/client-go/kubernetes"
            "k8s.io/client-go/pkg/api/v1"
            "k8s.io/client-go/tools/clientcmd"
            "k8s.io/client-go/tools/cache"
            "k8s.io/client-go/pkg/fields"
            metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
            "k8s.io/apimachinery/pkg/watch"
        )
        
        var (
            kubeconfig = flag.String("kubeconfig", "./config", "absolute path to the kubeconfig file")
        )
        
        func main() {
            flag.Parse()
            config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
            if err != nil {
                log.Fatal(err.Error())
            }
            clientset, err := kubernetes.NewForConfig(config)
            if err != nil {
                log.Fatal(err.Error())
            }
        
            watcher, err := client.CoreV1().Services(v1.NamespaceDefault,).Watch(metav1.ListOptions{})
            if err != nil {
                log.Fatal(err)
            }
        
            for event := range watcher.ResultChan() {
                svc := event.Object.(*v1.Service)
        
                switch event.Type {
                case watch.Added:
                   fmt.Printf("Service %s/%s added", svc.ObjectMeta.Namespace, svc.ObjectMeta.Name)
                case watch.Modified:
                   fmt.Printf("Service %s/%s modified", svc.ObjectMeta.Namespace, svc.ObjectMeta.Name)
                case watch.Deleted:
                   fmt.Printf("Service %s/%s deleted", svc.ObjectMeta.Namespace, svc.ObjectMeta.Name)
                }
            }
        
        }
        

        【讨论】:

        • 这是正确答案
        猜你喜欢
        • 2023-03-25
        • 2022-08-19
        • 2017-05-23
        • 2011-08-10
        • 2021-04-27
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多