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
是空字符串。
这种情况会发生在这样的资源上:
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 %+v\n", gvr)
return nil
}
handleEvent(gvr, event)
如果该资源没有对象,通道将关闭。
以上就是Kubernetes Watch 返回空结果(空类型,空对象)的详细内容,更多请关注编程网其它相关文章!