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

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

PHPz
PHPzavant
2024-02-09 12:06:08683parcourir

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
    }
....

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

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)

à

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer