 la formée en français ça s'appelle scène j'imagine si vous cliquez dessus vous pouvez aller sur la scène deux pour aller voir le toll de Zineb qui va vous parler de Camel integration Camel avec Quarkus avec du Kafka donc voilà et ici ça va être Christophe qui donc à un instant va nous parler donc des opérateurs bah j'ai déjà fait un peu de la pub ce matin oui parce que moi moi même je m'amuse beaucoup je fais pas mal de présentation pour des clients pour la communauté et un des sujets c'est les opérateurs et c'est en deux parties et la première partie j'explique tout simplement ce que c'est les opérateurs et le premier exemple que je montre c'est utiliser un un un un charte Elm existant et comment on peut pas cadger ça en tant que opérateur c'est toujours une intro pas mal en sous-plaît c'est tout après j'ai montré comment utiliser le SDK avec Néongo du coup et après j'ai essayé de garder le maximum de temps pour montrer qu'on peut aussi faire ça en Java et je suis l'avancement de votre projet que ce soit sur le Java SDK ou sur l'extension Quarkus avec beaucoup d'intérêt et j'ai hâte de voir ce que tu vas nous présenter donc tu sais quoi je vais te laisser la main deux minutes d'avance comme ça ça se laisse deux minutes d'orab tu peux y aller tranquille et on y va je te laisse la scène je reviens vers la fin quand c'est fini et voilà et voilà attend non non maintenant je dis n'importe quoi parce que si si si ça c'est ça je crois que c'était le jeu maintenant le jeu c'est après ton tolk excusez-moi allez bonne presse Christophe merci alors passant d'inception et du coup je présente un aveugle alors bonjour tout le monde je m'appelle christophe la print je suis ingénieur logiciel chez redat et aujourd'hui je vais vous parler donc des opérateurs en java en particulier et pourquoi les écrits en java en particulier d'abord on va commencer par une brève introduction aux opérateurs on ne peut pas passer vraiment trop de temps là dessus je pense que enfin on verra de toute façon oui n'hésitez pas à poser des questions s'il y a besoin en mon autre côté je sais pas si je vais vraiment pouvoir les voir moi je le fais ça autrement je vais faire ça comme ça désolé pour la tendance comme ça je peux voir le chat en même temps oui donc que je reprenne donc on va parler une une brève introduction des opérateurs ensuite ainsi que comme Sébastien l'a dit le plus souvent en tout cas jusqu'à présent le plus souvent les opérateurs sont écrit en go mais il y a quand même des raisons de les écrire en java et on va voir quelles sont ces raisons et pourquoi ça peut être intéressant de faire et ensuite si on a le temps enfin j'espère normalement de voir le temps je ferai une démo d'un opérateur en java alors tout d'abord qu'est ce que sont les opérateurs donc les opérateurs c'est sa cible la plateforme kubernetes et c'est un moyen d'étendre cette plateforme en fait ça reprend le mécanisme de base de kubernetes qui est l'idée de contrôleur et un contrôleur en gros une boucle de contrôle donc c'est d'où le nom de contrôleur qui en fait roche écoute les événements qui sont émis sur des ressources en particulier alors dans le cas de kubernetes les contrôleurs entre guillemets natifs s'occupent des ressources natives de kubernetes les déploiements avec les services etc mais depuis un certain temps et avec l'introduction en particulier des custom resource il est possible d'écrire des contrôleurs donc justement qui qui écoute les événements sur les custom resource et ce qui se passe donc c'est que les kubernetes quand ces custom resource sont créés kubernetes va créer des événements que les contrôleurs peuvent écouter par exemple quand on crée une ressource A il va envoyer un événement à tous les contrôleurs qui sont intéressés par par les ressources A et leur dire voilà une ressource A a été créée tel voilà la ressource et vous pouvez faire ce que vous voulez avec ça donc oui les contrôleurs sont notifiés de ces événements et ils peuvent effectivement opérer sur ces événements décider qu'on le faire et ainsi de suite ça boucle infiniment en fait tant qu'on n'arrête pas le contrôleur donc traditionnellement effectivement les opérateurs ont souvent été écrits en go pour quelle raison tout d'abord parce que go est le langage de facto pour programmer kubernetes kubernetes lui-même écrit en go donc il ya toutes les api qui sont déjà disponibles en go go par ailleurs est un langage quand même relativement facile à prendre on peut dire en tout cas qu'on peut arriver à faire des trucs en go assez rapidement après pour être experts un peu comme dans tous les langages ça prend plus de temps mais on peut en tout cas démarrer relativement facilement et un gros un autre gros intérêt de go c'est que il est compilable assez facilement fin sans nativement on va dire sur sur plusieurs plein de plateformes différentes et par la même il est assez efficace lors de l'exécution que ce soit au niveau mémoire ou au niveau au niveau taille du du binaire on parlera donc on va parler de ça justement parce que c'était justement des aspects qui pêchent un peu avec java et pour écrire les les opérateurs en go en fait on utilise la plupart du temps l'opérateur sdk qui a fait une marque qui permet de développer plus facilement des opérateurs on go on s'interface les contrôleurs s'interface à cubanites au serveur d'appeler cubanites parce que en fait je voudrais peut-être du dire ça aussi mais la façon dont dont on interagit avec cubanites la plateforme de manière programmatique on va dire c'est via un serveur d'appeler rest et donc les contrôleurs peuvent interagir avec cette plateforme via un projet qui s'appelle client go qui justement fourni jusqu'à folding entre enfin toute une plomberie fin toute une machinerie pour comment se connecter et travailler avec l'appeler rest de go de manière plus simple et par-dessus ça il y a aussi un autre projet qui s'appelle API machinery qui fourni des routines des fonctions plein d'une sorte de sur couche pour faciliter le développement d'opérateur donc tout ça bien sûr est strictement go alors pourquoi est ce que ça pourrait être bien d'écrire des opérateurs en java donc dans un premier temps java c'est plus ou moins le langage qui est enfin c'est peut-être tout à fait vrai maintenant justement à cause de l'avancé des de cubanites et du monde conteneur mais en gros c'est plus ou moins synonyme avec des applications d'entreprise et de ce fait il ya une grosse population de développeur java qui est déjà confirmé ou qui est disponible et quand on a déjà nos applications qui tournent qui sont développées en java avec nos développeurs qui connaissent la plateforme ça peut être intéressant aussi d'automatiser ce qui est ce qui est le but en fait des opérateurs peut-être que j'aurais dû dire ça aussi c'est le but des opérateurs c'est justement d'automatiser le déploiement ou le comment le fonctionnement des applications sur cubanites tout ce qui nécessite créer des ressources cubanites réagir à ce qui se passe par exemple si des potes sont tués etc le but des opérateurs c'est vraiment d'automatiser tout ça pour avoir pour pas que du coup qu'il n'y ait pas besoin que ce soit quelqu'un qui qui doit le faire et en particulier pour qu'il n'y ait pas besoin qu'il y ait des gens qui soient en call à 2h00 du matin pour réparer l'application production donc le but c'est que les applications puissent puissent se réparer entre guillemets plus ou moins tout seul via les opérateurs donc c'est un peu l'idée de la philosophie des vops si nos développeurs sont en java ça serait bien aussi qu'on puisse avoir la partie ops donc opération de notre application faite par les mêmes développeurs et donc en général ça veut dire ça pourrait vouloir dire de le faire en java aussi alors pourquoi est ce qu'on développe pas déjà des opérateurs en java et bien c'est dû au fait que traditionnellement la plateforme la gbl donc la machine virtuelle de java est optimisée essentiellement pour des projets des processus qui tournent en général pendant très longtemps sur des gros serveurs qui sont dédiés enfin en tout cas c'était le cas jusqu'à il n'y a pas si longtemps que ça donc la la plateforme a vraiment été optimisé pour ce cas d'utilisation ou en général la mémoire vive donc il n'est pas un problème ce qui se n'a un problème de rames il suffit de rajouter entre les plus bas du tout suffit de char à rajouter une barrette dans le serveur et puis voilà comme ce sont des processus aussi qui sont censés durer longtemps on est et être entre guillemets fiable pas craché par au démarrer tout le temps on n'a pas forcément besoin que la plateforme démarre rapidement ce dont on a besoin c'est de performance sur la durée à chaud on va dire donc le démarrage à froid c'est pas forcément un point fort de la gbl et malheureusement avec la production de Kubernetes et de la technologie des containers on a à peu près exactement les besoins contraires maintenant les containers peuvent potentiellement être avoir une durée de vie très courte et en général sur la plateforme on peut avoir de nombreux containers donc on essaye de limiter en gros l'application n'a pas souvent c'est pas la seule application qui tourne sur le serveur donc on essaye la mémoire et contrainte enfin en tout cas limiter et dans les dans les scénarios où on veut faire du scaling c'est à dire déployer par répondre à un demand plus élevé plus important à un moment donné la façon dont ça se fait c'est en démarrant des nouveaux pods donc avoir un démarrage à froid lent c'est vraiment un handicap pour justement parce que du coup ça revient tout le processus de scaling mais je l'ai dit bien sûr mais si jamais il y a des questions n'hésitez pas maintenant je peux les voir en supposant que j'arrive à les voir parce que je suis un peu nouveau sur cette plateforme donc on verra donc du coup avec tous ces inconvénients les inconvénients combien de cités que java a pour tourner sur une plateforme à base de containers donc Kubernetes pourquoi est ce que je vous parle de java aujourd'hui tout d'abord parce que java a évolué même si effectivement la jv a été optimisée pour des longs processus gourmand mémoire elle s'est amélioré à ce niveau là petit à petit et puis aussi entre temps il y a un projet de dorac son qui a qui a été créé qui s'appelle le cas du vilain qui permet qui une suite d'outils on va dire qui permet de de compiler des applications java en binaire natif donc ça ça permet en théorie d'avoir la promesse de d'avoir des binaire natifs donc entre guillemets qui prennent moins de mémoire et qui sont plus rapide de démarrage et aussi potentiellement plus léger en termes de de taille de binaire et donc ça permet d'offrir des caractéristiques au runtime qui sont proches de go pour les applications java compilées nativement et depuis que graal vm a été introduit et bien il y a des projets qui ont été créés pour faciliter son utilisation ce que si pour ceux d'entre vous qui ont regardé c'est pas forcément trivial de rendre une application fin de compilé natif en application java et en particulier un de ces projets c'est quarkus donc dont on va parler aussi aujourd'hui un petit peu donc avec toutes ces avancées de la plateforme java on a maintenant l'option disons de décrire nos opérateurs en java en fait c'était déjà le cas il ya déjà on pouvait déjà écrire si on n'avait pas besoin de faire du scaling ou qu'on n'avait pas les contraintes mémoire traditionnel on va dire des containers et bien on pouvait déjà écrire des opérateurs java alors il y avait plusieurs options tout d'abord l'option difficile on va dire pour ceux qui ont des difficultés à faire du java sans framework en faisant en interagissant avec la pays reste de kubernetes manuellement on va dire donc ça veut dire gérer tous les événements en bas niveau faire la sérialisation des sérialisations des objets de façon manuelle etc donc on peut voir on peut imaginer assez facilement ça même si c'est faisable c'est pas forcément ça risque de pas forcément être l'expérience la plus plaisante une autre option il ya un java client java officiel qui était créé par les développeurs kubernetes donc on peut qui permet d'interagir avec la pays reste de kubernetes plus facilement mais le problème avec ça en tout cas c'était un problème à une époque j'avoue que j'ai pas subi trop de trop près les évolutions du client de ce client là récemment mais un des problèmes c'était que c'était en gros un portage plus ou moins direct de l'apii de crayon go donc du client go et du coup c'était pas une apii très naturelle pour des développeurs java c'est pourquoi les développeurs de fabricates ont développé un autre client java alternatif qui propose des interfaces un peu plus plaisantes pour les développeurs java en particulier avec des interfaces fluentes des builders etc pour créer les objets et interagir avec l'interface reste de la plateforme kubernetes donc on voit que on a plusieurs niveaux d'abstraction qu'on peut utiliser mais jusqu'à présent tous ces efforts au niveau java c'était similaire à utiliser seulement le projet client go pour écrire des opérateurs go mais comme on l'a vu un peu plus tôt go fourni enfin l'environnement développement d'opérateurs on go fourni plusieurs autres autres comme d'outils en particulier la l'apii machinery et puis le sdk en lui-même et donc aujourd'hui je vais vous parler et vous montrer un peu comment on peut utiliser jos dk je ne sais pas comment on peut le prononcer mais en gros c'est le java opérateur sdk dont le but c'est de fournir des fonctionnalités similaires ou meilleures à ce que l'opérateur sdk et apii machinery fournissent pour les développeurs go mais en java donc ça ça cache un peu de la c'est un peu de la complexité du processus de réconciliation réconciliation donc c'est un moins un peu bizarre mais en gros c'est la boucle de contrôle des opérateurs quand un quand un utilisateur créé une custom ressource ça indique le désir de l'utilisateur d'avoir un état donné la custom ressource que l'utilisateur envoie à la plateforme Kubernetes représente l'état que l'utilisateur désirerait que le serveur est à un moment donné et du coup le rôle des opérateurs c'est de réaliser cet état sur la plateforme et ce processus ça s'appelle récon, le processus de réconciliation c'est à dire réconcilier l'état désiré avec l'état actuellement observé du cluster donc comme vous pouvez l'imaginer il y a une certaine complexité qui est impliquée dans ce processus et donc le java opérateur sdk sdk pardon simplifie ça et donc ça permet de ce de ce comment dire concentré sur les aspects business on va dire vraiment la logique de l'opérateur plutôt que que la plomberie et le panneau et le donc le java opérateur sdk fourni un framework en java donc forcément et il y a également un starter spring boot et mais aussi une une extension spécifique à quarkus qui facilite en particulier son utilisation au sein d'une application quarkus et la compilation native de cette opérateur alors je vais vous faire une une démo je ne sais pas s'il ya des questions je vérifie juste un petit truc en vitesse au niveau du temps donc il nous reste à peu près 25 minutes ok donc pour la démo on va prendre un cas d'utilisation assez simple et puis on va pas développer un opérateur très compliqué parce que on peut vraiment il ya plusieurs niveaux de support des opérateurs et là on n'a pas le temps de développer un opérateur compliqué mais on va déjà pouvoir faire des trucs assez assez marrant donc le notre cas d'utilisation c'est que on aimerait publier une une application dont on a qu'on a créé déjà on a déjà un container une image pour donc à partir de cette cette image on aimerait exposé déjà à la déployer sur Kubernetes et l'exposer à l'extérieur du cluster parce que par défaut quand on déploie une application sur sur le cluster elle est disponible pour les autres applications du cluster mais pas pas à l'extérieur du cluster donc pour ce faire on a besoin de deux ou moins trois choses on a besoin d'un deployment qui va créer enfin qui va décrire entre guillemets notre application le deployment va se gérer va gérer la création des pods où notre application va être déployée mais on n'a pas besoin de gérer les pods manuellement on va aussi avoir besoin de créer un service ce que les services c'est ce qui permet d'abstraire les pods comme on a on a parlé un peu plus tôt les pods sont ce qui enfin les parties qui font le travail on va dire sur Kubernetes et comme elles peuvent venir et partir assez assez rapidement suivant les besoins par exemple si on fait du skal up des pods peuvent être créés ou détruits donc ils ont pas une adresse pour accéder à ces pods on a besoin de stabilité au niveau des adresses IP et c'est ce à quoi sert le service ça peut faire aussi du load balancer entre les différentes instances de pods etc en gros ça fait ça permet d'avoir une IP stable pour interagir avec avec notre application qui est déployée dans ces pods donc mais le service par défaut il est interne au cluster donc on ne peut pas même si cette adresse IP est instable on ne peut pas y accéder à l'extérieur du cluster pour cela on a besoin d'avoir de créer une ressource de type ingress qui va définir comment accéder à ce service à l'extérieur du cluster donc idéalement ce qu'on aimerait bien faire c'est avoir créé une custom ressource où on spécifie juste le nom de l'application enfin la référence de l'image de notre application et puis on le donne au cluster et voilà l'opérateur va faire le boulot pour nous créer le déployement de le service l'inverse etc donc c'est bas c'est ce qu'on va faire enfin ce qu'on va essayer de faire on va créer une crd une custom ressource definition qui va s'appeler expose d'app et créer un contrôleur qui va être capable de réagir quand on crée une expose d'app sur le cluster de réagir et créer et faire le travail je vais passer en mode autre passer sur ma démo alors je sais pas j'espère que voilà on voit mon écran peu près alors j'ai commencé déjà à créer un projet pour l'instant il n'y a pas grand chose dedans juste un projet et le but donc c'est de je n'ai pas le faire complètement en live parce que ça risque de prendre trop de temps mais bon j'ai déjà créé le projet donc si là si je regarde je suis en théorie déjà connecté à mon cluster sur un space que j'ai créé qui s'appelle the nation et si on regarde un peu ce qu'il y a dans ce name space à l'heure actuelle pour l'instant il n'y a pas grand chose en termes de crd il n'y a rien non plus j'ai pas déployé de crd donc on va commencer à travailler alors l'idée c'est d'utiliser d'abord alors malgré le fait que ça soit au projet java on va utiliser l'opérateur des quai quand même parce que depuis la version 1 8 0 qui était qui est sortie il y a deux trois semaines ils ont créé un plug-in pour leur leur interface en ligne de commande qui permet de de bootstrapper fin de scafolder un un projet d'opérateur écrit en java pour se faire pour ceux qui sont familiers avec la la ligne de commande de l'opérateur sdk ça se fait avec l'opération init comme ça et là ce qu'on va faire c'est que on va initialiser initialiser donc notre projet avec la ligne de commande de clara terrasse dk qui va nous fournir un projet squelette et on lui passe on lui dit qu'on va utiliser le plug-in parcus en lui passant un nom de domaine qui sert en particulier à à fournir le groupe par exemple il est pour pour nos custom ressources et aussi les mondes package pour notre pour notre code et un nom de projet je lance cette opération si on regarde en termes de code ce qui était créé initialement il n'y avait pas grand chose dans le projet donc là l'opérateur sdk nous a créé un fichier projet un fichier pomme qu'on peut regarder un fichier mec file et puis bien sûr un projet squelette qui nous créé un opérateur par défaut et cet opérateur utilise l'extension quarkus qui nous avons développé pour le java opérateur sdk voilà avec ce code on a comme vous pouvez le voir c'est une application enfin pour ceux qui connaissent déjà quarkus c'est une application quarkus sans nom de commande et avec ce petit bout de code on a démarré on peut démarrer un opérateur donc on a on voit que notre opérateur est injecté automatiquement via cdi et dans la méthode run qui est lancée quand on lance l'application on démarre le opérateur et on attend qu'on est fini d'opérer avec avec quarkus et puis et puis voilà quoi ensuite mais bon là pour l'instant on a juste un opérateur si on lance notre opérateur avec quarkus d'elle ça va pas être très très intéressant je vais le lancer quand même forcément là on a juste un opérateur c'est cet objet opérateur en fait c'est un objet fourni par le java opérateur sdk et c'est il n'y a pas spécifiquement besoin d'interagir avec on va voir on va voir ensuite comment comment ça fonctionne et donc voilà notre opérateur est créé il s'est connecté au client et on a les informations du serveur donc on est connecté avec le client fabriquette 5.4.1 et on est connecté un serveur Kubernetes 21 mais bon comme là le seul code qu'on a c'est ce code là c'est pas très très intéressant alors la façon dont on rend les choses un peu plus intéressantes c'est de créer avec toujours avec la ligne de commande opérateur sdk c'est de créer ce qui s'appelle une API en parlance opérateur sdk et en gros créer une API c'est créer une custom resource et ça se fait de cette façon là on utilise la commande opérateur sdk créé API il fournit une version qui va correspond à la version de notre custom resource et la kind qui est entre entre guillemets la sorte la classe de notre custom resource toujours vu qu'on a déjà initialisé le projet en avec avec le plugin corcus c'est ce qui va être utilisé encore et on nous allons voir maintenant ce que ça nous a généré hop ça nous a généré plusieurs objets donc en fait quatre objets un contrôleur qui va faire le boulot non voyez un contrôleur c'est assez simple c'est une classe qui a noté avec la notation contrôleur et qui implemente l'interface resource contrôleur en lui passant la classe de notre custom resource dont il est intéressé et ensuite il ya quelques méthodes on voit que le client est injecté automatiquement et il ya quelques méthodes à implémenter si on veut mais là déjà en compilant ça ça ferait ça on n'a rien de caractère qui fonctionne mais qui veut bien sûr ne faire rien du tout on va regarder notre custom resource la custom resource elle est assez simple c'est ça étant en fait c'est une classe qui étant la classe abstraite custom resource du fabricat client et on lui passe en paramètres notre classe de spec et notre classe de status parce que l'est une bonne pratique en termes de de développement d'applications pas j'avais une cuvernitesse quand on crée des custom resource on met l'état désiré de la custom resource dans l'aspect c'est la partie avec laquelle les utilisateurs interagissent c'est là où ils définissent ceux qui veulent que l'état du cluster et le statut c'est la partie interactive où le cluster va dire voilà j'ai fait telle chose c'est en gros grâce à ça que l'opérateur va pouvoir informer l'utilisateur de ce qui se passe avec sa custom resource on a plusieurs annotations aussi donc le type la version pardon de notre cd de notre custom resource son groupe sont son kind donc son type et puis son sa version pluriel bon là on n'en a pas besoin forcément parce que c'est c'est là ça utilise le pluriel par défaut mais par contre ce qu'on va faire on va pouvoir créer d'autres on peut ajouter d'autres annotations par exemple on peut créer pour des custom resource on peut leur donner un petit nom un mot sympa plutôt que de dire voilà expose d'apps qui un peu long à écrire et pas forcément très facile on peut l'appeler par exemple ensuite si on regarde le contrôleur pareil la notation on peut rajouter des informations par exemple de la même façon qu'on a changé le petit nom le nom cours des notre custom resource on peut changer le nom de notre contrôleur l'appeler des chaînes par exemple parce que c'est un nom qui est généré par défaut mais autant avoir un truc un peu plus explicite on peut aussi spécifier un finaliser pour les gens qui connaissent pas forcément comment ça marche les custom resource en gros d'ailleurs pas forcément les custom resource mais au niveau de Kubernetes on peut rajouter ce qui s'appelle un finaliser qui va qu'il y a une sorte de marqueur qui va bloquer l' API enfin le serveur Kubernetes jusqu'à temps que ce marqueur soit enlevé avant de détruire la ressource ça permet en particulier au contrôleur de d'être sûr qu'une ressource ne va pas être détruite sans qu'ils soient informés et qu'ils peuvent qu'ils puissent faire ce dont ils ont besoin ce qu'ils ont besoin de faire avant avant que la ressource soit effectivement détruite donc là juste parce que c'est un peu plus simple dans ce cas là on peut pour notre cas d'utilisation on n'a pas besoin de finaliser donc on peut dire au contrôleur pas besoin de finaliser et on va lui dire que par défaut le contrôleur il va écouter sur tous les namespaces mais là on va lui dire de juste écouter les événements pour les custom resource sur le namespace auquel on est connecté donc ensuite notre boulot en fait ça va être de d'implementer vraiment cette méthode create or a debt resource qui va être appelé à chaque fois que comme son nom l'indique une ressource une ressource donc expose d'app est créé ou mise à jour vous voyez par rapport à interagir avec la pays Kubernetes banniveau on aurait eu besoin de créer un watcher enfin de créer entre guillemets un processus qui écouterait les événements d'expose d'app et là dans notre cas en utilisant le framework le java au caractère SDK tout ça est fait automatiquement pour nous on a juste besoin de se concentrer sur qu'est-ce qu'il faut qu'on fasse quand une ressource est créée ou mise à jour du coup on va faire ça mais comme ça prend un petit peu de temps de faire ça d'écrire tout le code et que je préfère plutôt qu'on passe du temps à expliquer le code plutôt que de que vous me regardiez l'écrire je vais remettre le projet à jour et je vais aller sur l'implémentation initiale on va regarder un peu tout ça alors tout d'abord on va regarder notre custom resource notre custom resource non en fait on n'a pas besoin de regarder d'ailleurs c'est assez classique dans les appliques les applications de type que t'entends d'utiliser avec le java au caractère SDK on a rarement besoin de vraiment travailler sur les custom resource s même même c'est plus on travaille plus au niveau de l'aspect et du status donc là comme dans notre cas d'utilisation si vous vous rappelez on veut créer une custom resource qui dont on spécifie la référence à l'image et voilà le opérateur va devoir s'occuper de faire le boulot pour nous donc en gros c'est comme ça que qu'on voudrait qu'on imagine notre custom resource on a besoin pour inter pour l'envoyer sur le cluster c'est la seule chose dont on a besoin de spécifier la paix la version de la pays qu'on veut utiliser donc avec le groupe et la version de la custom resource son type expose d'app le nom qu'on lui donne qui va être utilisé ensuite par notre contrôleur pour générer les choses dont on a besoin et puis donc la partie spec l'état désiré et bien c'est on veut utiliser une référence d'image qui est qui est là alors là j'utilise localhost 5000 parce que en fait j'ai exposé mon registry docker de mon cluster Kubernetes local et donc voilà c'est juste pour pour avoir le pour récupérer l'image qui est déjà sur mon cluster directement non ça c'est pour la partie spec pour la partie status pour l'instant on fait rien de particulier et on va regarder notre contrôleur donc notre contrôleur que va-t-il faire quand on crée une ressource et qu'on la met à jour et bien tout d'abord quand le framework contre le SDK appellent notre contrôleur il va nous passer en paramètres la ressource qui est créée ou mise à jour alors là je vous rappelle c'est un opérateur qui est vraiment très très simple il y aurait plus de logique à implémenter pour avoir un truc robuste mais là on va on va les on va couper à l'essentiel on va dire donc on va récupérer sur notre source aspect donc en haut-taque on désire son nom et à partir de la spec donc quelle image on veut enfin quelle application on veut déployer à partir de quelle image ensuite on a les les étapes de ce qu'on veut faire qui sont d'abord créé un déployement pour cette image là là on utilise la paye la paye fluente du fabriqué client où on lui dit voilà dans la paye apps créé moins un déployment créé ou replacé en place un déployment que qui est défini ainsi alors on a une méthode crée meta data qui est assez simple elle prend une ressource en paramètres et des labels les labels en fait ce sont des étiquettes qu'on ajoute à des ressources pour facilement plus facilement les retrouver ensuite il reste plus beaucoup de temps donc je vais un peu accélérer donc on crée notre notre déployment en récupérant le nom de l'image donc voilà c'est là on utilise le nom et la comment l'image qu'on a défini notre spec on va créer un service pareil en utilisant le le selector avec les labels ça nous permet ça permet aux pods de services pardon de retrouver les pods associés à notre application et ensuite on va créer un ingress en utilisant le service en utilisant comme backend le service qu'on vient de créer avec le port 80 80 parce que c'est le port qui est utilisé par l'application notre application c'est une application corcus très simple qui fait juste un hélo world en gros et on va lancer tout ça alors là normalement on n'a toujours pas de custom resource et en fait ça va être un problème parce que pour être capable de travailler sur le sur le cluster notre opérateur il a besoin de d'avoir les informations de notre des custom resource qui sont intéressantes et là on l'a pas déployé sur notre cluster parce que pas jusqu'à présent on n'a pas on n'a pas créé notre custom resource notre définition custom resource donc c'est l'erreur que qui apparaît là il nous dit que on ne peut pas enregistrer notre notre notre contrôleur parce que la source de la crd associée à notre notre custom resource n'existe pas sur le serveur mais par contre si on regarde les logs du de notre application quand elle démarre on voit on peut voir que il y a la crd a été générée automatiquement par ce qui s'appelle le crd générateur de du client fabriqué qui est un qui est inclus dans l'extension quarkus pour le java opérateur taziquette et on peut comment on peut donc appliquer cette crb elle se trouve dans par guette quoi et elle a le nom de notre voilà là elle est et elle existe je voulais vous montrer d'autres trucs parce qu'on a la possibilité de comment de dire à quarkus de générer automatiquement enfin d'appliquer automatiquement la crd sur le cluster mais là on n'a pas trop le temps je vais passer directement à je vais renoncer l'application et donc quand on veut créer interagir avec notre notre application on crée une on a notre notre cr qu'on va créer et on va l'appliquer sur le cluster voilà et nous créer notre notre notre custom resource c'est l'ocorkus et pour l'instant il n'y a rien toujours rien qui a été créé parce que l'opérateur est pas tourné pas mais là on peut voir maintenant que que là notre opérateur a tourné et il a exposé l'application sur localhost quarkus et l'eau non pardon c'est le nom d'image chat alors si on essaye d'aller sur le truc sur cette recipe on a bien notre application qui est par contre vous l'avez pas vu parce que je ne l'ai pas fait sur le bon le bon écran donc là on le voit là que c'était que l'application a bien été déployée et elle est accessible en dehors du cluster alors je suis passé très très vite et il y avait plein d'autres choses dont je voulais vous montrer mais en fait et ben on a on a terminé donc je sais pas si il y a des questions et l'eau alors il ya une question mais je crois que tu t'as répondu en montrant c'est faut-il importer le crd exposable dans le cluster cube avant de le déployer l'opérateur oui donc en théorie oui en pratique avec si on utilise l'extension parkus et c'est des choses qu'on va améliorer aussi la développe à expérience donc en théorie la crd est regenerée en fait à chaque fois donc si quand on modifie quand on modifie nos potes jours nos objets java la crd et on modifié pour possible les changements quoi et on peut l'appliquer si elle n'a pas été déjà appliqué sur sur le cluster ouais ouais ok et il ya une autre question attend l'orange comment ça se fait je les vois pas moi les questions c'est dans le chat stage alors ok j'étais pas sur le bon de chat alors il ya l'enclos qui demande désolé pour la question un peu hors sujet mais y a-t-il un bon moyen de gérer l'évolution de la syntaxe de crd par exemple quand la pays version 1 beta 1 sera removed et qu'on devra passer en v1 oui le générateur qu'on utilise est capable de gérer les deux versions de la de la pays crd donc là là le entre guillemets par défaut il génère que la version v1 on peut lui dire de générer la version v1 beta 1 on peut avoir les deux en parallèle et alors après les problématiques de traite entre les deux c'est un peu compliqué mais mais là en tout cas à partir des objets java on a les la v1 et la v1 beta 1 qui sont généré automatiquement ok bon écoute écoute christophe merci beaucoup je suis désolé j'ai pris un peu trop de temps à présenter les fondamentaux va dire non mais c'est important je pense que les opérateurs ça reste encore quelque chose de très nouveau je pense pour la plupart des gens donc c'était très bien de passer un peu de temps là dessus moi aussi j'ai appris des choses sur les finales auseurs et tout ça faudra que j'y pense quand je vais publier le je publierai l'application plus complète ce qu'il y avait d'autres trucs je vais parler des honneurs et fancies aussi parce que là tel que le code est par exemple quand on efface la cr quand on efface notre expose d'app les déploiements et tout ça reste sur le cluster donc il y a moyen de gérer ça aussi automatiquement et puis je voulais montrer aussi comment gère le statut etc avec une autre décal des fonctionnalités du sdk on va gérer longtemps désolé non il n'y a pas de soucis non on a un peu d'orables là on va on va écoute merci beaucoup il ya les gens qui te remercie sur le chat aussi qui ont aimé la démon et merci christophe et bon ben à bientôt et tu peux rester avec nous toute cette journée on va jouer à la bataille navale maintenant ok donc merci alors