K8s Operator - Gestion du statut
Maxime Guilbert
Posted on June 19, 2023
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 {
}
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"`
}
Vu que l'on a modifié un fichier dans le dossier
api
, il faut faut pas oublier de réexécuter la commandemake 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)
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
}
}
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?
Posted on June 19, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.