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.
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?
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!