DEV Community

Cover image for K8s Operator - Conditions
Maxime Guilbert
Maxime Guilbert

Posted on

1 1 1 1 1

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

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Billboard image

Try REST API Generation for Snowflake

DevOps for Private APIs. Automate the building, securing, and documenting of internal/private REST APIs with built-in enterprise security on bare-metal, VMs, or containers.

  • Auto-generated live APIs mapped from Snowflake database schema
  • Interactive Swagger API documentation
  • Scripting engine to customize your API
  • Built-in role-based access control

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay