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

PHPz
Lepaskan: 2024-02-09 12:06:08
ke hadapan
708 orang telah melayarinya

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
    }
....
Salin selepas log masuk

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

Apakah sebabnya?

Penyelesaian

Saya jumpa masalah ini.

Saya perlu menyemak keputusan semasa membaca dari saluran:

case event := <-watch.ResultChan():
            handleEvent(gvr, event)
Salin selepas log masuk

kepada

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

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan