<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rgmanager on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/rgmanager/</link><description>Recent content in Rgmanager on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Fri, 11 Oct 2019 06:40:55 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/rgmanager/index.xml" rel="self" type="application/rss+xml"/><item><title>Un cluster Proxmox VE avec seulement 2 machines !</title><link>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</link><pubDate>Fri, 11 Oct 2019 06:40:55 +0000</pubDate><guid>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/proxmox.webp" alt="Featured image of post Un cluster Proxmox VE avec seulement 2 machines !" /&gt;&lt;p&gt;Depuis le temps que je vous parle de clusters et de Proxmox (en gros, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;depuis 2015&lt;/a&gt;), ou même de clusters tout court, j’ai pu vous en mettre des tartines sur le fait qu’il ne faut pas faire des clusters avec un nombre pair de machines (ou tout autre cas défavorable dans lequel deux moitiés d’un cluster peuvent se retrouver isolées l’une de l’autre). Le split brain, c’est pas bon pour votre Karma, croyez moi sur parole (ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=split" &gt;allez voir vous même&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ça me rappelle la fois où un &amp;ldquo;&amp;ldquo;&amp;ldquo;architecte&amp;rdquo;&amp;rdquo;&amp;rdquo; de chez Datacore était venu nous expliquer que sa solution de stockage à 2 pattes ne POUVAIT PAS avoir de split brain (alors que si, les ingés du support ont du repasser par derrière pour nous dire que &amp;ldquo;oui désolé vous avez évidemment raison c’est un cas possible&amp;rdquo; #LOL).&lt;/p&gt;
&lt;p&gt;Bref, et donc à force d’en parler, il fallait bien quand même que je donne un jour la solution pour le faire quand même, mais proprement. Sans trop de surprise, Corosync, la librairie qui gère les clusters Linux depuis qu’on a arrêté de faire des horreurs avec heartbeat (ou pire : &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=redhat&amp;#43;cluster&amp;#43;suite" &gt;cman+rgmanager, achevez moi&lt;/a&gt;), gère évidemment les deux possibilités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gérer soit même le membre prioritaire en cas de split brain avec un poids (ça on va pas en parler mais sachez que c’est possible)&lt;/li&gt;
&lt;li&gt;Ajouter un vote externe pour obtenir un quorum (comme tous les vrais logiciels qui font du clustering un peu sérieux quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations-du-corosync-external-vote-dans-pve"&gt;Limitations du &amp;ldquo;Corosync External Vote&amp;rdquo; dans PVE
&lt;/h2&gt;&lt;p&gt;La petite déception du jour viendra surtout du fait que, si la documentation de Proxmox VE indique clairement que l’option est supportée, en réalité, le support se limite aux fonctions natives de corosync, et encore pas toutes.&lt;/p&gt;
&lt;p&gt;Pas moyen de voir notre vote externe dans l’interface de Proxmox VE par exemple. A priori, le support des quorum disk n’est plus assuré non plus depuis la version 4 de PVE.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut aussi savoir que pour l’instant, seul l’utilisation d’une IP pour renseigner le quorum serveur est possible. On ne peut pas utiliser un FQDN, ce qui me parait dingue comme limitation en 2019, mais bon&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ces deux points mis de côté, vous allez voir, ce n’est pas sorcier. La procédure est en bonne partie détaillée &lt;a class="link" href="https://pve.proxmox.com/wiki/Cluster_Manager#_corosync_external_vote_support" target="_blank" rel="noopener"
&gt;dans la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour ce tutoriel, vous allez donc avoir besoin de 2 machines (a minima), déjà en cluster. Si vous ne les avez pas déjà, je vous invite à regarder &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;les moults tutoriels précédents&lt;/a&gt;, en particulier celui sur &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;la mise en place d’un cluster Proxmox VE 6&lt;/a&gt; (le plus récent).&lt;/p&gt;
&lt;p&gt;Vous allez aussi avoir besoin d’un serveur tiers (un bout de VM ou de container quelque part, en dehors de vos 2 (ou tout autres quantité de machines étant localisées dans 2 endroits distincts dont il existe un risque qu’ils puissent subitement &amp;ldquo;ne plus se voir&amp;rdquo;, d’un point de vue réseau, induisant le fameux split brain tant redouté).&lt;/p&gt;
&lt;p&gt;Fun fact, il y a &lt;a class="link" href="https://pve.proxmox.com/wiki/Raspberry_Pi_as_third_node" target="_blank" rel="noopener"
&gt;une page de wiki pour faire la même chose à la main avec un RPi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce serveur tiers n’a pas besoin de faire fonctionner Proxmox (c’est même plutôt mieux d’ailleurs car PVE n’a aucune plus-value ici). Ça doit juste être une distrib linux capable d’installer un démon corosync qnetd. Ce serveur, nous l’appellerons &amp;ldquo;quorum&amp;rdquo;, par abus de langage grossier ;-).&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Sur le serveur quorum, installer corosync qnetd. Sur une Debian like, vous avez de la chance, il existe un package présent dans les dépôts par défaut, et il faut simplement faire un :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qnetd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, sur tous les serveurs Proxmox VE de notre cluster, on va installer le package corosync-qdevice, qui va leur permettre d’interroger le quorum.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur le serveur quorum de nouveau, ajouter la clé SSH d’un des serveurs PVE (un seul suffit). Une fois que c’est fait, connecter le cluster au quorum.&lt;/p&gt;
&lt;p&gt;Cela va sans dire, mais faire la commande depuis le serveur dont on vient d’ajouter la clé, pas l’autre hein ;-p. Et remplacez &lt;QDEVICE-IP&gt; par l’IP du serveur quorum !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm qdevice setup &amp;lt;QDEVICE-IP&amp;gt;
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &amp;#34;/root/.ssh/id_rsa.pub&amp;#34;
The authenticity of host &amp;#39;x.x.x.x&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:LPaaaaaaaaaaaaaaaaaPZjaIg.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je met volontairement une grosse partie de la trace car comme ça on peut parler de ce que fait la commande &lt;em&gt;pvecm qdevice setup x.x.x.x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, cette commande semble assez similaire à celle pour créer manuellement le cluster. A savoir, elle commence déjà par copier les clés SSH sur le serveur distant, histoire que tout le monde puisse discuter ensemble en SSH.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: initializing qnetd server
Certificate database (/etc/corosync/qnetd/nssdb) already exists. Delete it to initialize new db
INFO: copying CA cert and initializing on all nodes
node &amp;#39;pve01&amp;#39;: Creating /etc/corosync/qdevice/net/nssdb
password file contains no data
node &amp;#39;pve01&amp;#39;: Creating new key and cert db
node &amp;#39;pve01&amp;#39;: Creating new noise file /etc/corosync/qdevice/net/nssdb/noise.txt
node &amp;#39;pve01&amp;#39;: Importing CA
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on initialise, sur tous les nodes du cluster, le qdevice, qui va permet au node de communiquer avec le quorum. Là j’élude un peu car ça parle beaucoup de certificats et de clés qui sont échangées.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: copy and import pk12 cert to all nodes&amp;lt;br&amp;gt;INFO: add QDevice to cluster configuration
INFO: start and enable corosync qdevice daemon on node &amp;#39;pve01&amp;#39;...
Synchronizing state of corosync-qdevice.service with SysV service script with /lib/systemd/systemd-sysv-install.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, si tout se passe bien, vous devriez en arriver là, une fois que tout le monde s’est bien échangé ses certificats, clés et autres joyeusetés crytographiques.&lt;/p&gt;
&lt;p&gt;Une petite commande pour vérifier l’état du bazar :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Mon Aug 26 14:49:14 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271796
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 3
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000001 1 A,V,NMW 10.0.0.1
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ça, c’est le genre de choses que j’attends d’un logiciel de clustering digne de ce nom. D’une simple commande, on peut avoir&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le nombre de nodes&lt;/li&gt;
&lt;li&gt;l’ID du node courant&lt;/li&gt;
&lt;li&gt;le nombre de votes actuels, attendus, et minimum pour que le cluster soit &amp;ldquo;QUORATE&amp;rdquo;&lt;/li&gt;
&lt;li&gt;et enfin l’état de tout le cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, avec 2 nodes + le quorum, on a bien 3 votes. Tant qu’on a 2 votes, on a le quorum, CQFD.&lt;/p&gt;
&lt;p&gt;Dans ce cas de figure, si on perd un nœud OU le quorum, on a toujours 2 votes et le cluster doit continuer à fonctionner &amp;ldquo;normalement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Et c’est ce qu’on va vérifier !&lt;/p&gt;
&lt;h2 id="on-casse-un-nœud-pour-voir"&gt;On casse un nœud, pour voir
&lt;/h2&gt;&lt;p&gt;Normalement, si on a pas le serveur quorum, tout devrait être brisé (comme dirait Medieval Ops).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_medieval.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En gros les VMs doivent continuer à tourner, mais toute opération (démarrage de VM, modification quelconque) doit être bloquée (pour éviter de démarrer la même VM à 2 endroits et pleurer pour recoller les morceaux).&lt;/p&gt;
&lt;p&gt;Or ici dès que l’hôte n’est plus joignable, le nœud survivant le détecte, et comme le quorum ne voit plus lui non plus qu’un seul nœud, indique au dernier qu’il peut continuer sa vie comme si de rien n’était (c’est glauque&amp;hellip;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Thu Aug 29 11:10:31 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271820
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 2
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le nombre de vote passe bien à 2 (mais comme on est toujours égal à quorum c’est bon) et le node 1 a bien disparu :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/pve_down_quorate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et la petite déception, pas de visualisation en console du vote du quorum, malgré la mention &amp;ldquo;Quorate&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Mais bon, c’est quand même cool que ça marche, et en vrai c’est bien l’essentiel ;)&lt;/p&gt;
&lt;h2 id="bonus--erreur-insserv-fatal-service-corosync-has-to-be-enabled"&gt;Bonus : Erreur insserv: FATAL: service corosync has to be enabled
&lt;/h2&gt;&lt;p&gt;Si vous rencontrez l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;insserv: FATAL: service corosync has to be enabled to use service corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Allez supprimer le fichier d’init SysV corosync sur tous les hôtes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm /etc/init.d/corosync-qdevice
systemctl enable corosync-qdevice
systemctl start corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/" target="_blank" rel="noopener"
&gt;https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>