<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PaaS on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/paas/</link><description>Recent content in PaaS on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 17 May 2022 10:00:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/paas/index.xml" rel="self" type="application/rss+xml"/><item><title>Et si on testait le Clever Operator pour Kubernetes ?</title><link>https://blog.zwindler.fr/2022/05/17/et-si-on-testait-clever-kubernetes-operator/</link><pubDate>Tue, 17 May 2022 10:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2022/05/17/et-si-on-testait-clever-kubernetes-operator/</guid><description>&lt;img src="https://blog.zwindler.fr/2022/05/clever-trott.webp" alt="Featured image of post Et si on testait le Clever Operator pour Kubernetes ?" /&gt;&lt;h2 id="clever-operator"&gt;Clever Operator
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, je suis tombé sur cet article de Clever Cloud qui disait avoir &lt;a class="link" href="https://www.clever-cloud.com/fr/blog/fonctionnalites/2022/03/16/clever-operator/" target="_blank" rel="noopener"
&gt;annonçait la sortie de l&amp;rsquo;Operator pour Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nous avons commencé à travailler sur le Clever Operator suite aux retours de certains de nos clients utilisant k8s ou Openshift qui n’étaient pas vraiment satisfaits des solutions de gestion de base de données fournies par ces plateformes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est pas un secret, j&amp;rsquo;ai beaucoup râlé sur les gens qui disent que Kubernetes c&amp;rsquo;est compliqué et/ou que ça apporte plus de problèmes que ça n&amp;rsquo;en résout (cf &lt;a class="link" href="https://blog.zwindler.fr/2019/09/03/concerning-kubernetes-combien-de-problemes-ces-stacks-ont-generes/%29" target="_blank" rel="noopener"
&gt;https://blog.zwindler.fr/2019/09/03/concerning-kubernetes-combien-de-problemes-ces-stacks-ont-generes/)&lt;/a&gt;. On en a notamment parle avec Quentin ADAM ;-).&lt;/p&gt;
&lt;p&gt;Mais ce que je ne disais pas clairement à cette époque, c&amp;rsquo;est que Kubernetes, c&amp;rsquo;est quand même plus simple quand il s&amp;rsquo;agit d&amp;rsquo;autonomiser les devs sur des workloads stateless.&lt;/p&gt;
&lt;p&gt;Ou alors du stateful, mais pas trop violent : genre stockage de fichiers (Prometheus par exemple), voire fichiers partagés (avec un FS distribué, partagé entre plusieurs apps ou instances d&amp;rsquo;une même app).&lt;/p&gt;
&lt;p&gt;Par contre, les bases de données, là, on rigole tout de suite beaucoup moins&amp;hellip;&lt;/p&gt;
&lt;p&gt;Attention, je ne dis pas que c&amp;rsquo;est impossible. Plein de gens le font, en prod (moi compris). Mais c&amp;rsquo;est tout de suite un autre niveau de complexité, car il faut gérer le cycle de vie de la base de données, les mises à jours, les pertes de noeuds proprement, etc.&lt;/p&gt;
&lt;p&gt;Pour faciliter ça, il existe les &amp;ldquo;Opérateurs&amp;rdquo; dans Kubernetes, qui ont pour but d&amp;rsquo;ajouter toute une logique fonctionnelle pour gérer ça (comme celui pour &lt;a class="link" href="https://blog.zwindler.fr/2020/09/28/mes-bases-mongodb-dans-kubernetes/" target="_blank" rel="noopener"
&gt;MongoDB dont je parle dans cet article&lt;/a&gt;), mais c&amp;rsquo;est pas encore parfait.&lt;/p&gt;
&lt;p&gt;Ajoutez à cela le fait que DBA, c&amp;rsquo;est un job &amp;ldquo;à part&amp;rdquo;, avec des compétences bien spécifiques et qui nécessite vraiment de savoir ce qu&amp;rsquo;on fait.&lt;/p&gt;
&lt;p&gt;Du coup&amp;hellip; j&amp;rsquo;aurais pu dire (en moins classe) :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Les DBs dans Kube, c&amp;rsquo;est ch**nt. Ca serait cool si quelqu&amp;rsquo;un dont c&amp;rsquo;est l&amp;rsquo;expertise pouvait gérer ça pour moi, en dehors de Kube.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Qui a dit &amp;ldquo;Clever Cloud&amp;rdquo; ?&lt;/p&gt;
&lt;h2 id="clever-operator-1"&gt;Clever Operator
&lt;/h2&gt;&lt;p&gt;Ok, admettons qu&amp;rsquo;on ait un Kubernetes fonctionnel. On va plugger Clever Cloud dessus pour voir ce qu&amp;rsquo;on peut faire. Le billet sur le blog de Clever indique 2 manières de déployer l&amp;rsquo;operator (plot twist, il y en a une 3ème qui est mieux).&lt;/p&gt;
&lt;p&gt;La première consiste à utiliser &lt;a class="link" href="https://operatorhub.io/" target="_blank" rel="noopener"
&gt;operatorhub.io&lt;/a&gt;, un site communautaire pour partager des opérateurs Kubernetes.&lt;/p&gt;
&lt;p&gt;Pour utiliser cette méthode, il faut déployer le &lt;code&gt;operator-lifecycle-manager&lt;/code&gt;, lui-même un opérateur, dans notre kubernetes. J&amp;rsquo;ai essayé et j&amp;rsquo;ai plein de critiques à faire sur ce tool.&lt;/p&gt;
&lt;p&gt;Déjà, la doc nous demande de faire un &lt;code&gt;curl | bash&lt;/code&gt; (déjà une hérésie en soit), ensuite, il se déploie sans prévenir sur mon contexte Kubernetes par défaut. Enfin, c&amp;rsquo;est pas bien clair ce qu&amp;rsquo;il faut faire pour le customiser (notamment pour ajouter nos credentials).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai essayé 1h, j&amp;rsquo;ai laissé tomber, mais si vous avez l&amp;rsquo;habitude d&amp;rsquo;utiliser Operatorhub.io vous aurez peut être des infos que je n&amp;rsquo;ai pas.&lt;/p&gt;
&lt;p&gt;La seconde méthode proposée est de déployer (ou de builder) soit même le container Docker dans notre cluster Kubernetes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vous pouvez le built à partir du code source sur Github ou utiliser notre image docker sur Docker Hub.
Puis, configurez le. Ça se résume à paramétrer les variables d’environnement CLEVER_OPERATOR_*. Par exemple, vous devez créer un token pour vous connecter à l’API.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je suis un poil sceptique sur le &amp;ldquo;ça se résume à&amp;rdquo; 😏.&lt;/p&gt;
&lt;p&gt;Quand on va voir le code du clever operator (&lt;a class="link" href="https://github.com/CleverCloud/clever-operator/tree/main/deployments/kubernetes/v1.21.0" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;), on se rend tout de suite compte qu&amp;rsquo;il va falloir déployer &lt;strong&gt;beaucoup&lt;/strong&gt; de ressources Kube et pas juste un container (~650 lignes de YAML).&lt;/p&gt;
&lt;p&gt;En même temps c&amp;rsquo;est logique, il y a le fichier du &lt;code&gt;Deployment&lt;/code&gt;, des &lt;code&gt;Roles&lt;/code&gt;, plusieurs définitions de &lt;code&gt;CRDs&lt;/code&gt;, bref&amp;hellip;&lt;/p&gt;
&lt;h2 id="diy"&gt;DIY
&lt;/h2&gt;&lt;p&gt;Edit du 24/05 : depuis la rédaction de l&amp;rsquo;article, j&amp;rsquo;ai proposé une PR à Florentin (le dev de la feature chez Clever) pour ajouter une Helm Chart. Le principe est le même, on va devoir renseigner des valeurs dans values.yaml donc vous pouvez quand même dérouler l&amp;rsquo;article.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;cd deployments/kubernetes/helm
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;helm install clever-operator -n clever-operator --create-namespace -f values.yaml .
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Du coup, j&amp;rsquo;ai déjà spoilé la solution (qui est d&amp;rsquo;ailleurs mise en avant dans le README.md du &lt;a class="link" href="https://github.com/CleverCloud/clever-operator/blob/main/deployments/kubernetes/v1.21.0/10-custom-resource-definition.yaml" target="_blank" rel="noopener"
&gt;dépot Github.com&lt;/a&gt;). On va déployer le YAML à la main.&lt;/p&gt;
&lt;p&gt;On installe les &lt;code&gt;CRDs&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;kubectl apply -f https://raw.githubusercontent.com/CleverCloud/clever-operator/main/deployments/kubernetes/v1.21.0/10-custom-resource-definition.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/postgresqls.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/redis.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/mysqls.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/mongodbs.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/pulsars.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/configproviders.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;customresourcedefinition.apiextensions.k8s.io/elasticsearches.api.clever-cloud.com configured
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;kubectl api-resources --api-group=api.clever-cloud.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; NAME SHORTNAMES APIVERSION NAMESPACED KIND
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; mongodbs mo api.clever-cloud.com/v1 true MongoDb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; mysqls my api.clever-cloud.com/v1 true MySql
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; postgresqls pg api.clever-cloud.com/v1 true PostgreSql
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; pulsars pulse,pul api.clever-cloud.com/v1beta1 true Pulsar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; redis r api.clever-cloud.com/v1 true Redis
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si je peux me permettre ce commentaire, je trouve ça audacieux, ces shortnames 😱&amp;hellip; Attention aux collisions avec d&amp;rsquo;autres CRDs 🤔.&lt;/p&gt;
&lt;p&gt;Et ensuite on récupère et on va modifier le fichier du &lt;code&gt;Deployment&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -LO https://raw.githubusercontent.com/CleverCloud/clever-operator/main/deployments/kubernetes/v1.21.0/20-deployment.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="préparer-la-configuration"&gt;Préparer la configuration
&lt;/h2&gt;&lt;p&gt;Bon, à un moment donné, il va bien falloir que je connecte l&amp;rsquo;API clever cloud avec mon operator, notamment en renseignant les fameuses variables d’environnement &lt;code&gt;CLEVER_OPERATOR_*&lt;/code&gt; dont parle l&amp;rsquo;article.&lt;/p&gt;
&lt;p&gt;Si on regarde la tête de notre fichier &lt;code&gt;20-deployment.yaml&lt;/code&gt;, on remarque qu&amp;rsquo;il existe une ressource &lt;code&gt;ConfigMap&lt;/code&gt; prévue pour renseigner les credentials (ligne 100).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: clever-operator-system
name: clever-operator-configuration
data:
config.toml: |
[api]
token = &amp;#34;&amp;#34;
secret = &amp;#34;&amp;#34;
consumerKey = &amp;#34;&amp;#34;
consumerSecret = &amp;#34;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous êtes curieux (c&amp;rsquo;est mon cas), ce volume est ensuite appelé dans le &lt;code&gt;Deployment&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; volumes:
- name: config
configMap:
name: clever-operator-configuration
items:
- key: &amp;#34;config.toml&amp;#34;
path: &amp;#34;config.toml&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis monté dans la spec du template de container&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; volumeMounts:
- name: config
mountPath: &amp;#34;/etc/clever-operator&amp;#34;
readOnly: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : Idéalement, on voudra éviter de faire ça, dans la vraie vie. Les &lt;code&gt;ConfigMaps&lt;/code&gt; (comme les &lt;code&gt;Secrets&lt;/code&gt;) dans Kubernetes sont lisibles par beaucoup de monde (la seule différence pour les &lt;code&gt;Secrets&lt;/code&gt;, c&amp;rsquo;est que les chaines de caractères sont &lt;em&gt;base64ifiée&lt;/em&gt;. Si si, c&amp;rsquo;est dans le dico, &amp;ldquo;base64ifier&amp;rdquo;) et donc absolument pas adaptés pour la gestion de &lt;em&gt;secrets&lt;/em&gt;.
On pourrait aussi ajouter ces secrets comme variables d&amp;rsquo;environnement dans le &lt;code&gt;Deployment&lt;/code&gt; (comme proposé dans la méthode 2 par l&amp;rsquo;article), mais c&amp;rsquo;est pire (on peut en débattre) encore niveau sécu.
Idéalement, il faudra injecter ces valeurs avec un gestionnaire de secret tier, comme &lt;a class="link" href="https://blog.zwindler.fr/2020/08/31/gerez-vos-secrets-kubernetes-dans-vault" &gt;Vault par exemple&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="mais-où-on-les-trouve-ces-valeurs-à-renseigner-"&gt;Mais où on les trouve, ces valeurs à renseigner ?
&lt;/h2&gt;&lt;p&gt;Alors je n&amp;rsquo;avais jamais utilisé Clever Cloud avant, donc ça n&amp;rsquo;était pas super évident pour moi 😅.&lt;/p&gt;
&lt;p&gt;On va d&amp;rsquo;abord devoir créer une &lt;strong&gt;organisation&lt;/strong&gt; et récupérer son ID (en haut à droite de l&amp;rsquo;interface). Elle a la forme &lt;code&gt;orga_xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour la partie &lt;strong&gt;consumerKey&lt;/strong&gt; et &lt;strong&gt;consumerSecret&lt;/strong&gt;, j&amp;rsquo;ai trouvé avec la documentation officielle. Dans mon organisation côté UI de Clever Cloud, on peut cliquer sur &amp;ldquo;Create&amp;hellip; / an oauth consumer&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/oauth_consumer.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour la partie &lt;strong&gt;token&lt;/strong&gt; et &lt;strong&gt;secret&lt;/strong&gt;, je n&amp;rsquo;ai pas trouvé comment en créer un en console web et je n&amp;rsquo;ai pas trouvé dans la doc.&lt;/p&gt;
&lt;p&gt;En bidouillant un peu (monkey testing), j&amp;rsquo;ai trouvé qu&amp;rsquo;on pouvait en récupérer en utilisant la &lt;a class="link" href="https://www.clever-cloud.com/doc/getting-started/cli/" target="_blank" rel="noopener"
&gt;CLI de clever cloud&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;curl -fsSL https://clever-tools.clever-cloud.com/gpg/cc-nexus-deb.public.gpg.key | gpg --dearmor -o /usr/share/keyrings/cc-nexus-deb.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;echo &amp;#34;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/cc-nexus-deb.gpg] https://nexus.clever-cloud.com/repository/deb stable main&amp;#34; | tee -a /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;sudo apt-get install clever-tools
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;clever login
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Opening https://console.clever-cloud.com/cli-oauth?cli_version=2.9.1&amp;amp;cli_token=... in your browser to log you in…
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;We&amp;#39;re still waiting for the login process (in your browser) to be completed…
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Login successful as Denis GERMAIN &amp;lt;...&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fenêtre de navigateur s&amp;rsquo;ouvre pour se loguer et magie magie, on a un &lt;strong&gt;token&lt;/strong&gt; et un &lt;strong&gt;secret&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CLEVER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CLEVER_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tadaa !&lt;/p&gt;
&lt;h2 id="deployer-lopérateur"&gt;Deployer l&amp;rsquo;opérateur
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Tout est prêt, allons-y.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On peut apply le manifest et déployer le deployment&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;kubectl apply -f 20-deployment.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;namespace/clever-operator-system created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;serviceaccount/clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;clusterrole.rbac.authorization.k8s.io/system:clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;clusterrolebinding.rbac.authorization.k8s.io/system:clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;poddisruptionbudget.policy/clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;networkpolicy.networking.k8s.io/clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;configmap/clever-operator-configuration created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;deployment.apps/clever-operator created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;del&gt;Note: la dernière version de l&amp;rsquo;image Docker du Clever Operator a &amp;ldquo;un bug&amp;rdquo; du à une version trop ancienne de la GLIBC. Florentin de chez Clever est en discussion avec Redhat pour fix ça (`GLIBC_2.29&amp;rsquo; not found).&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Il &amp;ldquo;suffit&amp;rdquo; de prendre une version plus ancienne de l&amp;rsquo;image et ça remarche, en attendant un fix définitif.&lt;/del&gt; (FIXED)&lt;/p&gt;
&lt;h2 id="on-teste-tout-ça"&gt;On teste tout ça
&lt;/h2&gt;&lt;p&gt;Normalement, là on est bons.&lt;/p&gt;
&lt;p&gt;Dans la liste des bases (des add-ons dans la terminology Clever Cloud) supportées par ce operator, il y a donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ElasticSearch&lt;/li&gt;
&lt;li&gt;MongoDb&lt;/li&gt;
&lt;li&gt;MySql&lt;/li&gt;
&lt;li&gt;PostgreSql&lt;/li&gt;
&lt;li&gt;Pulsar&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La documentation des CRDs &lt;a class="link" href="https://github.com/CleverCloud/clever-operator/blob/main/docs/40-custom-resources.md" target="_blank" rel="noopener"
&gt;est disponible ici&lt;/a&gt; et elle est bien faite.&lt;/p&gt;
&lt;p&gt;Je ferai des tests plus poussés (déployer une vraie application) plus tard, mais déjà pour tester, j&amp;rsquo;ai pu lancer un mysql managée;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat mysql.yml
---
apiVersion: api.clever-cloud.com/v1
kind: MySql
metadata:
namespace: default
name: mysql
spec:
organisation: orga_xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
options:
version: 80
encryption: false
instance:
region: par
plan: dev
kubectl apply -f mysql.yml
mysql.api.clever-cloud.com/mysql created
kubectl get my
NAME AGE
mysql 14s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/db_clever.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;opérateur a également la gentillesse de nous créer un &lt;code&gt;Secret&lt;/code&gt; avec les variables de connexion. C&amp;rsquo;est donc hyper simple de relier notre app à notre nouvelle DB :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;kubectl get secret mysql-secrets -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;data:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_DB: aaa=
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_HOST: aaa==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_PASSWORD: aaa=
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_PORT: aaa==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_URI: aaa==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_USER: aaa==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; MYSQL_ADDON_VERSION: aaa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;kind: Secret
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl run -it mysqlclient --image mysql /bin/bash
root@mysqlclient:/# mysql aaa --host aaa-mysql.services.clever-cloud.com --user aaa -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
[...]
mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai été très content de tester cet operator, et surtout de pouvoir échanger avec son développeur, Florentin DUBOIS, qui m&amp;rsquo;a aidé et à qui j&amp;rsquo;ai pu remonter quelques petits défauts de jeunesse de l&amp;rsquo;outil.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;intégration entre Clever et Kubernetes marche vraiment bien, c&amp;rsquo;est fluide. La documentation des &lt;code&gt;CRDs&lt;/code&gt; est bien faite, on est pas perdus. Enfin, la génération à la volée du &lt;code&gt;Secret&lt;/code&gt; contenant les informations de connexion directement dans Kubernetes est vraiment une fonctionnalité bien pratique, puisqu&amp;rsquo;on voudra souvent monter directement les informations qu&amp;rsquo;il contient dans un &lt;code&gt;Pod&lt;/code&gt; du même namespace.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;De mon point de vue, il manque une Chart Helm, pour rentre le déploiement simple et flexible de l&amp;rsquo;opérateur, et sans trop spoiler ça devrait arriver bientôt ;-).&lt;/del&gt; (FIXED)&lt;/p&gt;
&lt;p&gt;A moi le pouvoir tout puissant des bases de données que je n&amp;rsquo;ai pas à gérer !&lt;/p&gt;</description></item></channel></rss>