通过Informer接口监视Kubernetes Pod、命名空间和节点状态
有一种方法可以设置K8s吊舱状态的手表,我可以测试功能 然后,podWatchController接收事件并调用相应的Hander。但是,此机制不适用于命名空间和节点,即通过Informer接口监视Kubernetes Pod、命名空间和节点状态,kubernetes,google-kubernetes-engine,kubernetes-pod,Kubernetes,Google Kubernetes Engine,Kubernetes Pod,有一种方法可以设置K8s吊舱状态的手表,我可以测试功能 然后,podWatchController接收事件并调用相应的Hander。但是,此机制不适用于命名空间和节点,即NewListWatchFromClient构造函数中不存在选项 请建议如何使用此模式监视节点和命名空间状态(添加、删除、更新) 我发现了另一种基于NewsharedFormerFactory的方法,它为pod、节点和名称空间提供了观察者;但是,我没有看到处理程序收到任何通知。这种方法可能缺少什么 对于Pod: // A
NewListWatchFromClient
构造函数中不存在选项
请建议如何使用此模式监视节点和命名空间状态(添加、删除、更新)
我发现了另一种基于NewsharedFormerFactory
的方法,它为pod、节点和名称空间提供了观察者;但是,我没有看到处理程序收到任何通知。这种方法可能缺少什么
对于Pod:
// Add watcher for the Pod.
factory := informers.NewSharedInformerFactory(k8s.kubeClient.K8sClient, 0)
podInformer := factory.Core().V1().Pods().Informer()
podInformerChan := make(chan struct{})
defer close(podInformerChan)
// Pod informer state change handler
podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
// When a new pod gets created
AddFunc: func(obj interface{}) {
k8s.handleAddPod(obj)
},
// When a pod gets updated
UpdateFunc: func(oldObj interface{}, newObj interface{}) {
k8s.handleUpdatePod(oldObj, newObj)
},
// When a pod gets deleted
DeleteFunc: func(obj interface{}) {
k8s.handleDeletePod(obj)
},
})
go podInformer.GetController().Run(podInformerChan)
对于命名空间:
// Add watcher for the Namespace.
factory := informers.NewSharedInformerFactory(k8s.kubeClient.K8sClient, 0)
nsInformer := factory.Core().V1().Namespaces().Informer()
nsInformerChan := make(chan struct{})
defer close(nsInformerChan)
// Namespace informer state change handler
nsInformer.AddEventHandler(cache.ResourceEventHandlerFuncs {
// When a new namespace gets created
AddFunc: func(obj interface{}) {
k8s.handleAddNamespace(obj)
},
// When a namespace gets updated
UpdateFunc: func(oldObj interface{}, newObj interface{}) {
k8s.handleUpdateNamespace(obj)
},
// When a namespace gets deleted
DeleteFunc: func(obj interface{}) {
k8s.handleDeleteNamespace(obj)
},
})
go nsInformer.GetController().Run(nsInformerChan)
我可以通过以下更改使其工作,即我们必须调用工厂、informer和控制器的Run()方法
sharedInformer.Start(podInformerChan)
podInformer.Run(podInformerChan)
podInformer.GetController().Run(podInformerChan)
nsInformer.Run(nsInformerChan)
nsInformer.GetController().Run(nsInformerChan)
然而,仍然有一些错误显示并试图理解它们是什么。目前,他们正指向这条线
E0809 15:33:39.187411 79537共享_informer.go:611]无法识别的通知:
E0809 15:33:40.191304 79537共享_告密者。转到:611]未识别的通知:
E0809 15:33:48.227933 79537共享_告密者。转到:611]未识别的通知:
E0809 15:33:54.231458 79537共享信息者。转到:611]未识别的通知:
我可以通过以下更改使其工作,即我们必须调用工厂、信息者和控制器的Run()方法
sharedInformer.Start(podInformerChan)
podInformer.Run(podInformerChan)
podInformer.GetController().Run(podInformerChan)
nsInformer.Run(nsInformerChan)
nsInformer.GetController().Run(nsInformerChan)
然而,仍然有一些错误显示并试图理解它们是什么。目前,他们正指向这条线
E0809 15:33:39.187411 79537共享_informer.go:611]无法识别的通知:
E0809 15:33:40.191304 79537共享_告密者。转到:611]未识别的通知:
E0809 15:33:48.227933 79537共享_告密者。转到:611]未识别的通知:
E0809 15:33:54.231458 79537共享信息者。转到:611]未识别的通知:
该错误可能是底层库中的错误,除非您弄乱了内部结构?也许在githubI上检查一下,我最初会看到非常多的通知(也许这是构建informer缓存的时候)。如何停止接收这些初始通知,并仅在实际事件(例如删除pod)后接收实际状态更改。除非您弄乱了内部,否则错误可能是底层库中的错误?也许在githubI上检查一下,我最初会看到非常多的通知(也许这是构建informer缓存的时候)。如何停止接收这些初始通知,并仅在实际事件(如pod删除)后接收实际状态更改。
E0809 15:33:39.187411 79537 shared_informer.go:611] unrecognized notification: <nil>
E0809 15:33:40.191304 79537 shared_informer.go:611] unrecognized notification: <nil>
E0809 15:33:48.227933 79537 shared_informer.go:611] unrecognized notification: <nil>
E0809 15:33:54.231458 79537 shared_informer.go:611] unrecognized notification: <nil>