卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34762本站已运行393

Kubernetes Watch 返回空结果(空类型,空对象)

kubernetes watch 返回空结果(空类型,空对象)

php小编苹果将为大家介绍一个常见的问题:Kubernetes Watch 返回空结果(空类型,空对象)。在使用Kubernetes进行监控时,有时会遇到返回空结果的情况,即使在集群中存在正在运行的Pod或其他资源。这种情况可能会导致监控系统无法获取到正确的数据,进而影响系统的稳定性和可靠性。本文将详细解析这个问题的原因,并提供相应的解决方案,帮助读者快速解决这个问题。

问题内容

我正在使用 Kubernetes client-go 监视一些资源。

func watchGVR(ctx context.Context, args *Arguments, dynClient *dynamic.DynamicClient, gvr schema.GroupVersionResource) error {
    //if gvr.Group==" events.k8s.io" && gvr.Resource==
    fmt.Printf("Watching %q %qn", gvr.Group, gvr.Resource)
    watch, err := dynClient.Resource(gvr).Watch(context.TODO(), metav1.ListOptions{})
    if err != nil {
        fmt.Printf("..Error watching %v. group %q version %q resource %qn", err,
            gvr.Group, gvr.Version, gvr.Resource)
        return err
    }
    defer watch.Stop()
    for {
        select {
        case event := <-watch.ResultChan():
            handleEvent(gvr, event)
        case <-ctx.Done():
            return nil
        }
    }
}

func handleEvent(gvr schema.GroupVersionResource, event watch.Event) {
    if event.Object == nil {
        fmt.Printf("event.Object is nil? Skipping this event. Type=%s %+v gvr: (group=%s version=%s resource=%s)n", event.Type, event,
            gvr.Group, gvr.Version, gvr.Resource)
        return
    }
    gvk := event.Object.GetObjectKind().GroupVersionKind()
    obj, ok := event.Object.(*unstructured.Unstructured)
    if !ok {
        fmt.Printf("Internal Error, could not cast to Unstructered %T %+vn", event.Object, event.Object)
        return
    }
....

这工作正常,除了对于某些资源我得到连续的空结果: event.Object 为零,event.Type 是空字符串。

这种情况会发生在这样的资源上:


event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=addonproviders)

event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=coreproviders)

这可能是什么原因?

解决方法

我发现了这个问题。

我需要在从通道读取时检查结果:

case event := <-watch.ResultChan():
            handleEvent(gvr, event)

case event, ok := <-watch.ResultChan():
            if !ok {
                fmt.Printf("ResultChan is closed %+vn", gvr)
                return nil
            }
            handleEvent(gvr, event)

如果该资源没有对象,通道将关闭。

卓越飞翔博客
上一篇: 如何删除在 mongodb 中插入嵌套结构时添加的附加键
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