K8s Operator - Gestion du statut
Tags: kubernetes, devops, sre, french
Published: 2023-06-19 13:00:00

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*
```go
type MyProxyStatus struct {  
}
```

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.

```go
type MyProxyStatus struct {  
   PodNames []string `json:"pod_names"`  
}
```

> 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.
```go
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)
```

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
```go
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
    }
}
```

---

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](https://www.linkedin.com/in/maxime-guilbert-14b6a5128/) *(même pour parler d'autres sujets!)*.

---

<center><h3>Vous voulez me supporter?</h3></center>
<a href="https://www.buymeacoffee.com/mxguilbert7" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>