<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Maxime Guilbert</title>
    <description>The latest articles on DEV Community by Maxime Guilbert (@mxglt).</description>
    <link>https://dev.to/mxglt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F528091%2Fd0cdccf2-1b67-422f-840c-16826e80f356.jpg</url>
      <title>DEV Community: Maxime Guilbert</title>
      <link>https://dev.to/mxglt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mxglt"/>
    <language>en</language>
    <item>
      <title>🔮 Une nouvelle manière de vulgariser la programmation : plonge dans le monde magique de Grand Père Kernel</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Wed, 27 Aug 2025 11:19:27 +0000</pubDate>
      <link>https://dev.to/mxglt/une-nouvelle-maniere-de-vulgariser-la-programmation-plonge-dans-le-monde-magique-de-grand-pere-4deb</link>
      <guid>https://dev.to/mxglt/une-nouvelle-maniere-de-vulgariser-la-programmation-plonge-dans-le-monde-magique-de-grand-pere-4deb</guid>
      <description>&lt;p&gt;Et si apprendre l’histoire et les concepts de la programmation ne passait plus par des tutoriels austères ou des cours bourrés de jargon, mais par un récit épique, quelque part entre le conte fantastique et la chronique technologique ?&lt;/p&gt;

&lt;p&gt;🎙️ &lt;strong&gt;Grand Père Kernel&lt;/strong&gt; est un podcast qui dépoussière la vulgarisation informatique. Ici, pas de slides ennuyeuses : chaque épisode t’embarque dans un univers où les langages de programmation sont des écoles de magie et où les machines deviennent de puissants artéfacts capables d’invoquer du code. Tout est raconté avec des images fortes et un ton narratif, pour transformer les concepts techniques en histoires captivantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi écouter Grand Père Kernel ?
&lt;/h2&gt;

&lt;p&gt;Parce que tu découvriras l’histoire des langages sous un angle inédit, en comprenant les raisons techniques et historiques qui les ont façonnés.&lt;/p&gt;

&lt;p&gt;Parce que tu n’as pas besoin d’être expert : les épisodes sont pensés pour être accessibles aux curieux tout en offrant des détails croustillants pour les passionnés de code.&lt;/p&gt;

&lt;p&gt;Parce que c’est une façon ludique de se cultiver sur l’informatique, loin du côté “cours magistral”.&lt;/p&gt;

&lt;p&gt;Parce qu’un format audio immersif, c’est idéal pour écouter dans le métro, en voiture ou en travaillant.&lt;/p&gt;

&lt;p&gt;📚 3 épisodes déjà disponibles :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Java – Le langage qui voulait conquérir le monde&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/DHEJeh-1wUQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cobol – Le langage qui refuse de mourir&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/yGWeZm3COp0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assembleur – Le pacte des octets maudits&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/gk9i7dpvCqM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Chaque histoire mêle réalité technique et fiction narrative, pour que tu comprennes les enjeux et les concepts tout en te laissant embarquer dans une aventure digne d’un roman.&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Où écouter ?
&lt;/h2&gt;

&lt;p&gt;Grand Père Kernel est disponible sur &lt;a href="https://www.youtube.com/@CodeRedFire-n5r" rel="noopener noreferrer"&gt;&lt;strong&gt;YouTube&lt;/strong&gt;&lt;/a&gt; et &lt;strong&gt;Spotify&lt;/strong&gt;. Alors si tu veux découvrir l’informatique comme jamais auparavant, viens voyager à travers ces récits. &lt;/p&gt;

&lt;p&gt;Et si le concept te plaît, abonne-toi et partage le podcast autour de toi : ton soutien permettra de développer cet univers et de raconter encore plus d’histoires magiques.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>programming</category>
      <category>java</category>
    </item>
    <item>
      <title>Vérifier les droits d'un utilisateur dans Kubernetes</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 04 Sep 2023 14:03:00 +0000</pubDate>
      <link>https://dev.to/mxglt/verifier-les-droits-dun-utilisateur-dans-kubernetes-2c8c</link>
      <guid>https://dev.to/mxglt/verifier-les-droits-dun-utilisateur-dans-kubernetes-2c8c</guid>
      <description>&lt;p&gt;Quand on travaille avec un cluster Kubernetes, il se peut qu'on ne se rappelle plus quels sont les droits RBAC que l'on a donné à un utilisateur ou un service account. &lt;/p&gt;

&lt;p&gt;Du coup, si on a besoin de savoir si un utilisateur possède des droits sur une action spécifique, au lieu d'aller fouiller dans les RBAC à trouver les droits, on peut utiliser &lt;code&gt;kubectl auth can-i&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Détail de la commande
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Utilisateur courant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i &lt;span class="o"&gt;[&lt;/span&gt;action] &lt;span class="o"&gt;[&lt;/span&gt;ressource]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Présenté sous ce format, la commande va vous permettre de savoir si l'utilisateur avec lequel vous êtes actuellement connecté sur le cluster &lt;strong&gt;possède le droit d'effectuer l'action définie sur la ressource définie.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Exemple pour vérifier si l'utilisateur courant peut créer un pod :&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i create pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le résultat que vous obtiendrez sera un simple &lt;code&gt;yes&lt;/code&gt; si vous avez le droit. &lt;code&gt;no&lt;/code&gt; si vous ne l'avez pas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vérifier dans un cluster particulier
&lt;/h3&gt;

&lt;p&gt;La commande définie ci-dessus permet de vérifier les ressources qui ont un scope cluster, ou celles qui ont un scope namespace et qui sont dans le namespace default.&lt;/p&gt;

&lt;p&gt;Pour pouvoir vérifier les droits dans un namespace particulier, ajouter l'option &lt;code&gt;--namespace [nom du namespace]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vérifier pour un autre utilisateur
&lt;/h3&gt;

&lt;p&gt;Si jamais vous voulez vérifier les droits d'un autre utilisateur, vous pouvez ajouter à la fin l'option &lt;code&gt;--as&lt;/code&gt; suivi du nom de l'utilisateur qui vous intéresse.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Exemple où l'on veut vérifier si toto peut lister les déploiements:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i list deployment &lt;span class="nt"&gt;--as&lt;/span&gt; toto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vérifier pour un service account
&lt;/h3&gt;

&lt;p&gt;Pour se faire passer pour un service account, il faut aussi utiliser l'option &lt;code&gt;--as&lt;/code&gt;, sauf qu'il faut donner une valeur suivant le modèle suivant : &lt;code&gt;system:serviceaccount:[namespace]:[nom service account]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Exemple où l'on veut vérifier si le service account titi dans le namespace test peut supprimer une configmap :&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i delete configmap &lt;span class="nt"&gt;--as&lt;/span&gt; system:serviceaccount:test:titi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Références
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#checking-api-access" rel="noopener noreferrer"&gt;Documentation Kubernetes - Commande auth can-i&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mankier.com/1/kubectl-auth-can-i" rel="noopener noreferrer"&gt;Man - Kubectl auth can-i&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Et voilà, c'est aussi simple que ça et toujours très pratique pour faire quelques validations rapides.&lt;/p&gt;




&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Check user RBAC rights</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 04 Sep 2023 14:02:00 +0000</pubDate>
      <link>https://dev.to/mxglt/check-user-rbac-rights-2d00</link>
      <guid>https://dev.to/mxglt/check-user-rbac-rights-2d00</guid>
      <description>&lt;p&gt;When we work with a Kubernetes cluster, it happends that we don't remember if a user or service account has a specific right. &lt;/p&gt;

&lt;p&gt;So, to help us to not search in all the RBAC definition file, we can use the &lt;code&gt;kubectl auth can-i&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Command details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Current user
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i &lt;span class="o"&gt;[&lt;/span&gt;action] &lt;span class="o"&gt;[&lt;/span&gt;resource]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this template, you can check if &lt;strong&gt;the current user is able to the action noted in the command on the resource type noted in the command.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example to check if the current user can create a pod :&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i create pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result will be &lt;code&gt;yes&lt;/code&gt; if you have the permissions, or &lt;code&gt;no&lt;/code&gt; if you haven't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define namespace
&lt;/h3&gt;

&lt;p&gt;The current command will ask for the permissions for cluster-scoped resources or for namespaced-scoped resources in the default namespace.&lt;/p&gt;

&lt;p&gt;If you want to ask the rights in a particular namespace, you just have to add the option &lt;code&gt;--namespace [name of the namespace]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impersonnate another user
&lt;/h3&gt;

&lt;p&gt;If you want to check the permissions for another user, you can impersonnate it by adding the option &lt;code&gt;--as&lt;/code&gt; at the end of the command, followed by the name of the user.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example to check if toto can list deployments:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i list deployment &lt;span class="nt"&gt;--as&lt;/span&gt; toto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Impersonnate a service account
&lt;/h3&gt;

&lt;p&gt;To impersonnate a service account, use the same &lt;code&gt;--as&lt;/code&gt; option but with the following template : &lt;code&gt;system:serviceaccount:[namespace]:[nom service account]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example to check if the service account titi in the test namespace can delete configmap :&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i delete configmap &lt;span class="nt"&gt;--as&lt;/span&gt; system:serviceaccount:test:titi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#checking-api-access" rel="noopener noreferrer"&gt;Documentation Kubernetes - Commande auth can-i&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mankier.com/1/kubectl-auth-can-i" rel="noopener noreferrer"&gt;Man - Kubectl auth can-i&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;And that's it! Really easy to use and can same some time!&lt;/p&gt;




&lt;p&gt;I hope it will help you and if you have any questions &lt;em&gt;(there are not dumb questions)&lt;/em&gt; or some points are not clear for you, don't hesitate to add your question in the comments or to contact me directly on  &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Monitor an operator</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 28 Aug 2023 14:01:00 +0000</pubDate>
      <link>https://dev.to/mxglt/monitor-an-operator-55j3</link>
      <guid>https://dev.to/mxglt/monitor-an-operator-55j3</guid>
      <description>&lt;p&gt;Having an Kubernetes operator is quite cool, but if everything goes well. To track this and potentially adding alerts on it, we must have metrics.&lt;/p&gt;

&lt;p&gt;And that's good, by default with the Golang Operator SDK, we already have a couple of metrics which are available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available metrics
&lt;/h2&gt;

&lt;p&gt;The following list is an overview of all the metrics available. To see the full list, please check the &lt;a href="https://book.kubebuilder.io/reference/metrics-reference.html" rel="noopener noreferrer"&gt;Kubebuilder reference&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_total&lt;/code&gt; : Counter - Total number of reconciliations per controller.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_errors_total&lt;/code&gt; : Counter - Total number of reconciliation errors per controller.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_time_seconds&lt;/code&gt; : Histogram - Length of time per reconciliation per controller.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_webhook_requests_total&lt;/code&gt; : Counter - Total number of admission requests by HTTP status code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Add metrics
&lt;/h2&gt;

&lt;p&gt;Even if the generic metrics from Kubebuilder are useful, they may not be enough for your use cases.&lt;/p&gt;

&lt;p&gt;For this, there is something to do to easily add more metrics. With the package &lt;code&gt;github.com/prometheus/client_golang/prometheus&lt;/code&gt;, create all the metrics you may need&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus"&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="n"&gt;goobers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
        &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CounterOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"goobers_total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Number of goobers proccessed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="p"&gt;},&lt;/span&gt; 
    &lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="n"&gt;gooberFailures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewCounterVec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
        &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CounterOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"goober_failures_total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Number of failed goobers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"label_1"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then register them in the metric registry of the operator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="s"&gt;"sigs.k8s.io/controller-runtime/pkg/metrics"&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MustRegister&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it's done, congrats! You can use these metrics wherever you want!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithLabelValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"toto"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithLabelValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"titi"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Metrics with labels
&lt;/h2&gt;

&lt;p&gt;As you can see in the previous example, if you want to create a metric with labels, you can use &lt;code&gt;New...Vec&lt;/code&gt;. It will ask you to give a list of labels name, and then will ask you to use &lt;code&gt;WithLabelValues&lt;/code&gt; to fill the value for each label when you will want to update a metric value. Quite useful if you always have the same labels.&lt;/p&gt;

&lt;p&gt;Otherwise, you can use &lt;code&gt;.With()&lt;/code&gt; to add all the labels you want when updating a metric value.&lt;/p&gt;

&lt;p&gt;ex: &lt;code&gt;.With(map[string]string{"toto": "titi"}).Inc()&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;At the end, an operator is a service like all the others and should be monitored to be sure that everything is going well in your stack. Like a lot of other things, Operator SDK and Kubebuilder help us a lot by simplifying all this process.&lt;/p&gt;




&lt;p&gt;I hope it will help you and if you have any questions &lt;em&gt;(there are not dumb questions)&lt;/em&gt; or some points are not clear for you, don't hesitate to add your question in the comments or to contact me directly on  &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Monitorer son opérateur</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 28 Aug 2023 14:01:00 +0000</pubDate>
      <link>https://dev.to/mxglt/monitorer-son-operateur-4pcl</link>
      <guid>https://dev.to/mxglt/monitorer-son-operateur-4pcl</guid>
      <description>&lt;p&gt;Avoir un opérateur c'est bien sympa, mais encore faut-il que tout se passe bien. Pour surveiller ça et potentiellement mettre des alertes dessus, il faut avoir des métriques.&lt;/p&gt;

&lt;p&gt;Ca tombe bien, par défaut avec Operator SDK en Go on va avoir un ensemble de métriques déjà présentes pour nous aider à surveiller notre opérateur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métriques disponibles
&lt;/h2&gt;

&lt;p&gt;Voici un aperçu des métriques disponibles, pour avoir la liste complète, veuillez aller regarder la &lt;a href="https://book.kubebuilder.io/reference/metrics-reference.html" rel="noopener noreferrer"&gt;référence dans Kubebuilder&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_total&lt;/code&gt; : Counter - Nombre total de réconciliations faites par un controller&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_errors_total&lt;/code&gt; : Counter - Nombre de réconciliations en erreur par controller&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_reconcile_time_seconds&lt;/code&gt; : Histogram - Durée par réconciliation par controller&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controller_runtime_webhook_requests_total&lt;/code&gt; : Counter - Nombre d'appels au Webhook triés par code réponse HTTP&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Avoir plus de métriques
&lt;/h2&gt;

&lt;p&gt;Bien que les métriques génériques de base soient très pratiques, il se peut qu'elles ne vous suffisent pas pour couvrir l'ensemble des cas d'utilisation que vous avez. &lt;/p&gt;

&lt;p&gt;Pour cela, il existe un moyen très simple d'ajouter de nouvelles métriques. A partir du package &lt;code&gt;github.com/prometheus/client_golang/prometheus&lt;/code&gt;, créez l'ensemble des métriques dont vous avez besoin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus"&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="n"&gt;goobers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
        &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CounterOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"goobers_total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Number of goobers proccessed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="p"&gt;},&lt;/span&gt; 
    &lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="n"&gt;gooberFailures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewCounterVec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
        &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CounterOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"goober_failures_total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Number of failed goobers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"label_1"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis déclarez-les dans le registre des métriques de l'opérateur&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="s"&gt;"sigs.k8s.io/controller-runtime/pkg/metrics"&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MustRegister&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une fois que c'est fait, vous pouvez utiliser ces métriques dans votre code!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;goobers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithLabelValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"toto"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;gooberFailures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithLabelValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"titi"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Métriques avec labels
&lt;/h2&gt;

&lt;p&gt;Comme vous avez pu le constater dans l'exemple précédent, si vous voulez créer une métrique avec des labels, vous pouvez utiliser &lt;code&gt;New...Vec&lt;/code&gt;. Cela va vous demander la liste des labels que vous voulez pour votre métrique, et ça va vous demander de remplir les valeurs de ces labels avec &lt;code&gt;WithLabelValues&lt;/code&gt; quand vous voudrez mettre à jour une métrique. Plutôt pratique si vous avez toujours les mêmes labels sur votre métrique.&lt;/p&gt;

&lt;p&gt;Autrement, vous pouvez utiliser &lt;code&gt;.With()&lt;/code&gt; pour ajouter des labels comme vous le souhaitez.&lt;br&gt;
ex: &lt;code&gt;.With(map[string]string{"toto": "titi"}).Inc()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;En dehors de ça le fonctionnement est strictement identique à une métrique sans labels.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;En conclusion, un opérateur reste un service comme un autre et il doit lui aussi être surveillé pour s'assurer que tout se passe bien dans votre système. Et comme pas mal de choses avec Operator SDK et Kubebuilder, les choses nous sont pas mal simplifiées avec l'intégration de la librairie golang de Prometheus!&lt;/p&gt;




&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Les questions à se poser avant de démarrer le développement d'un projet</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 21 Aug 2023 14:22:00 +0000</pubDate>
      <link>https://dev.to/mxglt/les-questions-a-se-poser-avant-de-demarrer-le-developpement-dun-projet-1a8g</link>
      <guid>https://dev.to/mxglt/les-questions-a-se-poser-avant-de-demarrer-le-developpement-dun-projet-1a8g</guid>
      <description>&lt;p&gt;Dans un contexte où tout va très vite, beaucoup de gens, équipes et compagnies tentent d'aller le plus loin le plus rapidement possible afin d'être les premiers à proposer de nouveaux produits, services et fonctionnalités. Cependant, cette vitesse amène une certaine précipitation qui peut causer du trouble à vos projets, pouvant provoquer le redéveloppement de certaines fonctionnalités entières, des retards sur les planifications ou une instabilité en production. &lt;/p&gt;

&lt;p&gt;Entre ce que j'ai pu vivre et tout ce que j'ai pu entendre de personnes en IT, j'ai pu constater que ça arrivait souvent, voir trop souvent. Après ça ne veut pas dire que les personnes/équipes/compagnies ont fait échouer leur projet. Une bonne partie d'entre eux ont réussi a ramener les projets dans la bonne direction et continuent à être utilisés.&lt;/p&gt;

&lt;p&gt;Mais de là, différentes questions se posent : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A quel prix ont-ils réussi à faire cela ?&lt;/li&gt;
&lt;li&gt;Combien de temps leur a-t-il fallu ?&lt;/li&gt;
&lt;li&gt;Est-ce qu'ils ont réussi à conserver la confiance de leurs clients?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En effet, sans parler de l'impact financier direct vis à vis du temps à redévelopper/stabiliser la solution, cela peut aussi avoir un impact financier indirect car des services qui ne fonctionnent pas correctement peuvent influencer la confiance de vos clients envers votre produit. Peut-être qu'ils ne vont pas arrêter d'utiliser directement vos produits, mais peut être qu'ils vont se tourner ailleurs si ils trouvent d'autres alternatives.&lt;br&gt;
&lt;em&gt;(Bien sûr ça n'est pas mesurable facilement, et ça dépend de la criticité des services.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Et c'est pour cela qu'on va parler de quelques questions qui vous permettront de vous assurer que vous partez dans la bonne direction avec votre projet.&lt;/p&gt;

&lt;h1&gt;
  
  
  Quels sont les prérequis de mon produit ?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Penser en premier à l'expérience client, puis revenir à la technologie&lt;br&gt;
&lt;a href="https://serviceinindustry.com/2019/08/19/steve-jobs-on-starting-with-the-customer-experience-then-work-back-to-technology/" rel="noopener noreferrer"&gt;Citation Steve Jobs&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cette question doit être posée dans le sens où on veut penser au produit final que l'on veut offrir au client. Quelles sont les fonctionnalités? Quels critères ses fonctionnalités doivent suivre? &lt;em&gt;(durée de traitement, sécurité, certifications, volumétrie...)&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;En effet avoir une idée précise de ce que l'on veut à la fin est important car c'est le point crucial qui fait que beaucoup de projets sont refaits. Et ça arrive partout, ça m'est aussi arrivé par le passé. J'ai eu l'occasion de voir des projets réécrit partiellement ou entièrement à cause ça. Par exemple, arriver après 1 an de dev pour dire "au fait ces traitements doivent être fait en moins d'une seconde" alors que vous n'aviez aucune contrainte jusque là.&lt;/p&gt;

&lt;p&gt;Si jamais votre projet est très vaste et qu'il contient beaucoup de fonctionnalités, focalisez-vous en priorité sur les &lt;strong&gt;fonctionnalités les plus contraignantes et/ou celles qui ont des besoins particuliers&lt;/strong&gt;. En effet si au milieu de votre projet complexe vous avez des fonctionnalités qui font des CRUD d'une table de votre base de données et que vous n'avez pas de contraintes de temps de réponse, elles peuvent clairement être mises de côté car il y a de grandes chances qu'elles rentrent dans la stack technologique que vous allez définir pour vos autres fonctionnalités.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dans quel contexte allez-vous créer ce produit ?
&lt;/h1&gt;

&lt;p&gt;Ici on veut se demander quel type d'architecture on va utiliser, quels outils et technologies on va utiliser... &lt;/p&gt;

&lt;p&gt;Par exemple : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faire des microservices pour une petite application pour lister les todos en local, ça n'est pas intéressant et c'est même overkill. &lt;/li&gt;
&lt;li&gt;Avoir un système incluant des boutiques, sites de paiement... dans un monolithe alors que vous savez que vous allez devoir gérer plusieurs boutiques sur le long terme et qu'elles vont partager des fonctionnalités, pas adapté&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aussi il faut voir vis à vis du contexte de l'entreprise. Si tous les développeur connaissent java, ça n'est pas forcément utile d'aller chercher un autre langage si les performances de Java sont suffisantes pour les besoins...&lt;/p&gt;

&lt;p&gt;MAIS il faut vérifier que ça correspond avec les besoins technologiques de votre projet. En effet il peut être plus simple que tous les projets d'une même compagnie soit avec la même stack technologique. Ca simplifie les choses et ça permet d'être sûr d'avoir des personnes qualifiées qui peuvent aider/contribuer. Sauf que certaines technologies &lt;em&gt;(langage front, backend, type de base de données...)&lt;/em&gt; ne vont pas correspondre à vos besoins. Dans ce cas, le risque est que vous ne le voyez que trop tard car personne ne s'est posé la question avant.&lt;/p&gt;

&lt;h1&gt;
  
  
  Quelle est notre vision du produit sur le long terme ?
&lt;/h1&gt;

&lt;p&gt;Cette question est très importante car elle peut permettre de préparer le terrain pour le futur. L'idée n'est pas d'analyser directement le futur, mais de récupérer les informations que l'on peut et voir l'impact que ça peut avoir sur le service tel qu'on le conçoit actuellement.&lt;/p&gt;

&lt;p&gt;Par exemple : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Est-ce que certaines fonctionnalités vont être réutilisées? Si oui lesquelles? Comment seront-elles partagées? &lt;em&gt;(librairie, microservice...)&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;Est-ce qu'on vise sur le long terme une grosse augmentation au niveau de l'utilisation du service ?&lt;/li&gt;
&lt;li&gt;Est-ce que certains critères &lt;em&gt;(comme la latence)&lt;/em&gt; risquent d'être plus strictes dans le futur? &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Est-ce qu'on part dans la bonne direction  ?
&lt;/h1&gt;

&lt;p&gt;Question simple mais qui, vis à vis des points précédents, vont vous permettre de vous rechallenger sur votre projet et de valider que vous prenez la bonne voie.&lt;/p&gt;

&lt;p&gt;Plusieurs solutions s'offrent à vous :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;consulter des experts dans le domaine&lt;/strong&gt; &lt;em&gt;(qu'ils soient dans votre compagnie ou non)&lt;/em&gt; afin de savoir si ce que vous voulez faire est faisable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;faire des POC ciblées sur vos points d'interrogation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces solutions sont un petit investissement en coût et en temps, mais ils peuvent être cruciaux pour vous conforter sur la direction à prendre.&lt;/p&gt;




&lt;p&gt;Au final, on a pu voir qu'il n'y a pas de recette miracle pour trouver de quoi on a besoin ou non comme technologies pour un projet. Par contre, on a pu voir qu'avant de partir trop loin dans le développement, il faut : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prendre un peu de temps en amont pour comprendre quels sont les prérequis indispensables du produit&lt;/li&gt;
&lt;li&gt;Analyser le contexte de votre produit, ainsi que celui de votre entreprise&lt;/li&gt;
&lt;li&gt;Réfléchir au long terme&lt;/li&gt;
&lt;li&gt;S'assurer qu'on part dans la bonne direction&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Questions to ask before starting to dev</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 21 Aug 2023 13:59:00 +0000</pubDate>
      <link>https://dev.to/mxglt/questions-to-ask-before-starting-to-dev-3ekl</link>
      <guid>https://dev.to/mxglt/questions-to-ask-before-starting-to-dev-3ekl</guid>
      <description>&lt;p&gt;In a world where everything goes quick, a lot of people and companies tries to go further quickly as possible to be the first one to have a new feature or product. However this speed brings a certain precipitation which can add some trouble to your project, which can bring some feature redevelopment, being late on schedules or an instability in production.&lt;/p&gt;

&lt;p&gt;Between what I lived, everything I red and what I've learned from other people in IT, I saw that it happens frequently, too much frenquently. It doesn't mean that the people/teams/companies will fail in their project. A lot of them succeeded since and some of these products are still used.&lt;/p&gt;

