DEV Community

Cover image for K8s Operator - Conditions
Maxime Guilbert
Maxime Guilbert

Posted on

K8s Operator - Conditions

Après avoir vu comment gérer les statuts de vos ressources, aujourd'hui on va aller une étape plus loin et aller définir des Conditions.

Qu'est-ce que c'est?

En regardant des ressources Kubernetes vous avez sûrement déjà vu ces conditions, sans forcément y faire attention. Pourtant cet élément est très important!

Les conditions sont un ensemble de validations effectuées sur une ressource pour s'assurer qu'elle est dans l'état Ready.


Pourquoi les implémenter?

Si c'est important de les implémenter c'est qu'elles peuvent vous donner énormément d'informations utiles pour le débuggage.

Si on repend notre exemple, MyProxy pourrait avoir comme condition "Pods correctement démarrés". Ainsi rien qu'en regardant le statut de notre ressource, on est capable de savoir si tout se passe bien.

Un autre point où les conditions peuvent être très utiles, est pour savoir si tous les prérequis sont présents afin de pouvoir créer une ressource ou effectuer une action.


Comment l'implémenter

Tout comme le statut, il faut aller modifier la définition du statut dans api/../xxx_types.go et aller mettre à jour le statut de la ressource dans la méthode Reconcile du contrôleur.

Mise à jour de la définition du statut

Dans le statut, on va ajouter donc une nouvelle variable Conditions

type MyProxyStatus struct {  
   Conditions []metav1.Condition `json:"conditions"`  
   PodNames   []string           `json:"pod_names"`  
}
Enter fullscreen mode Exit fullscreen mode

Mise à jour de la méthode Reconcile

Tout comme pour le reste du statut, on peut modifier la valeur du contenu de Conditions et faire la mise à jour

myProxy.Status.Conditions = conditions  
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

Création des Conditions

Les conditions sont des objets plutôt simples. Ils sont composés de 4 champs

  • Status : Qui va contenir le statut de la condition. Il n'accepte que trois valeurs
    • metav1.ConditionTrue : Si la condition est résolue
    • metav1.ConditionFalse : Si la condition n'est pas résolue
    • metav1.ConditionUnknown : Si les informations manquent pour savoir si la condition est résolue ou non
  • Type : Le nom de la condition (ex: Vérifier présence pods)
  • Reason : Qui est le résumé du statut (ex: Pods présents)
  • Message : Qui est un message qui vient ajouter du détail sur la raison de la condition. (principalement utilisé pour insérer un message détaillant l'erreur qui aurait pu se produire)

Donc de là, vous pouvez créer vos méthodes qui vont créer vos conditions et remplir la variable conditions de l'exemple précédent

Exemple

func checkPodExistance(podNames []string) metav1.Condition {  
   if len(podNames) == 2 {  
      return metav1.Condition{  
         Status:  metav1.ConditionTrue,  
         Reason:  "Pods found",  
         Message: "Both pods were found",  
         Type:    "Check existance of pods",  
      }  
   } else {  
      return metav1.Condition{  
         Status:  metav1.ConditionFalse,  
         Reason:  "Pods not found",  
         Message: "The list of pod names doesn't contains the correct number of pods",  
         Type:    "Check existance of pods",  
      }  
   }  
}
Enter fullscreen mode Exit fullscreen mode

En résumé les conditions sont un outil puissant et vous ne pourrez plus vous en passer quand vous les aurez essayés!

Dans le prochain épisode de cette série, on va se focaliser sur les annotations que l'on peut ajouter dans notre opérateur!

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)