DEV Community

Cover image for K8s Operator - Gestion du statut
Maxime Guilbert
Maxime Guilbert

Posted on

K8s Operator - Gestion du statut

Dans cette série sur les opérateurs Kubernetes, on va voir aujourd'hui quelque chose qui peut se révéler très utile, notemment pour du débuggage, la gestion du statut de vos ressources personnalisées.

A quoi sert le statut?

Le statut est la partie vous donnant un certain nombre d'information sur l'état d'une ressource. Il peut aussi servir pour donner un certain nombre d'informations qui ont été générées lors des réconciliations.


Définition de la structure du statut

Le statut doit avoir une structure afin d'être défini correctement. Cette structure va se trouver dans les fichiers api/../xxx_types.go.

Exemple

type MyProxyStatus struct {  
}
Enter fullscreen mode Exit fullscreen mode

Complètement vide au début, c'est à vous d'y ajouter ce que vous voulez!

Pour notre exemple, on va continuer ce qui avait été fait plus tôt et on va lister les noms des pods générés par le déploiement Nginx.

type MyProxyStatus struct {  
   PodNames []string `json:"pod_names"`  
}
Enter fullscreen mode Exit fullscreen mode

Vu que l'on a modifié un fichier dans le dossier api, il faut faut pas oublier de réexécuter la commande make manifests & make generate !


Remplissage du statut

Pour remplir le statut de votre ressource, il faut aller dans votre contrôleur, dans la méthode Reconcile.

La première chose que l'on va faire c'est de tenter de récupérer la liste des pods et de gérer la potentielle erreur que l'on pourrait recevoir.

podList := &corev1.PodList{}  
listOpts := []client.ListOption{  
   client.InNamespace("test_ns"),  
   client.MatchingLabels(map[string]string{  
      "test_label": myProxy.Spec.Name,  
   }),  
}  
if err = r.List(ctx, podList, listOpts...); err != nil {  
   log.Error(err, "Failed to list pods", "Example.Namespace", "test_ns")  
   return ctrl.Result{}, err  
}  
podNames := getPodNames(podList.Items)
Enter fullscreen mode Exit fullscreen mode

Comme vous pouvez le constater les recherches de liste d'item fonctionnent avec des filtres, ici on en a défini deux :

  • le nom du namespace où doivent se trouver les pods
  • un label que nos pods doivent avoir Si jamais vous avez besoin de chercher quelque chose de plus précis ou non (aucun filtre correspond à la récupération de toutes les ressources de ce type), c'est dans cette liste d'options qu'il faut aller effectuer des modifications.

Ensuite, vu qu'on a à présent la liste des noms des pods, on peut aller effectuer le traîtement pour mettre à jour le statut si besoin

if !reflect.DeepEqual(podNames, myProxy.Status.PodNames) {
    myProxy.Status.PodNames = podNames
    err := r.Status().Update(ctx, myProxy)
    if err != nil {
        log.Error(err, "Failed to update MyProxy status")
        return ctrl.Result{}, err
    }
}
Enter fullscreen mode Exit fullscreen mode

Et voilà vous savez à présent comment gérer le statut d'une ressource!

Dans le prochain point de cette série, on va voir comment compléter la partie statut d'une ressource avec les conditions!

J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient (Il n'y a jamais de questions bêtes!) ou des points qui ne sont pas clairs pour vous, n'hésitez pas à laisser un message dans les commentaires ou à me joindre directement sur LinkedIn (même pour parler d'autres sujets!).


Vous voulez me supporter?

Buy Me A Coffee

Top comments (0)