Maison > développement back-end > Golang > Kubernetes Watch renvoie des résultats vides (type vide, objet vide)

Kubernetes Watch renvoie des résultats vides (type vide, objet vide)

PHPz
Libérer: 2024-02-09 12:06:08
avant
725 Les gens l'ont consulté

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

Éditeur PHP Apple vous présentera un problème courant : Kubernetes Watch renvoie des résultats vides (type vide, objet vide). Lors de la surveillance avec Kubernetes, vous rencontrez parfois des situations dans lesquelles des résultats vides sont renvoyés même si des pods ou d'autres ressources sont en cours d'exécution dans le cluster. Cette situation peut empêcher le système de surveillance d'obtenir des données correctes, affectant ainsi la stabilité et la fiabilité du système. Cet article analysera la cause de ce problème en détail et fournira les solutions correspondantes pour aider les lecteurs à résoudre rapidement ce problème.

Contenu de la question

J'utilise Kubernetes client-go pour surveiller certaines ressources.

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
    }
....
Copier après la connexion

Cela fonctionne bien, sauf pour certaines ressources, j'obtiens des résultats vides consécutifs : event.Object 为零,event.Type est une chaîne vide.

Cela arrive avec des ressources comme celle-ci :

<code>
event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=addonproviders)
</code>
Copier après la connexion
<code>
event.Object is nil? Skipping this event. Type= {Type: Object:} gvr: (group=operator.cluster.x-k8s.io version=v1alpha2 resource=coreproviders)
</code>
Copier après la connexion

Quelle pourrait en être la raison ?

Solution

J'ai trouvé ce problème.

Je dois vérifier le résultat lors de la lecture de la chaîne :

case event := <-watch.ResultChan():
            handleEvent(gvr, event)
Copier après la connexion

à

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

Si la ressource n'a aucun objet, le canal sera fermé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal