watch.Interface vs.cache.NewInformer vs.cache.NewSharedIndexInformer?

问题描述 投票:0回答:1

我需要我的 Go 应用程序来监视 Kubernetes 集群中的某些资源并对它们的更改做出反应。根据大量的文章和例子,我似乎找到了几种方法;然而,我无法理解它们之间的区别 - 因此,无法知道使用哪一个,这样我就不会出现一些意外的行为。具体来说:

  1. watch.Interface.ResultChan()
    —(通过例如
    rest.Request.Watch()
    获得)—这似乎已经让我通过提供
    Added
    /
    Modified
    /
    Deleted
    事件来对资源发生的变化做出反应;

  2. cache.NewInformer()
    — 当我实现
    cache.ResourceEventHandler
    时,我可以将其作为最后一个参数传递:

    cache.NewInformer(
            cache.NewListWatchFromClient(clientset.Batch().RESTClient(), "jobs", ...),
            &batchv1.Job{},
            0,
            myHandler)
    

    然后,

    myHandler
    对象将收到
    OnAdd()
    /
    OnUpdate()
    /
    OnDelete()
    调用。

    对我来说,这似乎或多或少相当于我在上面(1.)中得到的

    ResultChan
    ;一个区别是,显然现在我得到了资源的“之前”状态作为奖励,而使用
    ResultChan
    我只会得到它的“之后”状态。

    另外,IIUC,这实际上是以某种方式建立在上面提到的

    watch.Interface
    (通过
    NewListWatchFromClient
    )之上的——所以我猜它带来了一些价值,和/或修复了原始
    watch.Interface
    的一些(什么?)缺陷?

  3. cache.NewSharedInformer()
    cache.NewSharedIndexInformer()
    — 我试图深入研究 godocs,但我感觉完全超载了我不理解的术语,以至于我似乎无法理解它们之间的区别“常规”
    NewInformer
    vs.
    NewSharedInformer
    vs.
    NewSharedIndexInformer

Kubernetes client-go 包中的上述 API 有何区别?

go kubernetes kubernetes-go-client
1个回答
36
投票

这些方法在抽象级别方面有所不同。如果更高级别的抽象适合您的需要,您应该使用它,因为许多较低级别的问题已经为您解决了。

Informers 是比 watch 更高的抽象级别,还包括 listers。在大多数用例中,您应该使用任何类型的 Informer,而不是较低级别的抽象。 Informer 内部由 watcherlister内存缓存组成。

SharedInformers 在您的通知者之间共享与 API 服务器和其他资源的连接。

SharedIndexInformers 将索引添加到数据缓存中,以防您使用更大的数据集。

建议使用 SharedInformers 而不是较低级别的抽象。从同一个 SharedInformerFactory 实例化新的 SharedInformes。 Kubernetes 手册示例

中有一个示例
informerFactory := informers.NewSharedInformerFactory(clientset, time.Second*30)

podInformer := informerFactory.Core().V1().Pods()
serviceInformer := informerFactory.Core().V1().Services()

podInformer.Informer().AddEventHandler(
    // add your event handling 
)

// add event handling for serviceInformer

informerFactory.Start(wait.NeverStop)
informerFactory.WaitForCacheSync(wait.NeverStop)
© www.soinside.com 2019 - 2024. All rights reserved.