<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Helm on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/helm/</link><description>Recent content in Helm on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 19 Apr 2021 07:59:14 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/helm/index.xml" rel="self" type="application/rss+xml"/><item><title>Pourquoi Helm 2 doit disparaître</title><link>https://blog.zwindler.fr/2021/04/19/pourquoi-helm-2-doit-disparaitre/</link><pubDate>Mon, 19 Apr 2021 07:59:14 +0000</pubDate><guid>https://blog.zwindler.fr/2021/04/19/pourquoi-helm-2-doit-disparaitre/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/04/Rage.webp" alt="Featured image of post Pourquoi Helm 2 doit disparaître" /&gt;&lt;h2 id="deployer-sur-kubernetes-avec-helm-cest-vraiment-se-faire-du-mal"&gt;Deployer sur Kubernetes avec Helm, c’est vraiment se faire du mal
&lt;/h2&gt;&lt;p&gt;Je ne sais plus qui parmi vous écrivait il y a peu « Avec Kubernetes, c’est un peu une love/hate relationship ». J’adore Kubernetes, particulièrement dans les contextes où il résout des « million-dollar problems ». Mais alors&amp;hellip; QU’EST CE QUE JE DETESTE HELM.&lt;/p&gt;
&lt;p&gt;Je rage / shitpost régulièrement sur Helm, mais malheureusement il n’y a pas tant d’alternatives pour déployer facilement dans Kubernetes (oui je sais qu’il y en a, ce n’est pas le but du post).&lt;/p&gt;
&lt;h2 id="mais-attend-tu-parles-de-helm-2-dans-ton-titre-"&gt;Mais attend, tu parles de Helm 2 dans ton titre ?
&lt;/h2&gt;&lt;p&gt;Ça fait des années que j’ai ce brouillon en attente sur le blog (encore un, me direz-vous). Je commençais à me dire que ce n’avait plus vraiment d’intérêt de le poster maintenant que &lt;a class="link" href="https://helm.sh/blog/helm-v2-deprecation-timeline/" target="_blank" rel="noopener"
&gt;Helm 2 est officiellement déprécié et remplacé par Helm 3 depuis quasiment 1 an.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mais j’ai lu un &lt;a class="link" href="https://serveur410.com/ton-coin-de-web-tattends/" target="_blank" rel="noopener"
&gt;chouette article de serveur410&lt;/a&gt; il y a quelques jours qui m’a décomplexé de poster des articles anachroniques (et je vous invite à aller lire cet article, que vous ayez un blog ou non).&lt;/p&gt;
&lt;p&gt;Donc oui, je vais parler d’une techno dépréciée depuis plus d’un an et dont le remplaçant qui est censé magiquement régler tous les problèmes est apparu en 2019.&lt;/p&gt;
&lt;p&gt;Pour autant, ce n’est pas parce que cet article va parler de Helm 2, de ses bugs que j’ai rencontrés et de comment on se sort de chaque situation pourrie. Le plus simple étant de passer à Helm 3, même sil est pété lui aussi (on en reparlera sûrement).&lt;/p&gt;
&lt;h2 id="déployer-avec-helm2-quel-enfer-"&gt;Déployer avec Helm2, quel enfer !
&lt;/h2&gt;&lt;p&gt;Mais revenons à Helm 2. En 2018/2019, je déploie en production des applications dans un Kubernetes managé qu’on manage nous-même (trop long à expliquer ;-p).&lt;/p&gt;
&lt;p&gt;On avait la « flemme » de migrer de Helm 2 à Helm 3 et franchement on a vraiment eu tort. Je vais vous faire une petite histoire vraie de ce qui s’est passé lorsque j’ai essayé de redéployer un prometheus.&lt;/p&gt;
&lt;h2 id="la-genèse"&gt;La genèse
&lt;/h2&gt;&lt;p&gt;Pour une raison qui m’échappe (car le brouillon est beaucoup trop vieux), j’ai commencé par supprimer la release helm plutôt que d’&lt;em&gt;upgrade&lt;/em&gt; mon déploiement (la release devait être dans un état foireux, et &lt;a class="link" href="https://helm.sh/docs/faq/#improved-upgrade-strategy-3-way-strategic-merge-patches" target="_blank" rel="noopener"
&gt;comme Helm 2 ne supporte pas le 3-way merge&amp;hellip;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Je supprime donc ma release.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm delete prometheus
release &amp;#34;prometheus&amp;#34; deleted
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je ne peux donc plus « upgrade » ma release puisqu’elle n’existe plus.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm upgrade prometheus stable/prometheus
Error: UPGRADE FAILED: &amp;#34;prometheus&amp;#34; has no deployed releases
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="so-far-so-good"&gt;So far, so good
&lt;/h2&gt;&lt;p&gt;J’essaye donc de la réinstaller&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm install prometheus stable/prometheus
Error: This command needs 1 argument: chart name
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ah ! Et oui, la commande est différente selon qu’on &lt;em&gt;upgrade&lt;/em&gt; ou qu’on &lt;em&gt;install&lt;/em&gt; une release. Pratique.&lt;/p&gt;
&lt;p&gt;Vous allez me dire « bah, pourquoi tu ne fais pas un &lt;em&gt;upgrade &amp;ndash;install&lt;/em&gt;, comme ça la commande est la même que tu upgrade ou que tu installes ?&lt;/p&gt;
&lt;p&gt;Tout simplement car cette commande ne marchait PLUS pendant longtemps (genre 2 ans), comme le témoigne cette issue sur Github et ce tweet rageur d’un certain zwindler&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_helm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Enfin bon&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm install --name prometheus stable/prometheus
Error: a release named prometheus already exists.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Là, par contre, on est d’accord que Helm se fiche vraiment de moi ?&lt;/p&gt;
&lt;p&gt;Donc, dans ce genre de souci, vous pouvez sortir l’artillerie lourde avec le « &amp;ndash;purge », qui fini par devenir la norme (en gros, je le mettais à chaque fois).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm delete prometheus --purge
release &amp;#34;prometheus&amp;#34; deleted
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et là on peut réinstaller sa release&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm install --name prometheus stable/prometheus -f prom-values-with-thanos.yaml
NAME: prometheus
LAST DEPLOYED: Thu Oct 10 15:12:39 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon&amp;hellip; et la prochaine fois que vous voudrez mettre à jour les valeurs de votre déploiement, n’oubliez pas de refaire des « upgrade » et pas « install », sinon il va vous conseiller de la delete ;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zwindler$ helm install --name prometheus stable/prometheus -f prom-values-with-thanos.yaml
Error: a release named prometheus already exists.
Run: helm ls --all prometheus; to check the status of the release
Or run: helm del --purge prometheus; to delete it
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/04/Rage.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-cest-pas-fini-"&gt;Et c’est pas fini !
&lt;/h2&gt;&lt;p&gt;Dans les bugs rigolos de Helm 2, on a aussi le flag DEBUG, souvent utilisé dans les Charts pour activer le mode debug du logiciel que vous essayez de déployer, qui est AUSSI utilisé par Helm pour passer en debug et qui vous crache du caca dans votre CI.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client: &amp;amp;amp;version.Version{SemVer:&amp;#34;v2.4.1&amp;#34;, GitCommit:&amp;#34;46d9ea82e2c925186e1fc620a8320ce1314cbb02&amp;#34;, GitTreeState:&amp;#34;clean&amp;#34;}
2017/05/06 16:11:47 (0xc42088e210) (0xc4204be000) Create stream
2017/05/06 16:11:47 (0xc42088e210) (0xc4204be000) Stream added, broadcasting: 1
2017/05/06 16:11:47 (0xc42088e210) Reply frame received for 1
2017/05/06 16:11:47 (0xc4204be000) (1) Writing data frame
2017/05/06 16:11:47 (0xc42088e210) (0xc4204be140) Create stream
2017/05/06 16:11:47 (0xc42088e210) (0xc4204be140) Stream added, broadcasting: 3
...
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/helm/helm/issues/2401" target="_blank" rel="noopener"
&gt;github.com/helm/helm/issues/2401&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Ah oui tient, c’est marrant ça, on devrait peut être changer DEBUG en HELM_DEBUG ?No shit, sherlock&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ou bien les ConfigMap trop grandes (lol) qui font planter tiller&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[storage] 2020/01/14 15:00:16 getting release history for &amp;#34;airflow&amp;#34;
[storage/driver] 2020/01/14 15:00:16 create: failed to create: ConfigMap &amp;#34;airflow.v1&amp;#34; is invalid: []: Too long: must have at most 1048576 characters
[tiller] 2020/01/14 15:00:16 warning: Failed to record release airflow: ConfigMap &amp;#34;airflow.v1&amp;#34; is invalid: []: Too long: must have at most 1048576 characters
[kube] 2020/01/14 15:00:16 building resources from manifest
[kube] 2020/01/14 15:00:16 creating 21 resource(s)
[kube] 2020/01/14 15:00:18 beginning wait for 21 resources with timeout of 5m0s
[kube] 2020/01/14 15:00:20 Pod is not ready: airflow/airflow-worker-0
[kube] 2020/01/14 15:00:38 Pod is not ready: airflow/airflow-worker-0
[kube] 2020/01/14 15:00:40 Pod is not ready: airflow/airflow-worker-1
[kube] 2020/01/14 15:00:42 Pod is not ready: airflow/airflow-worker-1
[kube] 2020/01/14 15:00:44 Pod is not ready: airflow/airflow-worker-1
[kube] 2020/01/14 15:00:46 Pod is not ready: airflow/airflow-worker-1
[tiller] 2020/01/14 15:01:40 executing 0 post-install hooks for airflow
[tiller] 2020/01/14 15:01:40 hooks complete for post-install airflow
[storage] 2020/01/14 15:01:40 updating release &amp;#34;airflow.v1&amp;#34;
[storage/driver] 2020/01/14 15:01:40 update: failed to update: configmaps &amp;#34;airflow.v1&amp;#34; not found
[tiller] 2020/01/14 15:01:40 warning: Failed to update release airflow: configmaps &amp;#34;airflow.v1&amp;#34; not found
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/helm/helm/issues/1413" target="_blank" rel="noopener"
&gt;github.com/helm/helm/issues/1413&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ou enfin, les timeouts de tiller quand vous avez trop déployé (lol) et que du coup les commandes « helm list » timeout&amp;hellip; ce qui nous avait obligé à installer un tiller par namespace et modifier notre CI pour gérer tout ce bazar.&lt;/p&gt;
&lt;p&gt;Non, vraiment, Helm 2 est vraiment un chouette logiciel !&lt;/p&gt;</description></item><item><title>Se simplifier Kubernetes avec Helm et les Charts</title><link>https://blog.zwindler.fr/2018/02/06/se-simplifier-kubernetes-helm-charts/</link><pubDate>Tue, 06 Feb 2018 12:45:16 +0000</pubDate><guid>https://blog.zwindler.fr/2018/02/06/se-simplifier-kubernetes-helm-charts/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/02/Kubernetes-Helm.webp" alt="Featured image of post Se simplifier Kubernetes avec Helm et les Charts" /&gt;&lt;h2 id="helm-tiller-charts--cest-quoi-tout-ça-"&gt;Helm, Tiller, Charts : c’est quoi tout ça ?
&lt;/h2&gt;&lt;p&gt;Ceux qui suivent un peu le blog savent que &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=Kubernetes" &gt;je bidouille pas mal avec Kubernetes en ce moment&lt;/a&gt;. Dans mon travail précédent on commençait à peut être se dire que Swarm n’allait pas être suffisant (ahaha) et j’avais donc décidé de prendre les devants histoire de savoir de quoi je parle au moment où la décision serait prise de foncer ;-). Et rapidement je me suis rendu compte, qu’avec Kubernetes, on se retrouve vite à devoir écrire du YAML à tour de bras pour configurer nos ressources (&lt;a class="link" href="https://blog.zwindler.fr/2017/10/24/tutoriel-xwiki-ma-premier-appli-stateful-sur-kubernetes/" &gt;« petit » exemple avec XWiki, une application Tomcat + SGBDr&lt;/a&gt;). C’est là que Helm (et Tiller) et les Charts entrent en jeu.&lt;/p&gt;
&lt;p&gt;L’idée derrière Helm et les Charts ? Avoir un magasin en ligne d’applications multi-tiers déployables en une seule ligne de commande.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The package manager for Kubernetes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il faut voir celà comme un magasin un peu sur la philosophie de Dockerhub (applications officielles ou fournies par la communauté), permettant de déployer sur notre cluster des applications potentiellement complexes et/ou multi-tiers de manière automatique (un peu comme un docker-compose mais pour Kubernetes).&lt;/p&gt;
&lt;p&gt;Avant d’aller plus loin, un peu de terminologie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Charts&lt;/strong&gt; : Collection de fichiers YAML variabilisés décrivant des ressources qui, misent bout à bout, donnent une application déployable sur Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Helm&lt;/strong&gt; : Client permettant de récupérer des Charts et de les appliquer sur un cluster Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiller&lt;/strong&gt; : Partie serveur permettant à un client Helm donner des ordres au cluster Kubernetes visé&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-de-helm"&gt;Installation de Helm
&lt;/h2&gt;&lt;p&gt;Ne faisons pas durer le suspens plus longtemps et attaquons nous à l’installation des composants nécessaires !&lt;/p&gt;
&lt;p&gt;A noter, je pars du principe que vous disposez d’un cluster Kubernetes fonctionnel et que celui ci tourne sous Linux. Si ce n’est pas le cas je vous propose de lire mes tutoriels sur le déploiement de cluster Kubernetes, soit avec &lt;a class="link" href="https://blog.zwindler.fr/2017/10/05/installer-kubernetes-kubespray-ansible/" &gt;Ansible (Kubespray)&lt;/a&gt; soit avec &lt;a class="link" href="https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/" &gt;l’outil Kubeadm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A l’heure où j’écris ces lignes, l’outil Helm est disponible à sa version 2.8.0. Vous pouvez &lt;a class="link" href="https://github.com/kubernetes/helm" target="_blank" rel="noopener"
&gt;retrouver la documentation officielle sur le Github&lt;/a&gt; et &lt;a class="link" href="https://docs.helm.sh/using_helm/#quickstart-guide" target="_blank" rel="noopener"
&gt;sur le site de Helm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En réalité, il s’agit simplement d’une copie du binaire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -o helm.tar.gz https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-linux-amd64.tar.gz
tar xzf helm.tar.gz
mv linux-amd64/helm /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Dans le cas où vous ne seriez pas directement sur une des machines du cluster, il est nécessaire de disposer de &lt;strong&gt;kubectl&lt;/strong&gt; et surtout d’avoir correctement configuré son « contexte ».&lt;/p&gt;
&lt;p&gt;Dans le cas où le contexte n’est pas configuré vous aurez le message suivant :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config current-context
error: current-context is not set
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, si vous vous mettez en SSH directement sur un serveur qui est master, cette étape est potentiellement inutile (le contexte par défaut est administrateur dans ce cas).&lt;/p&gt;
&lt;p&gt;On vérifie qu’on arrive bien à requêter le cluster :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl cluster-info
Kubernetes master is running at http://localhost:8080
KubeDNS is running at http://localhost:8080/api/v1/namespaces/kube-system/services/kube-dns/proxy
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="tiller"&gt;Tiller
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on dispose d’un client Helm ayant accès au contexte de notre cluster, on peut installer Tiller. Utiliser la commande « helm init ». Attention : Tiller sera installé dans le contexte courant, ne vous trompez pas de cluster ;-).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;helm init
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-maintenant-on-fait-quoi-"&gt;Et maintenant, on fait quoi ?
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a installé tous les composants dont nous avions besoin (et oui déjà), on va se contenter de dans un premier temps de suivre les exemples fournis. La documentation officielle nous propose de déployer une base MySQL.&lt;/p&gt;
&lt;p&gt;Bonne idée, voyons ce que ça donne !&lt;/p&gt;
&lt;p&gt;La première étape qu’on nous demande de faire est de mettre à jour la liste des Charts disponibles sur le dépôt officiel :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;helm repo update #mettre à jour la liste des charts disponibles sur le store officiel
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the &amp;#34;stable&amp;#34; chart repository
Update Complete. ⎈ Happy Helming!⎈
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J’adore le petit caractère « barre de navigateur » ;-)&lt;/p&gt;
&lt;p&gt;Plus sérieusement, l’étape d’après est simplement de faire un &lt;strong&gt;helm install&lt;/strong&gt;, qui va se charger de récupérer tous les YAML nécessaires pour déployer MySQL. La liste des composants Kubernetes créés apparaitra ensuite à l’écran (et vous pouvez les retrouver sur votre cluster avec un &lt;strong&gt;kubectl&lt;/strong&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;helm install stable/mysql
NAME: silly-moose
LAST DEPLOYED: Tue Dec 5 10:12:58 2017
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==&amp;gt; v1/Secret
NAME TYPE DATA AGE
silly-moose-mysql Opaque 2 1m
==&amp;gt; v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
silly-moose-mysql Pending 1m
==&amp;gt; v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
silly-moose-mysql ClusterIP 10.233.54.164 3306/TCP 1m
==&amp;gt; v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
silly-moose-mysql 1 1 1 0 1m
==&amp;gt; v1/Pod(related)
NAME READY STATUS RESTARTS AGE
silly-moose-mysql-3998799777-hk5fj 0/1 Pending 0 1m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sans surprise on retrouve un &lt;strong&gt;Secret&lt;/strong&gt; (le mot de passe de votre utilisateur), un &lt;strong&gt;PersistentVolumeClaim&lt;/strong&gt; (pour stocker vos données), un &lt;strong&gt;Service&lt;/strong&gt; de type &lt;em&gt;ClusterIP&lt;/em&gt; pour accéder et un &lt;strong&gt;Deployment&lt;/strong&gt; pour MySQL lui même.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A noter :&lt;/strong&gt; par défaut, Kubernetes donne un &lt;em&gt;petit nom aléatoire&lt;/em&gt; à nos composants pour les rendre uniques, car nous n’avons pas donné de nom en arguments.&lt;/p&gt;
&lt;p&gt;On remarquera la délicate attention des gens qui ont écrit le Chart et qui affiche, une fois le déploiement terminé, les étapes suivantes pour vérifier que tout fonctionne et se connecter une première fois.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
silly-moose-mysql.default.svc.cluster.local
To get your root password run:
kubectl get secret --namespace default silly-moose-mysql -o jsonpath=&amp;#34;{.data.mysql-root-password}&amp;#34; | base64 --decode; echo
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update &amp;amp;&amp;amp; apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h silly-moose-mysql -p
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ok-je-teste-alors-"&gt;OK je teste alors !
&lt;/h2&gt;&lt;p&gt;Et normalement, si vous essayez, &lt;strong&gt;ça ne marchera pas !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pourquoi ça ? On a bien tous les composants pour faire marcher MySQL.&lt;/p&gt;
&lt;p&gt;Tous ?&lt;/p&gt;
&lt;p&gt;Non ! Un irréductible gaulois résiste à l’envahisseur. Vous l’avez trouvé ?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/12/pvc_for_mysql.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et oui ! La documentation nous dit juste de faire un &lt;strong&gt;helm install&lt;/strong&gt;&amp;hellip; sans nous rappeler que le &lt;strong&gt;PersistentVolumeClaim&lt;/strong&gt; qui sera créé nécessite &amp;hellip; un &lt;strong&gt;PersistentVolume&lt;/strong&gt; ! Pour ceux qui n’auraient pas révisé leur terminologie Kubernetes, en gros MySQL attend qu’un disque se libère mais aucun n’est disponible.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;Deployment&lt;/strong&gt; se bloque donc à l’étape de &lt;em&gt;Claim&lt;/em&gt; et y restera indéfiniment tant qu’un PV compatible n’est pas disponible.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/12/pvc_not_bound.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On doit donc créer un PV. Personnellement &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=gluster" &gt;j’ai créé un volume gluster parce que j’aime bien GlusterFS&lt;/a&gt; et j’ai créé le PV manquant dans Kubernetes.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gluster volume create gluster-pv-mysql replica 3 node01:/brick/gluster-pv-mysql node02:/brick/gluster-pv-mysql node03:/brick/gluster-pv-mysql force
volume create: gluster-pv-mysql: success: please start the volume to access data
gluster volume start gluster-pv-mysql
volume start: gluster-pv-mysql: success
cat &amp;gt; gluster-pv-mysql.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv-mysql
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
glusterfs:
endpoints: gluster-cluster
path: /gluster-pv-mysql
readOnly: false
persistentVolumeReclaimPolicy: Delete
EOF
kubectl apply -f gluster-pv-mysql.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, votre &lt;strong&gt;Deployment&lt;/strong&gt; devrait reprendre la main.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Facile, hein ?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="ouais-ok-mais-moi-je-veux-modifier-le-nom-de-ma-base-mysql"&gt;Ouais ok mais moi je veux modifier le nom de ma base MySQL
&lt;/h2&gt;&lt;p&gt;Ok on est capable de déployer MySQL, super. Mais généralement on veut personnaliser les composants qu’on déploie !&lt;/p&gt;
&lt;p&gt;C’est bien évidemment prévu par les Charts, c’est même leur but premier.&lt;/p&gt;
&lt;p&gt;Pour savoir ce qui peut être personnalisé et qui dépendra de chaque &lt;strong&gt;Chart&lt;/strong&gt; que vous utiliserez, pas le choix : il faut aller lire &lt;a class="link" href="https://github.com/kubernetes/charts/tree/master/stable/mysql" target="_blank" rel="noopener"
&gt;la documentation du Chart de MySQL (ici sur Github)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/12/stable_mysql_chart_variables.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour vous donner un petit exemple de ce qu’on peut faire avec notre MySQL, voici quelques arguments utiles que vous pouvez personnaliser :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;helm install --name test \
--set mysqlLRootPassword=secretpassword,mysqlUser=zwindler,mysqlPassword=supermotdepasse,mysqlDatabase=zwindlerdb \
stable/mysql
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Après déploiement, on peut retester la connexion via un container ubuntu temporaire (comme la fois d’avant), et s’assurer qu’on peut se connecter sur notre base MySQL avec notre nouvel utilisateur &lt;em&gt;zwindler&lt;/em&gt; et son &lt;em&gt;supermotdepasse&lt;/em&gt; !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[root@node01 ~]# kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
If you don&amp;#39;t see a command prompt, try pressing enter.
root@ubuntu:/#
root@ubuntu:/# apt-get update &amp;amp;&amp;amp; apt-get install mysql-client -y
[…]
mysql -h test-mysql -u zwindler -p
#supermotdepasse
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-on-nettoie-tout--supprimer-un-chart"&gt;Et on nettoie tout : supprimer un Chart
&lt;/h2&gt;&lt;p&gt;Dans le cas où vous voudriez tout nettoyer d’un coup, vous pouvez utiliser Helm pour supprimer en même temps tous les composants que vous auriez déployés via un « helm install mon-chart ».&lt;/p&gt;
&lt;p&gt;Ici, je peux supprimer l’ensemble des composants qui ont été créés dans cet exemple « silly-moose-mysql ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;helm delete silly-moose-mysql
release &amp;#34;silly-moose-mysql&amp;#34; deleted
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>