Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kubernetes Watch mengembalikan hasil kosong (jenis kosong, objek kosong)

Kubernetes Watch mengembalikan hasil kosong (jenis kosong, objek kosong)

PHPz
PHPzke hadapan
2024-02-09 12:06:08709semak imbas

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

Editor PHP Apple akan memperkenalkan anda kepada masalah biasa: Kubernetes Watch mengembalikan hasil kosong (jenis kosong, objek kosong). Apabila memantau dengan Kubernetes, anda kadangkala menghadapi situasi di mana hasil kosong dikembalikan walaupun terdapat Pod yang sedang berjalan atau sumber lain dalam kelompok. Keadaan ini boleh menyebabkan sistem pemantauan tidak dapat memperoleh data yang betul, seterusnya menjejaskan kestabilan dan kebolehpercayaan sistem. Artikel ini akan menganalisis punca masalah ini secara terperinci dan menyediakan penyelesaian yang sepadan untuk membantu pembaca menyelesaikan masalah ini dengan cepat.

Kandungan soalan

Saya menggunakan klien Kubernetes-go untuk memantau beberapa sumber.

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

Ini berfungsi dengan baik, kecuali untuk beberapa sumber saya mendapat hasil kosong berturut-turut: event.Object 为零,event.Type ialah rentetan kosong.

Ini berlaku dengan sumber seperti ini:

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

Apakah sebabnya?

Penyelesaian

Saya jumpa masalah ini.

Saya perlu menyemak keputusan semasa membaca dari saluran:

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

kepada

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

Jika sumber tidak mempunyai objek, saluran akan ditutup.

Atas ialah kandungan terperinci Kubernetes Watch mengembalikan hasil kosong (jenis kosong, objek kosong). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam