通过Informer接口监视Kubernetes Pod、命名空间和节点状态

通过Informer接口监视Kubernetes Pod、命名空间和节点状态,kubernetes,google-kubernetes-engine,kubernetes-pod,Kubernetes,Google Kubernetes Engine,Kubernetes Pod,有一种方法可以设置K8s吊舱状态的手表,我可以测试功能 然后,podWatchController接收事件并调用相应的Hander。但是,此机制不适用于命名空间和节点,即NewListWatchFromClient构造函数中不存在选项 请建议如何使用此模式监视节点和命名空间状态(添加、删除、更新) 我发现了另一种基于NewsharedFormerFactory的方法,它为pod、节点和名称空间提供了观察者;但是,我没有看到处理程序收到任何通知。这种方法可能缺少什么 对于Pod: // A

有一种方法可以设置K8s吊舱状态的手表,我可以测试功能

然后,podWatchController接收事件并调用相应的Hander。但是,此机制不适用于命名空间和节点,即
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>