Home  >  Article  >  Backend Development  >  Kubernetes Watch returns empty results (empty type, empty object)

Kubernetes Watch returns empty results (empty type, empty object)

PHPz
PHPzforward
2024-02-09 12:06:08709browse

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

php editor Apple will introduce you to a common problem: Kubernetes Watch returns empty results (empty type, empty object). When monitoring with Kubernetes, you sometimes encounter situations where empty results are returned even though there are running Pods or other resources in the cluster. This situation may cause the monitoring system to be unable to obtain correct data, thereby affecting the stability and reliability of the system. This article will analyze the cause of this problem in detail and provide corresponding solutions to help readers quickly solve this problem.

Question content

I am using Kubernetes client-go to monitor some resources.

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
    }
....

This works fine, except that for some resources I get consecutive empty results: event.Object is zero, event.Type is an empty string.

This happens with resources like this:

<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>

What could be the reason for this?

Solution

I found this problem.

I need to check the result when reading from the channel:

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

to

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

If there is no object for this resource, the channel will be closed.

The above is the detailed content of Kubernetes Watch returns empty results (empty type, empty object). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete