php小編蘋果將為大家介紹一個常見的問題:Kubernetes Watch 回傳空結果(空類型,空物件)。在使用Kubernetes進行監控時,有時會遇到傳回空結果的情況,即使叢集中存在正在執行的Pod或其他資源。這種情況可能會導致監控系統無法取得正確的數據,進而影響系統的穩定性和可靠性。本文將詳細解析這個問題的原因,並提供對應的解決方案,幫助讀者快速解決這個問題。
我正在使用 Kubernetes client-go 監視一些資源。
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 } ....
這工作正常,除了對於某些資源我得到連續的空結果: event.Object
為零,event.Type
是空字串。
這種情況會發生在這樣的資源上:
<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>
這可能是什麼原因?
我發現了這個問題。
我需要在從通道讀取時檢查結果:
case event := <-watch.ResultChan(): handleEvent(gvr, event)
至
case event, ok := <-watch.ResultChan(): if !ok { fmt.Printf("ResultChan is closed %+v\n", gvr) return nil } handleEvent(gvr, event)
如果該資源沒有對象,通道將會關閉。
以上是Kubernetes Watch 傳回空結果(空類型,空物件)的詳細內容。更多資訊請關注PHP中文網其他相關文章!