&lt;p&gt;But at this point some questions can be asked :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; What was the cost of this ?&lt;/li&gt;
&lt;li&gt;How much time did they took to redirect their solution ?&lt;/li&gt;
&lt;li&gt;Do they keep the confidence and satisfaction from their clients?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without talking about the direct impact of the time and money lost to redevelop the product, it can have an indirect impact from your customers because some of them will stop to use your product or will lose their confidence in your solution. May be they won't directly leave, but they may check if is there something else to replace your product.&lt;br&gt;
&lt;em&gt;(For sure this is not something which can be easily mesurable as a lot external things can lead to this too.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And that's why we will talk about some questions that will help you to be sure of the direction you will take with your project.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are the prerequisites for my product?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Start with the Customer Experience, then work back to the technology&lt;br&gt;
&lt;a href="https://serviceinindustry.com/2019/08/19/steve-jobs-on-starting-with-the-customer-experience-then-work-back-to-technology/" rel="noopener noreferrer"&gt;Citation Steve Jobs&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This question should be ask to think first at what we want to offer to the client. Which features? Do we want to be fast? secure? ...&lt;/p&gt;

&lt;p&gt;Having a precise idea of this is really important, and it's a major cause of rewriting projects. And it happens everywhere. For example if you decide to add after a year of development a duration requirement to have all the processes done in less than a second and you don't have any similar requirements before.&lt;/p&gt;

&lt;p&gt;If your project is very large and containts a lot of features, be focused on &lt;strong&gt;features with the most contraints and/or the one with particular needs&lt;/strong&gt;. Indeed if you have one crucial feature and all the other are only managing data in a database without any contraints, they won't need to be a priority because they will fit any context.&lt;/p&gt;

&lt;h1&gt;
  
  
  In which context are you building this solution ?
&lt;/h1&gt;

&lt;p&gt;Here we want to know which kind of architecture, tools, technologies we want to use.&lt;/p&gt;

&lt;p&gt;For example : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doing microservices for a small todo app won't be interesting&lt;/li&gt;
&lt;li&gt;Having a huge system with multiple shops in a monolith knowing that you will have to increase and decrease the number of shops regularly won't be interesting too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also you must check the context of your company. If all the dev masterize Java, it won't be interesting to take something else if perfomances are correct for your requirements.&lt;/p&gt;

&lt;p&gt;BUT you must check that it matches with your requirements. Indeed it's easier to take the same technologies and architectures from all the other projects of your company. But doing this can be a huge trap as it won't fit at all your needs. In that case it can happen that you will only see it too late.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is the long term vision for the product?
&lt;/h1&gt;

&lt;p&gt;This question is really important as it can prepare the product for futur features. The idea is not to analyze the future features but thinking about what can be asked later and see if some things can be done or prepared now.&lt;/p&gt;

&lt;p&gt;For example :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there some features which will be reused? If yes, which ones? How they will be shared? &lt;em&gt;(package, microservice...)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Do we expect a huge usage increase in the future ?&lt;/li&gt;
&lt;li&gt;Do some criterias will be more strict in the future? &lt;em&gt;(like the latency)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Are we going into the right way ?
&lt;/h1&gt;

&lt;p&gt;A simple question which can challenge you to check if everything is correctly defined and if you are sure about the architecture and the tools to use.&lt;/p&gt;

&lt;p&gt;If you are not completly sure, you can :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ask an expert in the domain&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;do some Proofs of Concepts on the points you are not sure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can take a bit of time but at the end will reassure you about your choices.&lt;/p&gt;




&lt;p&gt;At the end, we saw that there is no miracle receipe to create a project. But we saw that we can prepare and check a lot of things to build great things without losing time by recreating thing.&lt;/p&gt;




&lt;p&gt;I hope it will help you and if you have any questions &lt;em&gt;(there are not dumb questions)&lt;/em&gt; or some points are not clear for you, don't hesitate to add your question in the comments or to contact me directly on  &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Pourquoi tout le monde devrait avoir un blog ?</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 14 Aug 2023 14:21:00 +0000</pubDate>
      <link>https://dev.to/mxglt/pourquoi-tout-le-monde-devrait-avoir-un-blog--1i26</link>
      <guid>https://dev.to/mxglt/pourquoi-tout-le-monde-devrait-avoir-un-blog--1i26</guid>
      <description>&lt;p&gt;Avec l'explosion d'internet dans nos quotidiens et de plateformes permettant de partager des connaissances, beaucoup de gens publient des articles qui vont être lus par des gens aux 4 coins du monde sur des sujets plus ou moins précis. Dans l'industrie informatique au sens large, ces articles peuvent être associés à des concepts, des technologies ou autres outils. Et sans forcément s'en rendre compte, on en consomme beaucoup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi ces articles sont importants ?
&lt;/h2&gt;

&lt;p&gt;Ces articles sont importants car ils vont permettre de comprendre plus facilement comment utiliser certains outils ou autres..., voir nous aider à résoudre un soucis que d'autres ont déjà rencontré.&lt;/p&gt;

&lt;p&gt;Du coup ces articles sont importants car ils vont nous aider dans notre quotidien pour nous débloquer, nous aider à découvrir de nouvelles choses et à apprendre. Souvent bien plus accessibles que des documentations, il y a souvent un côté ludique qui permet de mieux comprendre certaines notions qui peuvent être complexes &lt;em&gt;(notamment grâce à des exemples ou schémas)&lt;/em&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi tout le monde devrait avoir un blog ?
&lt;/h2&gt;

&lt;p&gt;Dans le monde de l'informatique, on va souvent chercher de l'information en ligne, du coup avoir un blog permettrait de partager des découvertes, des conseils, des problèmes que vous avez rencontré, des bonnes pratiques...&lt;/p&gt;

&lt;p&gt;Ne vous êtes-vous jamais dit : "C'est dommage, personne ne parle du problème X ou du sujet Z" ?&lt;/p&gt;

&lt;p&gt;Si c'est le cas, vous comprendrez pourquoi c'est important de partager ces informations. &lt;/p&gt;

&lt;p&gt;De plus, beaucoup d'outils sont dans des "niches" qui ne sont pas forcément faciles à découvrir. Le fait d'écrire des articles dessus permettra à plus de monde de découvrir certaines choses qui devraient être partagées au plus grand nombre.  &lt;em&gt;(Dans ce cas-là, je pense énormément aux outils open-source)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le gain d'avoir un blog
&lt;/h2&gt;

&lt;p&gt;Alors sans parler du côté monétaire, de la réputation et autres choses du genre, car ça va dépendre d'énormément de facteur externes. Avoir un blog a d'énormes gains pour vous.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maîtrise de sujet
&lt;/h3&gt;

&lt;p&gt;En effet un principe bien connu dans le monde de l'éducation dit qu'une personne souhaitant aider à retenir un sujet ou être capable de le maîtriser un minimum, doit être capable de l'expliquer à d'autres personnes. Cela peut se faire avec des termes plus simples, des exemples ou autres.&lt;/p&gt;

&lt;p&gt;Cela ne vous rappelle pas quelque chose? &lt;/p&gt;

&lt;p&gt;Plus tôt on disait que justement les articles postés en lignes sont souvent des explications plus simples de sujets potentiellement complexes. Il est sûr qu'il y a des personnes qui sont des vulgarisateurs et qu'ils n'ont pas besoin d'écrire ces articles pour pouvoir être capable de maîtriser un sujet. Mais je suis sûr à 100%, vu que j'en fais parti, qu'il y a des gens qui écrivent des articles pour aider à voir si ils sont capables de ressortir tout ce qu'ils ont pu apprendre sur différents sujets. &lt;/p&gt;

&lt;p&gt;D'expérience, je peux vous garantir que ça aide à retenir plus facilement beaucoup d'informations car le processus de rédaction d'un article va vous faire travailler pour expliquer des concepts avec vos termes. Et le fait d'utiliser vos mots pour expliquer des concepts va faciliter la mémorisation car vous n'aurez pas forcément besoin de retenir des termes qui pourraient vous sembler barbare et/ou trop compliqués à retenir seuls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amélioration de la rédaction
&lt;/h3&gt;

&lt;p&gt;Un autre point d'amélioration concerne la rédaction. En effet, être capable d'expliquer des choses demande à être un minimum structuré et clair, du coup écrire des articles va &lt;em&gt;(plus sur le long terme)&lt;/em&gt; vous aider à améliorer dans ce domaine.&lt;/p&gt;

&lt;p&gt;Après ça ne veut pas forcément dire que vous serez capable après d'écrire des paragraphes entiers pour expliquer des choses. Mais potentiellement vous allez être capable de capturer l'essentiel en quelques lignes.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'amélioration dans une langue étrangère
&lt;/h3&gt;

&lt;p&gt;Ce point ne concerne pas forcément tout le monde, mais est quelque chose qui m'aide pas mal : l'amélioration dans une langue étrangère.&lt;/p&gt;

&lt;p&gt;En effet, afin d'être capable de partager mes articles aux plus grands nombre, je rédige aussi mes articles en anglais. Bien que ça soit la langue utilisée dans quasiment toutes les documentations techniques, être capable de réexpliquer certaines choses va demander de connaître d'autres mots, tournures de phrase et autres, qui vont au fil du temps aider à s'améliorer dans la communication dans une langue étrangère.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Voilà pourquoi, je pense, que tout le monde devrait avoir un blog. Alors on est d'accord que c'est un énorme investissement en temps qui potentiellement ne rapportera rien. Ca fait trois ans que j'écris des articles en ligne et je n'ai pas touché un centime de tout ça. Pourtant je trouve ça quand même intéressant de le faire et j'encourage les gens à s'essayer. Pas besoin d'avoir un sujet ultra pointu, les 3/4 de mes articles concerne des petites astuces ou des problèmes que j'ai rencontré.&lt;/p&gt;




&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>writing</category>
    </item>
    <item>
      <title>Why everyone should have a blog ?</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 14 Aug 2023 14:20:00 +0000</pubDate>
      <link>https://dev.to/mxglt/why-everyone-should-have-a-blog--3p4c</link>
      <guid>https://dev.to/mxglt/why-everyone-should-have-a-blog--3p4c</guid>
      <description>&lt;p&gt;With the explosion of internet in our lifes and platforms to share informations, a lot of people are publishing posts on differents subjects. In the IT industry, these posts can be about a concept, technologies or tools. And we read a lot of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these posts are so importants?
&lt;/h2&gt;

&lt;p&gt;These posts are importants because it will often help us to understand how to use something, how can we improve our skills... or resolve an issue that someone else has already encountered.&lt;/p&gt;

&lt;p&gt;Often more accessible than documentations, they have a playful way to teach things that helps to understand complexe notions notably with examples and/or schemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why everyone should have a blog ?
&lt;/h2&gt;

&lt;p&gt;In this IT world, we search informations online everyday, so having a blog will let you share what you've experienced, what you've discovered, some tips, how to resolve particular issues...&lt;/p&gt;

&lt;p&gt;Don't you ever wondering why there's no posts on a particular subject or on a particular error?&lt;/p&gt;

&lt;p&gt;If yes, you will understand why it can be important to share this kind of informations.&lt;/p&gt;

&lt;p&gt;Also a lot of tools are in niches which are not easy to find and/or understand. So having posts about it will help to expose it and having more informations for anyone which want to use it and understand how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Winnings to have a blog
&lt;/h2&gt;

&lt;p&gt;Without talking about money or other things like that, having a blog can have huge payoffs for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subject mastering
&lt;/h3&gt;

&lt;p&gt;A principe of education says that if someone wants to memorize easily something or to start to master a subject, they must be able to explain with their own words the subject. May be in a easier way with examples.&lt;/p&gt;

&lt;p&gt;It doesn't make you think about something?&lt;/p&gt;

&lt;p&gt;Earlier we said that articles that are posted online are often simple explainations about more complexe concepts. For sure some people don't need to write these posts to memorize and master the subject, but a lot of people like me are writing posts to help them to see if they are able to explain and summarize all the informations they learned about a subject.&lt;/p&gt;

&lt;p&gt;From my experience, I garantee you that it helps me to memorize a lot of things. The work to find a way to explain the subject with your own words is really powerful. Because as you already know the words you are using, you don't have to remember the definition of a lot of new words. And naturally the information will be easier to remember.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve writing skills
&lt;/h3&gt;

&lt;p&gt;By writing posts you will improve your writing skills. Being able to explain things requires to be a bit organized. So writing will help you with this.&lt;/p&gt;

&lt;p&gt;Also it will help you to figure out what is the most important informations to share in a few lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve in a foreign language
&lt;/h3&gt;

&lt;p&gt;It doesn't concern everyone, but it's something that help me a lot : improve my skills in another language.&lt;/p&gt;

&lt;p&gt;To be able to share my posts to a lot of people, I write my posts in english. Even it's the language used is almost all the technical documentations, being able to explain something in english requires more vocabulary at least and helps to improve our communication skill in this language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;For all these reasons, that's why I think everyone should have a blog. For sure it's a huge time investment for may be nothing. &lt;em&gt;(I wrote technical posts for the last 3 years and I didn't earn anything)&lt;/em&gt; But it's still interesting to do it and I encourage anyone to give a try.&lt;/p&gt;




&lt;p&gt;I hope it will help you and if you have any questions &lt;em&gt;(there are not dumb questions)&lt;/em&gt; or some points are not clear for you, don't hesitate to add your question in the comments or to contact me directly on  &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>discuss</category>
    </item>
    <item>
      <title>K8s operator - Synchronize resources outside Kubernetes cluster</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 07 Aug 2023 13:09:00 +0000</pubDate>
      <link>https://dev.to/mxglt/k8s-operator-synchronize-resources-outside-kubernetes-cluster-g4</link>
      <guid>https://dev.to/mxglt/k8s-operator-synchronize-resources-outside-kubernetes-cluster-g4</guid>
      <description>&lt;p&gt;When we automate tasks/resources in a Kubernetes Cluster, we first think about managing Kubernetes resources. But we must not forget that we are not limited to what is presented to us.&lt;/p&gt;

&lt;p&gt;Like every post since the begining of this serie, we will talk about the Operator SDK, the Go framework to create operators. And who says Go, says that we can : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;read into a database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;call an API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;write a message in a queue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indeed, &lt;strong&gt;everything which is possible in Go is possible in your operator&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Why it is interesting?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For a simple reason, &lt;strong&gt;you are not limited to your Kubernetes cluster context to automate tasks and resources management.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is a simple example: You manage Prometheus and/or Thanos instances in your cluster with your operator, but you have a single Grafana instance for all these Prometheus/Thanos instances and it's outside of your cluster. In this case, if you want to manage the datasource in Grafana, you must do it through the API.&lt;br&gt;
And here the operator power skyrockets because you can use any API or service which manage resources. You don't need to implement something particular or migrate it into your Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;For sure, it won't be useful for everyone but think about the following example :&lt;br&gt;
You are in a compagny which offer several services to your clients, including :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a metric collector with Promtheus&lt;/li&gt;
&lt;li&gt;a Grafana instance to monitor all the metrics
The issue is that each element is managed by a dedicated operator on a dedicated Kubernetes cluster. How can you automate the management of a customer stack ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answer : &lt;strong&gt;With APIs !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With dedicated APIs to manage your resources &lt;em&gt;(by using the &lt;a href="https://learning.oreilly.com/home/" rel="noopener noreferrer"&gt;Python Kubernetes&lt;/a&gt; library for example)&lt;/em&gt; or by using the &lt;a href="https://kubernetes.io/docs/reference/using-api/api-concepts/" rel="noopener noreferrer"&gt;Kubernetes API&lt;/a&gt;, you can have an operator which can manage all the stack by calling all the other operators with these APIs.&lt;br&gt;
From this, all the spread stack can be automated!&lt;/p&gt;




&lt;p&gt;I hope it will help you and if you have any questions &lt;em&gt;(there are not dumb questions)&lt;/em&gt; or some points are not clear for you, don't hesitate to add your question in the comments or to contact me directly on  &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;




&lt;center&gt;&lt;h3&gt;You want to support me?&lt;/h3&gt;&lt;/center&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/mxguilbert7" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fdefault-orange.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Synchroniser des ressources hors cluster</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 07 Aug 2023 13:08:00 +0000</pubDate>
      <link>https://dev.to/mxglt/synchroniser-des-ressources-hors-cluster-11n</link>
      <guid>https://dev.to/mxglt/synchroniser-des-ressources-hors-cluster-11n</guid>
      <description>&lt;p&gt;Quand on automatise des tâches avec un opérateur Kubernetes, on va surtout penser au fait que l'on peut gérer des ressources Kubernetes. Cependant il ne faut pas oublier qu'on n'est pas forcément limité à ce qui nous est présenté.&lt;/p&gt;

&lt;p&gt;Comme depuis le début de cette série, on va se concentrer sur le framework Go d'Operator SDK. Et qui dit projet en Go, dit que l'on peut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lire dans une base de données&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;faire appel à une API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;écrire un message dans une queue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En effet, &lt;strong&gt;tout ce qui est possible en Go est finalement possible à intégrer dans un opérateur&lt;/strong&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;En quoi c'est intéressant de faire ça?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pour une raison simple, &lt;strong&gt;vous n'êtes plus limité au contexte de votre cluster Kubernetes pour automatiser des éléments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Prenons un exemple simple, vous créez des instances de Prometheus ou Thanos dans votre cluster Kubernetes via votre opérateur, mais il n'y a qu'un seul Grafana qui est utilisé dans toute votre entreprise et il ne se trouve pas dans votre cluster. De ce fait, si vous voulez automatiser la gestion des datasources dans ce Grafana, vous devrez passer par son API.&lt;br&gt;
Et c'est là que la puissance de l'opérateur se décuple, car vous pourrez utiliser toutes les APIs et autres services qui gèrent des ressources dans votre compagnie. Pas besoin d'avoir à réinventer la roue ou de migrer le système en question pour qu'il soit dans Kubernetes.&lt;/p&gt;

&lt;p&gt;C'est sûr que ça ne sera pas forcément utile à tous, mais imaginez l'exemple suivant:&lt;br&gt;
Vous êtes dans une compagnie qui offrent un ensemble de services pour vos clients. Cela comprend un système de récupération de métriques via Prometheus et une instance de grafana dédiée. Chacun de ces éléments sont gérés par des opérateurs distincts, sur des clusters séparés.&lt;br&gt;
Comment pourriez-vous faire pour gérer automatiquement vos ressources dans tous ces clusters ?&lt;/p&gt;

&lt;p&gt;Réponse : &lt;strong&gt;Grâce aux APIs !&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;En créant des APIs dédiées pour gérer vos ressources &lt;em&gt;(en utilisant une librairie comme celle pour dédiée &lt;a href="https://github.com/kubernetes-client/python" rel="noopener noreferrer"&gt;Python&lt;/a&gt;)&lt;/em&gt; ou en utilisant l'&lt;a href="https://kubernetes.io/docs/reference/using-api/api-concepts/" rel="noopener noreferrer"&gt;api kubernetes&lt;/a&gt;,  vous pourriez avoir un opérateur qui va s'occuper d'appeler les apis sur vos différents clusters afin de s'assurer que toutes les ressources demandées sont bien créées.&lt;br&gt;
A partir de là, des infrastructures divisées et potentiellement compliquées à être automatisées toutes ensemble peuvent le devenir!&lt;/p&gt;




