Kubernetes watch golang实现

wlchn · · 1426 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

第一种方法

使用k8s.io/client-go/tools/cache

func StartWatchingServices(c *Client) {
    watchlist := cache.NewListWatchFromClient(
        c.K8sClientset.CoreV1().RESTClient(),
        string(v1.ResourceServices),
        v1.NamespaceAll,
        fields.Everything(),
    )

    _, controller := cache.NewInformer(
        watchlist,
        &v1.Service{},
        0, //Duration is int64
        cache.ResourceEventHandlerFuncs{
            AddFunc: func(obj interface{}) {
                fmt.Printf("added: %s \n", obj)
            },
            DeleteFunc: func(obj interface{}) {
                fmt.Printf(deleted: %s \n", obj)
            },
            UpdateFunc: func(oldObj, newObj interface{}) {
                fmt.Printf("changed \n")
            },
        },
    )

    stop := make(chan struct{})
    defer close(stop)
    go controller.Run(stop)
    for {
        time.Sleep(time.Second)
    }
}
第二种方法

使用k8s.io/client-go/informers,可以watch CRD资源但需要使用code-generator生成clientset和informer(指CRD资源)。

func StartWatchingServices2(c *Client) {
    kubeInformerFactory := informers.NewSharedInformerFactory(c.K8sClientset, time.Second*30)
    svcInformer := kubeInformerFactory.Core().V1().Services().Informer()

    svcInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: func(obj interface{}) {
            fmt.Printf("added: %s \n", obj)
        },
        DeleteFunc: func(obj interface{}) {
            fmt.Printf("deleted: %s \n", obj)
        },
        UpdateFunc: func(oldObj, newObj interface{}) {
            fmt.Printf("changed: %s \n", newObj)
        },
    })

    stop := make(chan struct{})
    defer close(stop)
    kubeInformerFactory.Start(stop)
    for {
        time.Sleep(time.Second)
    }
}
第三种方法

使用runtimeCache "sigs.k8s.io/controller-runtime/pkg/cache", 可以watch CRD资源,无需特殊处理。下例v1alpha1.Component是CRD资源。

func StartWatchingComponents(c *Client) {
    informerCache, err := runtimeCache.New(c.RestConfig, runtimeCache.Options{})
    if err != nil {
        panic(err)
    }

    informer, err := informerCache.GetInformer(&v1alpha1.Component{})
    if err != nil {
        panic(err)
    }

    informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: func(obj interface{}) {
            fmt.Printf("added: %s \n", obj)
        },
        DeleteFunc: func(obj interface{}) {
            fmt.Printf("deleted: %s \n", obj)
        },
        UpdateFunc: func(oldObj, newObj interface{}) {
            fmt.Printf("changed: %s \n", newObj)
        },
        })

    stop := make(chan struct{})
    defer close(stop)
    informerCache.Start(stop)
    // for {
    //  time.Sleep(time.Second)
    // }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:wlchn

查看原文:Kubernetes watch golang实现

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1426 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传