19

我需要我的 Go 应用程序来监控 Kubernetes 集群中的一些资源并对它们的变化做出反应。基于大量文章和示例,我似乎找到了一些方法来做到这一点;但是,我对 Kubernetes 比较陌生,而且它们的描述对我来说太复杂了,以至于我仍然无法掌握它们之间的区别——因此,要知道使用哪一个,所以我不要出现一些意想不到的行为......特别是:

  1. watch.Interface.ResultChan()—(通过 eg 获得rest.Request.Watch())— 这似乎已经让我通过提供 // 事件来对资源发生的变化做出Added反应;ModifiedDeleted
  2. cache.NewInformer()— 当我实现 a 时cache.ResourceEventHandler,我可以将它作为最后一个参数传递:

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

    — 然后,该myHandler对象将接收//OnAdd()调用。OnUpdate()OnDelete()

    对我来说,这似乎或多或少等同于ResultChan我在上面的(1.)中得到的;一个区别是,显然现在我得到了资源的“之前”状态作为奖励,而ResultChan我只会得到它的“之后”状态。

    另外,IIUC,这实际上是建立在watch.Interface上面提到的(通过NewListWatchFromClient)之上的——所以我想它带来了一些价值,和/或修复了 raw 的一些(什么?)缺陷watch.Interface

  3. cache.NewSharedInformer()并且cache.NewSharedIndexInformer()—— (呃哇,现在这些都是满口的......)我试图深入研究 godocs,但我觉得完全被我不理解的术语所淹没,以至于我似乎无法掌握其中的微妙之处(?)“常规”NewInformer与...之间的差异NewSharedInformerNewSharedIndexInformer

有人可以帮我理解Kubernetes client-go 包中上述 API 之间的区别吗?

4

1 回答 1

23

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

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

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

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

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

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)
于 2019-12-31T13:15:36.330 回答