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 %q\n", 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 %q\n", 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 %+v\n", event.Object, event.Object) return } ....
这工作正常,除了对于某些资源我得到连续的空结果: event.Object
为零,event.Type
是空字符串。
这种情况会发生在这样的资源上:
<code> event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=addonproviders) </code>
<code> event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=coreproviders) </code>
这可能是什么原因?
我发现了这个问题。
我需要在从通道读取时检查结果:
case event := <-watch.ResultChan(): handleEvent(gvr, event)
至
case event, ok := <-watch.ResultChan(): if !ok { fmt.Printf("ResultChan is closed %+v\n", gvr) return nil } handleEvent(gvr, event)
如果该资源没有对象,通道将关闭。
以上是Kubernetes Watch 返回空结果(空类型,空对象)的详细内容。更多信息请关注PHP中文网其他相关文章!