我需要我的 Go 应用程序来监视 Kubernetes 集群中的某些资源并对它们的更改做出反应。根据大量的文章和例子,我似乎找到了几种方法;然而,我无法理解它们之间的区别 - 因此,无法知道使用哪一个,这样我就不会出现一些意外的行为。具体来说:
watch.Interface.ResultChan()
—(通过例如rest.Request.Watch()
获得)—这似乎已经让我通过提供 Added
/Modified
/Deleted
事件来对资源发生的变化做出反应;
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
的一些(什么?)缺陷?
cache.NewSharedInformer()
和 cache.NewSharedIndexInformer()
— 我试图深入研究 godocs,但我感觉完全超载了我不理解的术语,以至于我似乎无法理解它们之间的区别“常规”NewInformer
vs. NewSharedInformer
vs. NewSharedIndexInformer
。
Kubernetes client-go 包中的上述 API 有何区别?
这些方法在抽象级别方面有所不同。如果更高级别的抽象适合您的需要,您应该使用它,因为许多较低级别的问题已经为您解决了。
Informers 是比 watch 更高的抽象级别,还包括 listers。在大多数用例中,您应该使用任何类型的 Informer,而不是较低级别的抽象。 Informer 内部由 watcher、lister 和 内存缓存组成。
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)