首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Informer界面查看Kubernetes Pod、Namespace和Node状态

通过Informer界面查看Kubernetes Pod、Namespace和Node状态
EN

Stack Overflow用户
提问于 2019-08-10 04:17:47
回答 1查看 752关注 0票数 1

有一种方法可以设置对K8s pod状态的监视,我可以测试其功能。

然后,podWatchController接收事件,并调用相应的处理程序。但是,此机制不适用于命名空间和节点,即NewListWatchFromClient构造函数中不存在这些选项。

请建议如何使用此模式查看Node和Namespace状态(添加、删除、更新)。

代码语言:javascript
复制
    podWatchlist := cache.NewListWatchFromClient(
       k8s.kubeClient.K8sClient.CoreV1().RESTClient(),
       string(v1.ResourcePods),
       v1.NamespaceAll,
       fields.Everything(),
    )

    // K8s Pod watcher controller
    _, podWatchController := cache.NewInformer( // also take a look at NewSharedIndexInformer
       podWatchlist,
       &v1.Pod{},
       0, //Duration is int64
       cache.ResourceEventHandlerFuncs{
           AddFunc: func(obj interface{}) {
               k8s.handleAddPod(obj)
           },
           DeleteFunc: func(obj interface{}) {
               k8s.handleDeletePod(obj)
           },
           UpdateFunc: func(oldObj, newObj interface{}) {
               k8s.handleUpdatePod(oldObj, newObj)
           },
       },
    )

    podStopChan := make(chan struct{})
    go podWatchController.Run(podStopChan)

我发现了另一种基于NewSharedInformerFactory的方法,它为pods、节点和名称空间提供了监视器;但是,我没有看到处理程序收到任何通知。这种方法可能会遗漏什么?

对于Pod:

代码语言:javascript
复制
    // 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)

对于命名空间:

代码语言:javascript
复制
    // 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)
EN

回答 1

Stack Overflow用户

发布于 2019-08-10 07:05:10

我可以通过以下更改让它工作,即我们必须调用工厂、通知程序和控制器的Run()方法。

代码语言:javascript
复制
sharedInformer.Start(podInformerChan)

podInformer.Run(podInformerChan)
podInformer.GetController().Run(podInformerChan)
nsInformer.Run(nsInformerChan)
nsInformer.GetController().Run(nsInformerChan)

然而,仍然有一些错误显示并试图理解它们是什么。目前,他们正指向这条线。

https://github.com/kubernetes/client-go/blob/master/tools/cache/shared_informer.go#L612

代码语言:javascript
复制
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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57436619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档