Kubernetes client-go:watch.Interface vs. cache.NewInformer vs. cache.NewSharedIndexInformer?

aka*_*vel 15 kubernetes kubernetes-go-client

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

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

    cache.NewInformer(
            cache.NewListWatchFromClient(clientset.Batch().RESTClient(), "jobs", ...),
            &batchv1.Job{},
            0,
            myHandler)
    
    Run Code Online (Sandbox Code Playgroud)

    -那么,该myHandler对象将接收OnAdd()/ OnUpdate()/OnDelete()电话。

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

    此外,IIUC,这实际上是以某种方式建立在watch.Interface上面提到的(通过NewListWatchFromClient)的基础上——所以我想它带来了一些价值,和/或修复了原始watch.Interface?

  3. cache.NewSharedInformer()并且cache.NewSharedIndexInformer()—— (呃,哇,现在这些都是一口……)我试图挖掘 godocs,但我觉得我不懂的术语完全超负荷,以至于我似乎无法掌握微妙之处(?)“常规”之间的差异NewInformerNewSharedInformerNewSharedIndexInformer...

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

Jon*_*nas 19

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

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

SharedInformers在您的 Informers 之间共享与 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)
Run Code Online (Sandbox Code Playgroud)

  • @akavel仅使用手表,有时您可能会错过事件(例如网络问题),并且可以通过定期执行_list_请求来解决...所有这些都由_Informers_为您处理。是的,sharedInformers会自动共享,但是你需要使用相同的**sharedInformerFactory**来实例化它们。 (3认同)
  • 什么低级问题?— 我似乎没有看到 Watcher 的任何内容,我特别担心我可能会错过什么?另外,如果我只是监听资源更改事件,“内存缓存”是否可以以任何方式帮助我?最后,连接共享是否通过 client-go 的内部全局变量“神奇地”发生,或者我是否必须以某种方式进行安排,例如通过确保它们是从同一个 ListerWatcher 构建的,或者其他东西?至于索引 = 对于更大的数据集,这似乎澄清了这一方面,谢谢! (2认同)
  • @akavel 这些是工厂将调用的构建块。请参阅我的代码示例,了解如何使用“SharedInformerFactory”,它的参数更少,开发人员需要考虑的技术细节更少 - 更高的抽象。 (2认同)