Heim  >  Artikel  >  Backend-Entwicklung  >  Kubernetes Watch gibt leere Ergebnisse zurück (leerer Typ, leeres Objekt)

Kubernetes Watch gibt leere Ergebnisse zurück (leerer Typ, leeres Objekt)

PHPz
PHPznach vorne
2024-02-09 12:06:08677Durchsuche

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

PHP-Editor Apple stellt Ihnen ein häufiges Problem vor: Kubernetes Watch gibt leere Ergebnisse zurück (leerer Typ, leeres Objekt). Wenn Sie Kubernetes zur Überwachung verwenden, kommt es manchmal vor, dass leere Ergebnisse zurückgegeben werden, obwohl Pods oder andere Ressourcen im Cluster ausgeführt werden. Diese Situation kann dazu führen, dass das Überwachungssystem nicht in der Lage ist, korrekte Daten zu erhalten, wodurch die Stabilität und Zuverlässigkeit des Systems beeinträchtigt wird. In diesem Artikel wird die Ursache dieses Problems im Detail analysiert und entsprechende Lösungen bereitgestellt, um den Lesern bei der schnellen Lösung dieses Problems zu helfen.

Frageninhalt

Ich verwende Kubernetes Client-Go, um einige Ressourcen zu überwachen.

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

Das funktioniert gut, außer bei einigen Ressourcen erhalte ich aufeinanderfolgende leere Ergebnisse: event.Object 为零,event.Type ist die leere Zeichenfolge.

Das passiert mit Ressourcen wie diesen:

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

Was könnte der Grund dafür sein?

Lösung

Ich habe dieses Problem gefunden.

Ich muss das Ergebnis überprüfen, wenn ich vom Kanal lese:

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

zu

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

Wenn die Ressource keine Objekte enthält, wird der Kanal geschlossen.

Das obige ist der detaillierte Inhalt vonKubernetes Watch gibt leere Ergebnisse zurück (leerer Typ, leeres Objekt). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen