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

PHPz
Release: 2024-02-09 12:06:08
forward
686 people have browsed it

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
    }
....
Copy after login

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>
Copy after login
<code>
event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=coreproviders)
</code>
Copy after login

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)
Copy after login

to

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

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!