【问题标题】:Kubernetes client-go: watch.Interface vs. cache.NewInformer vs. cache.NewSharedIndexInformer?Kubernetes client-go:watch.Interface vs.cache.NewInformer vs.cache.NewSharedIndexInformer?
【发布时间】:2020-04-19 23:38:37
【问题描述】:

我需要我的 Go 应用程序来监控 Kubernetes 集群中的一些资源并对它们的变化做出反应。基于大量文章和示例,我似乎找到了一些方法来做到这一点;但是,我对 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)之上——所以我想它带来了一些价值,和/或修复了原始@ 的一些(什么?)缺陷987654343@?

  3. cache.NewSharedInformer()cache.NewSharedIndexInformer()(哇,现在 那些 已经满嘴了……) 我试图挖掘 godocs,但我觉得我完全不懂术语,以至于我似乎无法掌握“常规”NewInformerNewSharedInformerNewSharedIndexInformer 之间的细微差别(?)。 .. ????

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

【问题讨论】:

    标签: kubernetes kubernetes-go-client


    【解决方案1】:

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

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

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

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

    建议使用 SharedInformers 而不是较低级别的抽象。从相同的 SharedInformerFactory 实例化新的 SharedInformes。 Kubernetes Handbook example中有一个例子

    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)
    

    【讨论】:

    • 什么低级问题? —我似乎没有看到任何与Watcher有关的东西,我特别担心我可能会错过什么?另外,如果我只是在听资源更改事件,“内存缓存”是否对我有任何帮助?最后,连接共享是通过 client-go 的内部全局变量“神奇地”发生的,还是我必须以某种方式安排这个,例如通过确保它们是从同一个 ListerWatcher 或其他东西构建的?至于 index = 对于更大的数据集,这似乎清楚地说明了这一点,谢谢!!!
    • @akavel 只使用watch,你有时可能会错过事件(例如网络问题),可以通过定期执行list请求来解决......这一切都得到了处理Informers 为您服务。是的,sharedInformer 将自动共享,但您需要使用相同的 sharedInformerFactory 来实例化它们。
    • 所以,如果我只是运行NewSharedInformer,它不会与任何东西共享,除非我得到一些预先存在的SharedInformerFactory?那么这个函数有什么意义呢?如果我没有访问工厂的权限,我可以创建一个非共享的NewInformer 并没有什么不同?
    • @akavel 这些是工厂将调用的构建块。请参阅我的代码示例,了解如何使用 SharedInformerFactory,它的参数更少,开发人员需要考虑的技术细节更少 - 更高的抽象。
    • 谢谢;你的回答绝对有帮助;虽然你跳过了回答我提出的一些澄清问题,这让我仍然有很多疑问,所以我还没准备好将其标记为当前状态的已接受答案。
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2020-12-23
    • 2019-12-28
    • 2020-10-16
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多