首頁  >  文章  >  後端開發  >  Kubernetes Watch 傳回空結果(空類型,空物件)

Kubernetes Watch 傳回空結果(空類型,空物件)

PHPz
PHPz轉載
2024-02-09 12:06:08677瀏覽

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

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除