&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;




&lt;center&gt;&lt;h3&gt;Vous voulez me supporter?&lt;/h3&gt;&lt;/center&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/mxguilbert7" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Oibfu3K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" width="434" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>kubernetes</category>
      <category>french</category>
      <category>devops</category>
    </item>
    <item>
      <title>Comment minimiser votre emprunte carbone avec Kube-Green?</title>
      <dc:creator>Maxime Guilbert</dc:creator>
      <pubDate>Mon, 31 Jul 2023 13:00:00 +0000</pubDate>
      <link>https://dev.to/mxglt/comment-minimiser-votre-emprunte-carbone-avec-kube-green-142n</link>
      <guid>https://dev.to/mxglt/comment-minimiser-votre-emprunte-carbone-avec-kube-green-142n</guid>
      <description>&lt;p&gt;On est dans une ère où le numérique est de plus en plus présent dans nos quotidiens, mais le numérique &lt;em&gt;(surtout tout le matériel qui peut être derrière et l'énergie qu'il consomme)&lt;/em&gt; est une source de pollution. &lt;/p&gt;

&lt;p&gt;Tout comme vous pouvez participer au tri des déchets et à la réutilisation pour limiter votre emprunte carbone, on va voir comment vous pouvez le faire avec votre cluster Kubernetes! &lt;em&gt;(En plus ça peut vous sauvez des coûts si votre cluster est dans le cloud)&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Kube-Green
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kube-Green&lt;/strong&gt; est un opérateur qui vous permet de &lt;strong&gt;réduire le nombre de réplicas de vos déploiements à 0&lt;/strong&gt; et de &lt;strong&gt;suspendre vos CronJob en dehors de vos "journées de travail"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L'objectif est simple, couper les pods et jobs qui tourneraient pour rien la nuit et les weekends, avant de les redémarrer le matin des jours en semaine. De ce fait, l'ensemble de ces processus ne tournent pas "dans le vent", produisant du CO2 et peuvent vous permettre de scale-down votre cluster si il est sur AWS par exemple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dans quels cas l'utiliser?
&lt;/h3&gt;

&lt;p&gt;C'est sûr que ça n'est pas à utiliser sur votre production, à moins que cette dernière ne soit utilisée que durant les heures de travail. Cet opérateur s'oriente principalement pour tous les environnements de développement ou de tests qui restent souvent démarrés en permanence pour rien.&lt;/p&gt;

&lt;h3&gt;
  
  
  Est-il possible d'exclure certains traitements?
&lt;/h3&gt;

&lt;p&gt;En effet c'est une question que vous pouvez vous poser : "&lt;strong&gt;Est-il possible d'exclure certain traitement?&lt;/strong&gt;" car en effet peut être qu'il y a certaines fonctionnalités de votre cluster de développement qui doit rester allumer en permanence. Sachez que &lt;strong&gt;c'est possible&lt;/strong&gt;, on le verra au niveau de la configuration pour le détail, mais c'est possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mise en place
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Toutes les informations concernant l'installation proviennent de la &lt;a href="https://kube-green.dev/docs/install/" rel="noopener noreferrer"&gt;documentation de Kube-Green&lt;/a&gt;. N'hésitez pas à aller y faire un tour pour avoir la dernière version de la documentation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prérequis
&lt;/h3&gt;

&lt;p&gt;Sachez qu'à ce jour Kube-Green ne fonctionne qu'avec les versions &lt;strong&gt;1.19 à 1.26&lt;/strong&gt; de Kubernetes et &lt;strong&gt;OpenShift v4&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;De plus, il faut que &lt;a href="https://cert-manager.io/docs/installation/" rel="noopener noreferrer"&gt;&lt;strong&gt;cert-manager&lt;/strong&gt;&lt;/a&gt; soit déjà installé.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Plusieurs possibilités d'installation sont offertes par Kube-Green, mais on va uniquement utiliser dans cet exemple l'installation via &lt;strong&gt;kubectl apply&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si vous voulez installer la dernière version de Kube-Green, vous pouvez utiliser la commande suivante&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par contre, si vous voulez installer une version précise de Kube-Green, utilisez la commande suivante en remplaçant &lt;code&gt;${RELEASE_TAG}&lt;/code&gt; par le numéro de la version de la release qui vous intéresse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/kube-green/kube-green/releases/download/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RELEASE_TAG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/kube-green.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;*&lt;em&gt;/!\ Attention : Si vous utilisez Kube-Green dans un cluster qui est dans le cloud /!\*&lt;/em&gt;&lt;br&gt;
En effet la &lt;a href="https://kube-green.dev/docs/install/#cloud-compatibility" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; mentionne que certains problèmes peuvent être rencontrés dans GKE et AWS. Par conséquent, allez faire un tour dans la documentation pour vérifier vos configurations avant d'aller plus loin.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Une fois que l'opérateur est installé, vous pourrez créer une ressource &lt;code&gt;SleepInfo&lt;/code&gt; qui vous  permettra de définir  quelles ressources  doivent être arrêtées,  quand, et quand est-ce qu'elles doivent être redémarrées.&lt;/p&gt;

&lt;p&gt;Sachez que &lt;code&gt;SleepInfo&lt;/code&gt; est une ressource qui &lt;strong&gt;n'agit que dans le namespace dans lequel il est déployé&lt;/strong&gt; c'est à dire qu'il faut &lt;strong&gt;déployer une instance de SleepInfo dans chacun des namespaces dans lequel on veut utiliser Kube-Green&lt;/strong&gt;. &lt;em&gt;(Ce qui permet d'éviter de couper l'ensemble des déploiements essentiels au bon fonctionnement du cluster)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-green.com/v1alpha1&lt;/span&gt;  
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SleepInfo&lt;/span&gt;  
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;working-hours&lt;/span&gt;  
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
    &lt;span class="na"&gt;weekdays&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;  
    &lt;span class="na"&gt;sleepAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;20:00"&lt;/span&gt;  
    &lt;span class="na"&gt;wakeUpAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;08:00"&lt;/span&gt;  
    &lt;span class="na"&gt;timeZone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Europe/Rome"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'exemple précédent est le cas le plus simple d'utilisation de Kube-Green où tous les déploiements vont être arrêtés à 20h (heure de Rome) tous les soirs du lundi au vendredi, et redémarrés du  lundi au vendredi à 8h (heure de Rome).&lt;/p&gt;

&lt;p&gt;Afin de mieux comprendre comment fonctionne SleepInfo, on va faire un tour de chacun de ses champs puis voir quelques exemples exposant différent cas.&lt;/p&gt;

&lt;h3&gt;
  
  
  SleepInfo : Champs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;weekdays&lt;/code&gt; : Permet de définir les jours de la semaine où l'opérateur doit agir.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; est pour Lundi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1-5&lt;/code&gt; est du Lundi au Vendredi&lt;/li&gt;
&lt;li&gt; &lt;code&gt;2-6&lt;/code&gt; est du Mardi au Samedi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; est pour tous les jours de la semaine&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;sleepAt&lt;/code&gt; : Défini sous le format &lt;code&gt;HH:mm&lt;/code&gt;, il permet de déterminer à quelle heure les ressources doivent être arrêtées. &lt;em&gt;(ex: 19:00, 08:53: 23:45)&lt;/em&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;wakeUpAt&lt;/code&gt; : [Optionnel] Défini sous le format &lt;code&gt;HH:mm&lt;/code&gt;, il permet de déterminer à quelle heure les ressources doivent être redémarrées. &lt;em&gt;(ex: 19:00, 08:53: 23:45)&lt;/em&gt; &lt;/li&gt;

&lt;li&gt;
&lt;code&gt;timeZone&lt;/code&gt; : [Optionnel] Permet de définir le fuseau horaire auquel les heures données correspondent. 

&lt;ul&gt;
&lt;li&gt;Cette valeur doit correspondre au nom d'un &lt;strong&gt;fuseau horaire défini par la spécification IANA&lt;/strong&gt;. &lt;em&gt;(Colonne TZ identifier dans &lt;a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" rel="noopener noreferrer"&gt;Wikipedia - Fuseau Horaire&lt;/a&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Par défaut cette valeur est à &lt;code&gt;UTC&lt;/code&gt;. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;suspendDeployments&lt;/code&gt; : [Optionnel] Booléen permettant de savoir si l'opérateur doit arrêter les déploiements du namespace.

&lt;ul&gt;
&lt;li&gt;Par défaut cette valeur est à &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;suspendCronJobs&lt;/code&gt; : [Optionnel] Booléen permettant de savoir si l'opérateur doit arrêter les cron jobs du namespace

&lt;ul&gt;
&lt;li&gt;Par défaut cette valeur est à &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;excludeRef&lt;/code&gt; : [Optionnel] Tableau d'objets permettant de définir les références des déploiements ou cron jobs à ignorer pour la mise en sommeil.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apiVersion&lt;/code&gt; : Version de la ressource à exclure. Actuellement sont supportés : &lt;code&gt;apps/v1&lt;/code&gt;, &lt;code&gt;batch/v1beta1&lt;/code&gt; et &lt;code&gt;batch/v1&lt;/code&gt;  &lt;em&gt;(à ne pas définir si vous utilisez &lt;code&gt;matchLabels&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kind&lt;/code&gt; : Type de la ressource à exclure. Actuellement sont supportés : &lt;code&gt;Deployment&lt;/code&gt; et &lt;code&gt;CronJob&lt;/code&gt;  &lt;em&gt;(à ne pas définir si vous utilisez &lt;code&gt;matchLabels&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; : Nom de la ressource à exclure &lt;em&gt;(à ne pas définir si vous utilisez &lt;code&gt;matchLabels&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;matchLabels&lt;/code&gt; : Liste des labels pour identifier les ressources à exclure &lt;em&gt;(A ne pas définir si vous utilisez &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;apiVersion&lt;/code&gt; et &lt;code&gt;kind&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cas d'utilisations
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tout arrêter sauf api-gateway
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-green.com/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SleepInfo&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;working-hours&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;weekdays&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;
  &lt;span class="na"&gt;sleepAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;20:00"&lt;/span&gt;
  &lt;span class="na"&gt;wakeUpAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;08:00"&lt;/span&gt;
  &lt;span class="na"&gt;timeZone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Europe/Rome"&lt;/span&gt;
  &lt;span class="na"&gt;suspendCronJobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;excludeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/v1"&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;Deployment&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;api-gateway&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans cet exemple, on peut voir que l'on cherche à tout éteindre (Déploiements &amp;amp; CronJob) à 20h chaque soir en semaine et à les redémarrer à 8h en semaine, à l'exception du déploiement "api-gateway".&lt;/p&gt;

&lt;p&gt;Cas utile si vous avez peu de ressources à exclure du processus.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tout arrêter sauf les ressources avec un label particulier
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-green.com/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SleepInfo&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;working-hours&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;weekdays&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;
  &lt;span class="na"&gt;sleepAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;20:00"&lt;/span&gt;
  &lt;span class="na"&gt;wakeUpAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;08:00"&lt;/span&gt;
  &lt;span class="na"&gt;timeZone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Europe/Rome"&lt;/span&gt;
  &lt;span class="na"&gt;suspendCronJobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;excludeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
        &lt;span class="na"&gt;kube-green.dev/exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans cet exemple on voit que cette fois-ci tout sera éteint, à l'exception de l'ensemble des ressources ayant le label &lt;code&gt;kube-green.dev/exclude: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ce cas est à privilégier si vous avez beaucoup de ressources dans un namespace et que nombre d'entre elles sont à exclures.&lt;/p&gt;

&lt;h4&gt;
  
  
  Arrêter que les CronJob
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-green.com/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SleepInfo&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;working-hours&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;weekdays&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
  &lt;span class="na"&gt;sleepAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;20:00"&lt;/span&gt;
  &lt;span class="na"&gt;wakeUpAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;08:00"&lt;/span&gt;
  &lt;span class="na"&gt;suspendCronJobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;suspendDeployments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afin d'arrêter uniquement les CronJob, il vous suffit de mettre &lt;code&gt;suspendCronJobs&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt; et &lt;code&gt;suspendDeployments&lt;/code&gt; à &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sans redémarrage
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-green.com/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SleepInfo&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;working-hours&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;weekdays&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;
  &lt;span class="na"&gt;sleepAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;20:00"&lt;/span&gt;
  &lt;span class="na"&gt;timeZone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Europe/Rome"&lt;/span&gt;
  &lt;span class="na"&gt;suspendCronJobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;excludeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/v1"&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;Deployment&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;api-gateway&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cet exemple nous montre qu'il est possible de ne pas définir d'heure de redémarrage. Sur le coup on peut se demander en quoi ça peut être utile, et finalement il y a un cas simple : pour vos environnements de test.&lt;/p&gt;

&lt;p&gt;Ca dépend de votre contexte, mais il se peut que vous ayez des environnements qui ne soient utilisés qu'une fois par mois pour effectuer des tests dessus. Si c'est le cas, le redémarrer tous les jours est inutile, et donc ne pas définir d'heure de démarrage est bien utile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Liens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kube-green.dev/" rel="noopener noreferrer"&gt;Site Kube-Green&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kube-green/kube-green" rel="noopener noreferrer"&gt;Projet Github Kube-Green&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Kube-Green est un projet prometteur qui, je l'espère nous permettra d'aller plus loin dans la limitation de notre impact sur la planète. Dans l'immédiat je pense aux daemonsets qui pourraient être coupés si ils sont inutiles, le fait de scale down automatiquement à 0 une ressource non-exclue si on déploie pendant les heures de "sommeil", voir de pouvoir interagir avec d'autres opérateur pour aller couper d'autres ressources &lt;em&gt;(notamment des ressources dans AWS ou GCP avec Crossplane)&lt;/em&gt;...&lt;/p&gt;

&lt;p&gt;C'est peut être pas grand chose, mais comme pour tout le reste, si on fait tous un peu d'efforts par-ci et par là, toutes ces petites contributions vont nous permettre de faire quelque chose de grand! &lt;/p&gt;

&lt;p&gt;J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient &lt;em&gt;(Il n'y a jamais de questions bêtes!)&lt;/em&gt; 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 &lt;a href="https://www.linkedin.com/in/maxime-guilbert-14b6a5128/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;em&gt;(même pour parler d'autres sujets!)&lt;/em&gt;.&lt;/p&gt;




&lt;center&gt;&lt;h3&gt;Vous voulez me supporter?&lt;/h3&gt;&lt;/center&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/mxguilbert7" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fdefault-orange.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>french</category>
    </item>
  </channel>
</rss>
