<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VPN on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/vpn/</link><description>Recent content in VPN on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 23 May 2023 18:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/vpn/index.xml" rel="self" type="application/rss+xml"/><item><title>Un cluster Kubernetes gratuit pour vos labs persos ! - part 2</title><link>https://blog.zwindler.fr/2023/05/23/cluster-kubernetes-gratuit-part2/</link><pubDate>Tue, 23 May 2023 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2023/05/23/cluster-kubernetes-gratuit-part2/</guid><description>&lt;img src="https://blog.zwindler.fr/2023/04/kubernetes_banknote.webp" alt="Featured image of post Un cluster Kubernetes gratuit pour vos labs persos ! - part 2" /&gt;&lt;p&gt;Cet article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles sur l&amp;rsquo;installation d&amp;rsquo;un cluster Kubernetes sur le free tier d&amp;rsquo;Oracle Cloud Infrastructure :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/04/24/cluster-kubernetes-gratuit-part1/" &gt;Un cluster Kubernetes gratuit pour vos labs persos ! - part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/05/23/cluster-kubernetes-gratuit-part2/" &gt;Un cluster Kubernetes gratuit pour vos labs persos ! - part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;avantage principal de ce tuto est qu&amp;rsquo;il est gratuit. L&amp;rsquo;inconvénient est que l&amp;rsquo;installation est relativement longue&amp;hellip;&lt;/p&gt;
&lt;h2 id="résumé-des-épisodes-précédents"&gt;&amp;ldquo;Résumé des épisodes précédents&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Dans l&amp;rsquo;article précédent (que vous pouvez &lt;a class="link" href="https://blog.zwindler.fr/2023/04/24/cluster-kubernetes-gratuit-part1/" &gt;retrouver ici&lt;/a&gt;), on avait pris en main Oracle Cloud et installé &lt;code&gt;k3s&lt;/code&gt; sur deux machines ARM du free tier.&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;issue de l&amp;rsquo;article, on avait donc, pour rappel, un cluster Kubernetes fonctionnel avec un master et un worker, mais pas encore accessible ni vraiment utilisable sur Internet.&lt;/p&gt;
&lt;p&gt;Dans cette partie, on va donc finaliser tous les petits bouts qui manquent pour avoir quelque chose de vraiment propre.&lt;/p&gt;
&lt;h2 id="creuse-ton-tunnel"&gt;Creuse ton tunnel
&lt;/h2&gt;&lt;p&gt;Comme je le dis juste avant, on a un cluster fonctionnel. Si je me connecte sur la machine &lt;strong&gt;controlplane&lt;/strong&gt; et que je lance la CLI &lt;code&gt;kubectl&lt;/code&gt;, je pourrais interagir avec mon cluster Kubernetes.&lt;/p&gt;
&lt;p&gt;Cependant, il est très probable que vous vouliez accéder à votre cluster flambant neuf sans avoir à vous connecter préalablement en SSH sur votre machine (enfin moi, c&amp;rsquo;est mon cas).&lt;/p&gt;
&lt;p&gt;Et je n&amp;rsquo;ai pas envie non plus de publier l&amp;rsquo;API server (port 6443) de mon control plane sur Internet (en soi pour du POC, c&amp;rsquo;est faisable, mais ça ne me dit rien, perso).&lt;/p&gt;
&lt;p&gt;Je vais donc monter un VPN &lt;code&gt;wireguard&lt;/code&gt; entre ma machine et mon control plane. Dans un setup plus &amp;ldquo;pro&amp;rdquo;, on montera un bastion dans notre LAN privé du cloud provider pour ça. Ici, pour les besoins de l&amp;rsquo;article, je me contente de monter le peer directement entre le node &lt;strong&gt;controlplane&lt;/strong&gt; et mon PC.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;installe d&amp;rsquo;abord wireguard sur les deux machines, et je génère un couple clé publique/privée :&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;$ sudo apt install wireguard
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/wireguard/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;umask&lt;/span&gt; 077&lt;span class="p"&gt;;&lt;/span&gt; wg genkey &lt;span class="p"&gt;|&lt;/span&gt; tee private.key &lt;span class="p"&gt;|&lt;/span&gt; wg pubkey &amp;gt; public.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Récupérez le contenu de la clé publique de chaque machine, ainsi que leur IP publique.&lt;/p&gt;
&lt;p&gt;Note : pour trouver rapidement l&amp;rsquo;IP publique de chez vous, vous pouvez utiliser des services comme &lt;code&gt;dig +short myip.opendns.com @resolver1.opendns.com&lt;/code&gt;, &lt;code&gt;curl http://4.ifcfg.me&lt;/code&gt; ou équivalent&lt;/p&gt;
&lt;p&gt;Ensuite, je vais créer un fichier de configuration &lt;code&gt;/etc/wireguard/oci0.conf&lt;/code&gt; sur mon pc. Dans mon cas, l&amp;rsquo;interface réseau s&amp;rsquo;appelle &lt;strong&gt;enp8s0&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;$ sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;PEER_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IP.PUBLIQUE.DU.CONTROLPLANE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;PEER_PUBLIC_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CLE.PUBLIQUE.DE.VOTRE.CONTROLPLANE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &amp;gt; /etc/wireguard/oci0.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Interface]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Address = 10.10.10.1/24
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ListenPort = 55555
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PrivateKey = `cat /etc/wireguard/private.key`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Peer]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PublicKey = ${PEER_PUBLIC_KEY}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;AllowedIPs = 10.10.10.2/32,10.0.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Endpoint = ${PEER_IP}:55555
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wg-quick up oci0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et on fait pareil sur le node &lt;strong&gt;controlplane&lt;/strong&gt; (son interface réseau s&amp;rsquo;appelle &lt;code&gt;enp0s6&lt;/code&gt; dans mon cas).&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;$ sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;PEER_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IP.PUBLIQUE.DU.PC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;PEER_PUBLIC_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CLE.PUBLIQUE.DE.VOTRE.PC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &amp;gt; /etc/wireguard/oci0.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Interface]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Address = 10.10.10.2/24
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ListenPort = 55555
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PrivateKey = `cat /etc/wireguard/private.key`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Peer]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PublicKey = ${PEER_PUBLIC_KEY}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;AllowedIPs = 10.10.10.1/32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Endpoint = ${PEER_IP}:55555
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wg-quick up oci0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Comme les machines OCI disposent toutes d&amp;rsquo;un pare-feu &lt;code&gt;iptables&lt;/code&gt; et aussi d&amp;rsquo;un pare-feu au niveau du réseau virtuel, on doit ouvrir les ports côté &lt;strong&gt;controlplane&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="c1"&gt;# allow wireguard access from your own public IP address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ iptables -I INPUT -s IP.PUBLIQUE.DU.PC -p udp --dport &lt;span class="m"&gt;55555&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# save rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo netfilter-persistent save
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Et&lt;/strong&gt; côté console Oracle Cloud (Security list dans l&amp;rsquo;administration du VCN, &lt;a class="link" href="https://blog.zwindler.fr/2023/04/24/cluster-kubernetes-gratuit-part1/#ouverture-des-ports-internes" &gt;je vous renvoie au précédent post où je détaille comment faire&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/VCN_udp_55555.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A partir de maintenant, votre PC à l&amp;rsquo;IP 10.10.10.1 et votre control plane l&amp;rsquo;IP 10.10.10.2. Les deux doivent pouvoir se pinger :&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;$ ping 10.10.10.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ping 10.10.10.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On devrait aussi pouvoir ping l&amp;rsquo;IP privée (interne) de notre &lt;strong&gt;controlplane&lt;/strong&gt; depuis notre pc&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;$ ping 10.0.0.xxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si wireguard vous intéresse, il existe énormément de documentation sur Internet à ce sujet, à commencer par le &lt;a class="link" href="https://www.wireguard.com/quickstart/" target="_blank" rel="noopener"
&gt;site officiel&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="accéder-au-cluster-depuis-votre-poste"&gt;Accéder au cluster depuis votre poste
&lt;/h2&gt;&lt;p&gt;On a maintenant un tunnel pour discuter de notre PC vers notre control plane Kubernetes, mais toujours pas la possibilité de discuter avec Kubernetes. Il reste encore une règle &lt;code&gt;iptables&lt;/code&gt; à ajouter 😭.&lt;/p&gt;
&lt;p&gt;Pour s&amp;rsquo;en convaincre, on tente de voir si le port répond depuis notre PC :&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;$ nc -zv 10.10.10.2 &lt;span class="m"&gt;6443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc: connect to 10.10.10.2 port &lt;span class="m"&gt;6443&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;tcp&lt;span class="o"&gt;)&lt;/span&gt; failed: No route to host
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nc -zv 10.0.0.xxx &lt;span class="m"&gt;6443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc: connect to 10.0.0.xxx port &lt;span class="m"&gt;6443&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;tcp&lt;span class="o"&gt;)&lt;/span&gt; failed: No route to host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Côté &lt;strong&gt;controlplane&lt;/strong&gt;, on va donc autoriser le traffic provenant de wireguard (interface &lt;code&gt;oci0&lt;/code&gt;) à se connecter à l&amp;rsquo;API server&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="c1"&gt;# allow access to apiserver from wireguard interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo iptables -I INPUT -i oci0 -p tcp --dport &lt;span class="m"&gt;6443&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# save rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo netfilter-persistent save
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et maintenant, depuis notre PC :&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;$ nc -zv 10.10.10.2 &lt;span class="m"&gt;6443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection to 10.10.10.2 &lt;span class="m"&gt;6443&lt;/span&gt; port &lt;span class="o"&gt;[&lt;/span&gt;tcp/*&lt;span class="o"&gt;]&lt;/span&gt; succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nc -zv 10.0.0.xxx &lt;span class="m"&gt;6443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection to 10.0.0.34 &lt;span class="m"&gt;6443&lt;/span&gt; port &lt;span class="o"&gt;[&lt;/span&gt;tcp/*&lt;span class="o"&gt;]&lt;/span&gt; succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Récupérez le contenu du fichier &lt;code&gt;/etc/rancher/k3s/k3s.yaml&lt;/code&gt; sur le serveur &lt;strong&gt;controlplane&lt;/strong&gt;.
Créez un fichier &lt;code&gt;k3s.yaml&lt;/code&gt; sur votre machine et remplacez la valeur &lt;code&gt;server: https://127.0.0.1:6443&lt;/code&gt; par &lt;code&gt;server: https://10.10.10.2:6443&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous devriez maintenant avoir accès à votre cluster depuis votre PC !&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;k3s.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods --all-namespaces
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAMESPACE NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system helm-install-traefik-crd-xdg7s 0/1 Completed &lt;span class="m"&gt;0&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system helm-install-traefik-ncqzm 0/1 Completed &lt;span class="m"&gt;1&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system svclb-traefik-084208f2-dcsqr 2/2 Running &lt;span class="m"&gt;0&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system local-path-provisioner-5d56847996-x76zx 1/1 Running &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;29d ago&lt;span class="o"&gt;)&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system svclb-traefik-084208f2-zw6bv 2/2 Running &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;29d ago&lt;span class="o"&gt;)&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system coredns-7c444649cb-gg22s 1/1 Running &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;29d ago&lt;span class="o"&gt;)&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system metrics-server-7b67f64457-r5c5n 1/1 Running &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;29d ago&lt;span class="o"&gt;)&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-system traefik-56b8c5fb5c-px5pc 1/1 Running &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;29d ago&lt;span class="o"&gt;)&lt;/span&gt; 29d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ouverture-des-ports-pour-traefik"&gt;Ouverture des ports pour Traefik
&lt;/h2&gt;&lt;p&gt;On peut maintenant interagir avec Kubernetes, mais on ne peut toujours pas en faire grand-chose. Je suis certain que vous allez déployer des applications web sur votre cluster et c&amp;rsquo;est quand même plus cool d&amp;rsquo;y accéder &lt;em&gt;depuis&lt;/em&gt; Internet :-p.&lt;/p&gt;
&lt;p&gt;Par défaut, &lt;code&gt;k3s&lt;/code&gt; installe l&amp;rsquo;IngressController &lt;code&gt;traefik&lt;/code&gt;. Vous l&amp;rsquo;avez deviné&amp;hellip; on va devoir ouvrir des flux !&lt;/p&gt;
&lt;p&gt;Si vous regardez sur quels IPs/ports traefik est disponible sur votre cluster, vous remarquerez que Traefik utilise un service de type &lt;strong&gt;LoadBalancer&lt;/strong&gt;, directement accessible sur l&amp;rsquo;IP privée de vos machines (10.0.0.x et 10.0.0.y dans cet exemple)&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;kubectl -n kube-system get svc traefik
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME TYPE CLUSTER-IP EXTERNAL-IP PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt; AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;traefik LoadBalancer 10.43.44.139 10.0.0.xxx,10.0.0.yyy 80:30614/TCP,443:30839/TCP 42m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans OCI, ça sera pratique, on va pouvoir attaquer directement le port 80/443 de nos serveurs et avoir l&amp;rsquo;IngressController au bout du fil.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ curl http://10.0.0.xxx
404 page not found
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ne vous laissez pas tromper par l&amp;rsquo;erreur 404. Le fait qu&amp;rsquo;on nous réponde une erreur 404 prouve que traefik répond bien !&lt;/p&gt;
&lt;p&gt;Sur les DEUX machines (control plane ET worker), on va autoriser l&amp;rsquo;accès au port 80 depuis partout :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# allow access to HTTP 80 from everywhere
$ sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# save rules
$ sudo netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais on va probablement vouloir exposer ça sur Internet et les IP privées sont&amp;hellip; privées. On va donc créer un load balancer en frontal, ça nous permettra de diriger le trafic sur tous les noeuds du cluster, pas juste un seul (ça ferait un SPOF en plus).&lt;/p&gt;
&lt;h2 id="créer-un-loadbalancer"&gt;Créer un Loadbalancer
&lt;/h2&gt;&lt;p&gt;Dans l&amp;rsquo;onglet Networking, on va sélectionner Loadbalancer (&lt;a class="link" href="https://cloud.oracle.com/load-balancer/load-balancers?region=eu-paris-1" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci_lb.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Suivez le wizard, choisissez un Load balancer (L7)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci_lb2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Puis donnez-lui un petit nom (kube-traefik-lb par exemple), laissez Public (choix par défaut), sélectionnez votre VCN et votre subnet.&lt;/p&gt;
&lt;p&gt;Au moment de choisir les &amp;ldquo;backends&amp;rdquo;, cliquez sur &amp;ldquo;Add backends&amp;rdquo; et ajoutez vos 2 machines (c&amp;rsquo;est Kubernetes et flannel qui se chargent de rediriger les requêtes au bon endroit)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci_add_backends.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Laissez le port 80 par défaut, puisqu&amp;rsquo;on vient de vérifier que ces ports répondent bien à &lt;code&gt;curl http://10.0.0.xxx&lt;/code&gt; (pas besoin d&amp;rsquo;utiliser le NodePort, pour ceux qui savent de quoi je parle). Laissez aussi les paramètres par défaut pour la &amp;ldquo;health check policy&amp;rdquo;, SAUF pour le code retour attendu (puisque notre traefik renvoie 404 si aucun Ingress ne matche l&amp;rsquo;&amp;ldquo;host&amp;rdquo; envoyé par la requête).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci_healthcheck.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans la page d&amp;rsquo;après dans &amp;ldquo;configure Listener&amp;rdquo;, si vous avez un certificat TLS valide, vous pouvez l&amp;rsquo;intégrer au loadbalancer avec l&amp;rsquo;option &amp;ldquo;Load balancer managed certificate&amp;rdquo; dans le cadre &amp;ldquo;SSL certificate&amp;rdquo;. Vous pouvez aussi &lt;a class="link" href="https://cloud.oracle.com/security/certificates/certificate?region=eu-paris-1" target="_blank" rel="noopener"
&gt;gérer les certificats depuis Oracle Cloud Infrastructure&lt;/a&gt;. Je n&amp;rsquo;ai pas exploré cette option mais c&amp;rsquo;est très standard chez les cloud providers.&lt;/p&gt;
&lt;p&gt;Sinon, cliquez sur &amp;ldquo;HTTP&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Une fois le LoadBalancer créé, il devrait devenir &amp;ldquo;vert&amp;rdquo; et vous pourrez récupérer son adresse IP publique pour y accéder.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci-lb-green.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Vous êtes arrivés jusque-là. Bravo !&lt;/p&gt;
&lt;p&gt;Vous pouvez déployer des applications web avec des Ingress et faire pointer vos enregistrements DNS sur l&amp;rsquo;IP du LoadBalancer. Les requêtes HTTP seront correctement routées sur un des deux serveurs Kubernetes, puis vers Traefik, puis vers votre appli.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai fait le test avec une image Docker personnelle (utilisée pour mon dernier talk) et ça a marché :-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/05/oci_result.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On a fait plus d&amp;rsquo;iptables que de Kubernetes mais bon c&amp;rsquo;est pas très grave 😅. Ca aura été une excuse pour tester le free tier d&amp;rsquo;Oracle et de tester un peu le fonctionnement de ce cloud provider assez peu connu en France (je trouve).&lt;/p&gt;
&lt;h2 id="autres-blogs-posts-utiles"&gt;Autres blogs posts utiles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/oracledevs/k3s-on-oci-a-kubernetes-cluster-in-under-5-mins-d7c194c19d59" target="_blank" rel="noopener"
&gt;medium.com/oracledevs - k3s-on-oci-a-kubernetes-cluster-in-under-5-mins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.to/armiedema/opening-up-port-80-and-443-for-oracle-cloud-servers-j35" target="_blank" rel="noopener"
&gt;dev.to/armiedema - opening-up-port-80-and-443-for-oracle-cloud-servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.malekal.com/utiliser-wg-quick-wireguard/" target="_blank" rel="noopener"
&gt;malekal.com - utiliser-wg-quick-wireguard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Créer un VPN distribué avec Tinc</title><link>https://blog.zwindler.fr/2020/02/17/creer-un-vpn-distribue-avec-tinc/</link><pubDate>Mon, 17 Feb 2020 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/02/17/creer-un-vpn-distribue-avec-tinc/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/03/airwolf03.webp" alt="Featured image of post Créer un VPN distribué avec Tinc" /&gt;&lt;h2 id="faire-un-vpn-tinc-fullmesh-sans-monter-un-gros-réseau-ipsec"&gt;Faire un VPN Tinc fullmesh sans monter un gros réseau IPSec
&lt;/h2&gt;&lt;p&gt;Un des gros problèmes que j’ai rapidement eu à régler lorsque j’ai voulu monter des clusters de serveurs Proxmox VE chez des providers de serveurs physiques, c’est la façon dont est gérée le clustering dans PVE.&lt;/p&gt;
&lt;p&gt;Les concepteurs de PVE ne veulent pas que l’on monte des clusters sur Internet et mettent volontairement le plus de bâtons dans les roues pour vous empêcher de le faire. J’exagère à peine.&lt;/p&gt;
&lt;p&gt;En version 5.x, PVE se basait sur la version 2 de corosync par multicast (bloqué par tous les providers) et qu’en v6.x, on nous bride en demandant explicitement un sous réseau LAN dédié, autant dire qu’on est pas aidé.&lt;/p&gt;
&lt;h2 id="openvpn-vs-tinc"&gt;OpenVPN vs Tinc
&lt;/h2&gt;&lt;p&gt;Une solution que j’ai expérimenté est de monter un serveur OpenVPN sur un des serveurs et de connecter les autres dessus. J’ai d’ailleurs &lt;a class="link" href="https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/" &gt;fait un tuto là dessus pour PVE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette approche n’est pas optimale : si on a 2 machines, c’est bon, mais si on en a 3 ou plus, on se retrouve soit avec un SPOF, soit à devoir monter un maillage complexe de couples serveur-client. Au delà de 3, c’est pratiquement ingérable.&lt;/p&gt;
&lt;p&gt;Au contraire, &lt;a class="link" href="https://www.tinc-vpn.org/" target="_blank" rel="noopener"
&gt;Tinc&lt;/a&gt; est un logiciel libre (GPLv2) permettant de monter des VPNs multipoints (full mesh routing) entre des machines sur Internet. Tinc est &lt;em&gt;prévu&lt;/em&gt; pour notre cas d’usage !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/02/tinclogo.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;le vrai logo de Tinc (la photo en haut du blog c’est Supercopter, of course)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="on-sécurise"&gt;On sécurise
&lt;/h2&gt;&lt;p&gt;Comme tout service &amp;ldquo;ouvert&amp;rdquo; sur Internet, il est évidemment nécessaire de faire du firewalling pour bloquer le trafic malveillant. Pour information, Tinc utilise le port 655 en TCP et UDP, que vous devrez donc ouvrir dans les deux sens entre l’ensemble de vos serveurs, mais bloquer pour le reste d’Internet.&lt;/p&gt;
&lt;p&gt;A noter, ce n’est pas confirmé mais &lt;a class="link" href="https://tinc-vpn.org/" target="_blank" rel="noopener"
&gt;la page principale de Tinc&lt;/a&gt; indique qu’il est possible que ce logiciel (tout comme OpenVPN, Wireguard et IPSec) soit vulnérable à la &lt;a class="link" href="https://seclists.org/oss-sec/2019/q4/122" target="_blank" rel="noopener"
&gt;CVE-2019-14899&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="on-linstalle-et-on-le-configure"&gt;On l’installe et on le configure
&lt;/h2&gt;&lt;p&gt;On va devoir installer le package/binaire sur toutes les machines du VPN. Pas trop de soucis de ce côté, tinc est &lt;a class="link" href="https://www.tinc-vpn.org/download/" target="_blank" rel="noopener"
&gt;multiplateforme (Windows aussi) et est packagé dans de nombreuses distrib Linux&lt;/a&gt;. Sur les dépôts Debian, tinc est présent sans souci et j’imagine que ça sera le cas pour d’autres distribs aussi.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install tinc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois installé, on peut créer notre VPN. Pour déclarer un VPN, il faut ajouter le nom de celui ci dans un fichier de configuration global :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;vpnzwindler&amp;#34; &amp;gt;&amp;gt; /etc/tinc/nets.boot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On créé ensuite un répertoire du même nom, contenant lui même un dossier &lt;em&gt;hosts&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /etc/tinc/vpnzwindler/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ces dossiers, on va créer fichier de configuration, /etc/tinc/vpnzwindler/tinc.conf. Ce fichier va nous permettre de décrire le node courant et qui doit se connecter à qui.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Name = node01
AddressFamily = ipv4
Address = 1.1.1.1
Device = /dev/net/tun
Mode = switch
ConnectTo = node02
ConnectTo = node03
ConnectTo = node04
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans les informations importantes, &lt;strong&gt;Name&lt;/strong&gt; va être le nom (arbitraire) du node pour tout le VPN, &lt;strong&gt;Address&lt;/strong&gt; représente l’adresse IP publique de votre node, et &lt;strong&gt;ConnectTo&lt;/strong&gt;, la liste des autres &lt;strong&gt;Names&lt;/strong&gt; des autres nodes.&lt;/p&gt;
&lt;p&gt;A partir de là, on peut demander à tinc de nous générer des couples clé publique/clé privée pour tous nos serveurs. Sur tous les nodes du VPN, lancer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo -e &amp;#39;\n\n&amp;#39; | tincd -n vpnzwindler -K4096
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si tout se passe bien et que tous les fichiers de conf et dossiers ont été créés correctement, &lt;em&gt;tinc&lt;/em&gt; devrait créer un couple clé privée/clé publique, puis créer un fichier /etc/tinc/vpnzwindler/hosts/node01 (sur celui dont le Name est node01).&lt;/p&gt;
&lt;p&gt;Envoyez (par scp par exemple) l’ensemble des fichiers dans le dossier hosts sur tous les serveurs. Maintenant, tous les VPNs sauront quelle IP publique contacter et avec quel clé authentifier le trafic.&lt;/p&gt;
&lt;h2 id="autre-méthode--tinc-invite--tinc-join"&gt;Autre méthode : tinc invite / tinc join
&lt;/h2&gt;&lt;p&gt;Une feature sympa de &lt;em&gt;tinc&lt;/em&gt;, mais seulement en 1.1 (la dernière version), est la possibilité d’ajouter des nodes à un VPN existants via une simple commande tinc invite (&lt;a class="link" href="https://www.tinc-vpn.org/documentation-1.1/How-invitations-work.html#How-invitations-work" target="_blank" rel="noopener"
&gt;voir la doc&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Je ne l’ai pas testée mais a priori tinc créé une URL qui permet d’inviter n’importe qui et de configurer son node avec un tinc join.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The whole URL is around 80 characters long and looks like this: server.example.org:12345/cW1NhLHS-1WPFlcFio8ztYHvewTTKYZp8BjEKg3vbMtDz7w4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuration-du-réseau-de-los"&gt;Configuration du réseau de l’OS
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a tous les prérequis, on peut configurer l’aspect réseau de notre VPN. Ça dépend de votre distribution bien sûr (où dans le cas de PVE, si vous utilisez OpenVSwitch ou pas par exemple). Dans le cas d’une Debian récente, on va gérer tout ça avec ip.&lt;/p&gt;
&lt;p&gt;Pour gérer cette partie, Tinc va vous demander de créer 2 scripts. Un tinc-up.sh et un tinc-down.sh, respectivement pour le démarrage et l’extinction de l’interface VPN.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/tinc/vpnzwindler/tinc-up
#!/bin/bash
/sbin/ip link set vpnzwindler up
/sbin/ip addr add 10.0.0.1/24 dev vpnzwindler
/sbin/ip route add 10.0.0.0/24 dev vpnzwindler
cat /etc/tinc/vpnzwindler/tinc-down
#!/bin/bash
/sbin/ip link set vpnzwindler down
chmod +x tinc-*
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rien de bien compliqué ici, on demande au binaire ip de créer une interface vpnzwindler. Puis on lui affecte l’IP virtuelle 10.0.0.1 (notre node01). Enfin d’ajouter une route pour que tout le trafic du VPN passe par cette interface.&lt;/p&gt;
&lt;h2 id="on-le-démarre"&gt;On le démarre
&lt;/h2&gt;&lt;p&gt;Dernière étape, on va demander à systemd de nous démarrer le vpn qu’on vient de créer dès le démarrage de la machine.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl daemon-reload
systemctl enable tinc@vpnzwindler
systemctl start tinc@vpnzwindler
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et voilà !!! Vous avez maintenant un VPN multipoint simple et efficace !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@node01 ~ # ping node02
PING node02 (10.0.0.2) 56(84) bytes of data.
64 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=17.1 ms
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Changement de provider, mon hyperviseur sur un dédié Hetzner</title><link>https://blog.zwindler.fr/2019/11/19/changement-de-provider-mon-hyperviseur-sur-un-dedie-hetzner/</link><pubDate>Tue, 19 Nov 2019 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2019/11/19/changement-de-provider-mon-hyperviseur-sur-un-dedie-hetzner/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/11/Hetzner_DCP_Luftbild.webp" alt="Featured image of post Changement de provider, mon hyperviseur sur un dédié Hetzner" /&gt;&lt;h2 id="au-revoir-oneprovider-bonjour-hetzner"&gt;Au revoir OneProvider, bonjour Hetzner
&lt;/h2&gt;&lt;p&gt;Certains d’entre vous m’ont peut être vu me plaindre de OneProvider et plus particulièrement le support avec qui j’ai eu plusieurs accrochages (Spoiler, j’ai migré vers Hetzner).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_op.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sans rentrer dans les détails (j’ai échangé avec certains d’entre vous sur le sujet), après cette déconvenue, j’ai donc cherché une alternative pour héberger mes machines.&lt;/p&gt;
&lt;p&gt;Les prérequis étaient d’avoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une machine physique&lt;/li&gt;
&lt;li&gt;avec suffisamment de RAM (minimum 8 Go, 16 c’est mieux)&lt;/li&gt;
&lt;li&gt;idéalement, une gestion des réseaux virtuels entre machines du provider (type RPN ou vRack)&lt;/li&gt;
&lt;li&gt;si possible pas un ATOM en CPU (le souci de l’ATOM, c’est que c’est tellement faiblard que ça pénalise les IO)&lt;/li&gt;
&lt;li&gt;si possible du VT-x (je n’en ai pas besoin d’en l’absolu, je vais surtout du LXC, mais ça peut dépanner)&lt;/li&gt;
&lt;li&gt;si possible du SSD parce que c’est quand même cool&lt;/li&gt;
&lt;li&gt;si possible 2 disques pour avoir du RAID ou que je puisse me faire un équivalent (ZFS/ZRAID)&lt;/li&gt;
&lt;li&gt;un prix pas trop élevé (genre pas OVH) car j’ai été mal habitué avec les prix agressifs de OneProvider (oui je sais, je l’ai payé avec le support)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="létat-du-marché"&gt;L’état du marché
&lt;/h2&gt;&lt;p&gt;Chez OneProvider, j’avais tout ça pour environ 20-25 euros / mois, à l’exception du réseaux privé virtuel entre machine.&lt;/p&gt;
&lt;p&gt;Autant dire qu’on est très loin du premier prix de chez OVH (&amp;gt;60€/mois TTC). Si on descend en gamme chez OVH, on perd le réseau privé virtuel entre machines (vRack) en passant chez SoYouStart et pourtant on est toujours à plus de 42€ / mois TTC. Toujours 2 fois plus cher que OneProvider :-/.&lt;/p&gt;
&lt;p&gt;Il faut descendre encore de gamme et passer chez Kimsufi pour trouver des prix comparables dans mes critères (et toujours pas de réseau privé virtuel), avec de vieux CPU et surtout un réseau bridé au 100 Mbps (ce qui est pénible pour les transferts de gros fichiers, les réplications de VMs et les sauvegardes).&lt;/p&gt;
&lt;p&gt;J’avais aussi jeté un œil côté Online.net, qui eux proposent sur certaines machines identiques à celles que j’avais avec EN PLUS le graal, un réseau privé virtuel entre dédiés (RPN).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/online.net_.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ces deux configs me disaient vraiment quelque chose&amp;hellip; et pour cause ! OneProvider les revends en marque blanche.&lt;/p&gt;
&lt;p&gt;Donc c’est exactement les mêmes machines que celle que j’ai pu avoir dans le passé, mais avec le RPN en plus, et un peu plus cher (beaucoup plus cher même).&lt;/p&gt;
&lt;p&gt;Ce qui est dommage ici, c’est que le RPN ne soit pas disponible sur les machines un peu plus petites (mon PRA n’est pas aussi gros, juste de quoi faire tourner le blog en cas de gros crash).&lt;/p&gt;
&lt;h2 id="vient-alors-hetzner"&gt;Vient alors Hetzner
&lt;/h2&gt;&lt;p&gt;Ça fait pas mal de fois que je voyais circuler le nom. Des bloggeurs et d’autres confrères en disaient beaucoup de bien, et j’ai voulu aller voir. La première chose intéressante est que Hetzner, comme OVH et Online, &lt;a class="link" href="https://wiki.hetzner.de/index.php/Vswitch/en" target="_blank" rel="noopener"
&gt;propose bien un service de type réseau privé virtuel entre vos serveurs&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_vswitch.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="plus-de-puissance-chez-hetzner-"&gt;Plus de puissance chez Hetzner !
&lt;/h2&gt;&lt;p&gt;Par contre, quand j’ai vu les machines&amp;hellip; au début je me suis dis que ça allait pas le faire&amp;hellip;&lt;/p&gt;
&lt;p&gt;Voilà leur machine &amp;ldquo;bas de gamme&amp;rdquo; :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour à peine plus que le moins cher des SoYouStart (un vieux Xeon E3 v2 4c/4t avec 16Go de RAM et 2 HDD), vous avez un tout nouveau Ryzen 5 6c/12t, 64 Go de RAM et un RAID de 2 SSD NVMe de 512 Go.&lt;/p&gt;
&lt;p&gt;Bon clairement on était hors budget mais ils avaient piqué ma curiosité avec leurs config fofolles.&lt;/p&gt;
&lt;p&gt;Et je suis donc tombé en fouillant un peu sur leur &amp;ldquo;server auction&amp;rdquo;, qui est ni plus ni moins que les serveurs de leurs anciennes gammes qu’ils louent à nouveau. Et là c’était déjà plus proche de mon besoin.&lt;/p&gt;
&lt;p&gt;Pour un peu plus de 30€/mois soit 50% plus que mon serveur précédent, mais comparable au prix Online, j’ai un i7-4770, 32 Go de RAM et 2 disques &amp;ldquo;Entreprise&amp;rdquo;. Soit beaucoup mieux que la machine chez Online.&lt;/p&gt;
&lt;p&gt;Quitte à changer, j’ai donc tenté Hetzner et commandé un serveur.&lt;/p&gt;
&lt;h2 id="cest-puissant-mais-quest-ce-que-cest-moche"&gt;C’est puissant mais&amp;hellip; qu’est ce que c’est moche
&lt;/h2&gt;&lt;p&gt;Bon, l’UI n’est pas follement attrayante. C’est&amp;hellip; spartiate.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner0-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans le menu &amp;ldquo;Servers&amp;rdquo;, vous avez une bête liste de vos serveurs avec le numéro de commande, un hostname (une fois que vous l’aurez setté) et un ID (peu parlant). Bof pratique, surtout au début ou si vous en avez beaucoup.&lt;/p&gt;
&lt;p&gt;Et quand on sélectionne un serveur, ce n’est malheureusement guère mieux. Les informations importantes éclatées dans un nombre incalculable de menus.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_rescue.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Bref, côté expérience utilisateur, on repassera. Cependant, tout ce qu’il faut pour bien administrer son serveur est là. On finira par s’y retrouver avec un peu d’habitude&amp;hellip;&lt;/p&gt;
&lt;h2 id="installation-de-lhyperviseur"&gt;Installation de l’hyperviseur
&lt;/h2&gt;&lt;p&gt;Pour installer notre serveur, on peut utiliser l’interface web pour installer un Debian, ou passer par l’image de rescue.&lt;/p&gt;
&lt;p&gt;J’ai préféré utiliser la 2ème solution, car elle est immédiatement disponible à la livraison du serveur, avec votre clé SSH.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner1-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On arrive sur un login on ne peut plus classique, avec un résumé des caractéristiques de vos serveurs.&lt;/p&gt;
&lt;p&gt;Point intéressant, il existe un binaire &lt;em&gt;installimage&lt;/em&gt; sur l’OS rescue de Hetzner. Il permet, comme son nom l’indique, d’installer une image.&lt;/p&gt;
&lt;p&gt;Comme j’utilise Proxmox VE comme hyperviseur, j’ai donc installé une Debian 10 :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_installimage1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois l’image de base choisie, vous allez arriver à un éditeur de texte. Il va vous permettre de configurer de manière plus fine votre installation. Je trouve cette méthode assez originale. Ça change des interfaces webs pas toujours stables vous demandant la taille de vos partitions pour finalement planter dès que vous demandez un truc non standard.&lt;/p&gt;
&lt;p&gt;Ici tout a très bien marché, j’ai configuré le hostname, ainsi qu’un RAID soft et un partitionnement LVM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_installimage3-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Là encore, je suis navré qu’on tombe dans le cliché, mais si ce n’est pas &amp;ldquo;joli&amp;rdquo; ni &amp;ldquo;user friendly&amp;rdquo;, au moins c’est efficace.&lt;/p&gt;
&lt;h2 id="passer-de-debian-10-à-proxmox-ve-6"&gt;Passer de Debian 10 à Proxmox VE 6
&lt;/h2&gt;&lt;p&gt;Une fois validé, l’image Debian 10 a été copié extrêmement rapidement (une ou deux minutes). Forcément, c’est une &amp;ldquo;minimal&amp;rdquo;. Mais bon c’est quand même agréable d’avoir son serveur &amp;ldquo;up and running&amp;rdquo; en moins d’une demie heure entre la commande et la fin de l’installation.&lt;/p&gt;
&lt;p&gt;Reste donc à installer PVE 6 sur notre dédié Hetzner. Sans trop de surprise, j’ai réutilisé mon playbook Ansible qui configure de A à Z la Debian pour en faire un Proxmox. Pour ceux qui l’ont loupé, &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;c’est par ici que ça se passe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J’ai juste eu &lt;em&gt;un&lt;/em&gt; petit souci lors de l’installation. La debian étant minimale, je n’avais même pas python d’installé. C’est gênant quand on fait du Ansible !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat inventory_hetzner.yml
all:
children:
proxmoxve:
hosts:
&amp;lt;fqdn_hyperviser&amp;gt;:
ansible proxmoxve -i inventory_hetzner.yml -u root -m ping
&amp;lt;fqdn_hyperviser&amp;gt; | FAILED! =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;module_stderr&amp;#34;: &amp;#34;Shared connection to &amp;lt;fqdn_hyperviser&amp;gt; closed.\r\n&amp;#34;,
&amp;#34;module_stdout&amp;#34;: &amp;#34;/bin/sh: 1: /usr/bin/python: not found\r\n&amp;#34;,
&amp;#34;msg&amp;#34;: &amp;#34;MODULE FAILURE&amp;#34;,
&amp;#34;rc&amp;#34;: 127
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Heureusement j’avais déjà eu le souci dans un autre contexte. J’ai donc écris un playbook supplémentaire (dispo sur le Github) pour installer les prérequis manquants.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory_hetzner.yml -u root proxmox_python_firstinstall.yml
ansible-playbook -i inventory_hetzner.yml -u root proxmox_prerequisites.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et en quelques minutes, mon Proxmox VE était opérationnel sur Hetzner !&lt;/p&gt;</description></item><item><title>Cluster Proxmox VE, v6 cette fois ci !</title><link>https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/</link><pubDate>Tue, 20 Aug 2019 11:45:00 +0000</pubDate><guid>https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/08/cropped-proxmox_ansible.webp" alt="Featured image of post Cluster Proxmox VE, v6 cette fois ci !" /&gt;&lt;h2 id="proxmox-ve"&gt;Proxmox VE
&lt;/h2&gt;&lt;p&gt;Et oui, avec &lt;a class="link" href="https://blog.zwindler.fr/2019/07/16/sortie-de-proxmox-ve-6-0-les-nouveautes/" &gt;la sortie de Proxmox VE 6&lt;/a&gt;, je vous avais prévenu : il va y avoir pas mal d’articles là dessus, même si quelques articles sur Kubernetes sont en cours d’écriture aussi ;-).&lt;/p&gt;
&lt;p&gt;Fin juillet, j’avais écris &lt;a class="link" href="https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/" &gt;un article sur des playbooks Ansible que j’ai écris pour faciliter le déploiement de cluster Proxmox VE&lt;/a&gt;. Malheureusement, comme cet article traînait dans mes brouillons, les playbooks ne géraient pas la version 6 (qui venait de sortir) de PVE.&lt;/p&gt;
&lt;p&gt;C’est aujourd’hui de l’histoire ancienne puisque, pour tester la v6, j’ai forcément du adapter les playbooks ;-).&lt;/p&gt;
&lt;p&gt;Point important, je vais partir du principe que vous n’avez pas la possibilité d’installer Proxmox VE directement avec l’ISO. C’est souvent le cas souvent avec les hébergeurs de serveurs dédiés pas chers (OneProvider par exemple) ou de VMs (OVH, Scaleway, etc).&lt;/p&gt;
&lt;p&gt;Car si vous avez la main, le plus simple est bien sûr d’installer l’ISO directement ! Cependant, ce tuto reste utile pour toute la partie mise en VPN et configuration du cluster.&lt;/p&gt;
&lt;h2 id="les-prérequis"&gt;Les prérequis
&lt;/h2&gt;&lt;p&gt;Dans l’article précédent, pour gagner du temps pour ceux qui veulent juste tester, j’avais mis à disposition un playbook permettant de générer des VMs chez le cloud provider Scaleway (et notamment tirer parti de l’inventaire dynamique proposé par le module développé par Scaleway pour Ansible).&lt;/p&gt;
&lt;p&gt;Ici, je met volontairement de côté cette partie qui n’apporterait rien de plus. Si vous voulez voir comment ça fonctionne je vous invite à &lt;a class="link" href="https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/" &gt;(re)lire l’article précédent&lt;/a&gt;, la procédure est la même.&lt;/p&gt;
&lt;p&gt;Le seul prérequis pour ce tutoriel sont donc d’avoir idéalement 3 machines* (ou plus) sous Debian 10 (la raison pour laquelle je n’avais pas pu le faire avec Scaleway qui ne propose pas encore Debian Buster) accessibles en depuis votre station de travail.&lt;/p&gt;
&lt;p&gt;*Mais si vous voulez juste installer Proxmox, une seule suffit mais vous n’aurez évidemment pas un cluster. A partir de 2, on peut faire un cluster mais il sera instable dès que vous perdrez une seule des 2 machines (ce qui est dommage) à moins d’ajouter un device pour permettre d’avoir le quorum (ce que nous verrons dans un autre article).&lt;/p&gt;
&lt;h2 id="installer-ansible-et-récupérer-les-playbooks"&gt;Installer Ansible et récupérer les playbooks
&lt;/h2&gt;&lt;p&gt;Des fois que n’auriez pas Ansible, installez le (pour git, c’est juste plus simple de cloner le dépôt mais vous pouvez le télécharger autrement si vous ne voulez pas installer git)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get install git ansible
git clone https://github.com/zwindler/ansible-proxmoxve
cd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on créé un fichier d’inventaire pour Ansible (ce qui n’étais pas nécessaire avec Scaleway puisque, je le rappelle, il y a un module d’inventaire dynamique). Ici on se contente juste de lister les serveurs qui nous intéressent.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat pve_inventory.yml
all:
children:
proxmoxve:
hosts:
proxmox1.myexample.org:
proxmox2.myexample.org:
proxmox3.myexample.org:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous ne reconnaissez peut être pas le format de cet inventaire Ansible. En effet, l’inventaire est ici stocké au format YAML et non au format plat. Très peu de gens utilisent ce format (qui existait au début, puis a été retiré pour être de nouveau supporté depuis la 2.4 je crois).&lt;/p&gt;
&lt;p&gt;Étant habitué aux inventaires parfois un peu hétéroclites, je préfère largement ce format YAML, qui permet de rajouter de manière beaucoup plus lisibles des variables à des groupes ou mêmes des hôtes directement (sans passer par une arborescence complète avec groups_vars et hosts_vars). De plus, je trouve les dépendances entre groupes plus claires que lorsque nous avions à déclarer les :children du groupe père (mais c’est subjectif).&lt;/p&gt;
&lt;p&gt;Notez par contre qu’il faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;que mes hôtes soient résolvables par DNS (sinon il faut ajouter une variable ansible_host avec l’IP pour chacun)&lt;/li&gt;
&lt;li&gt;que vous n’oubliez surtout par le &amp;ldquo;:&amp;rdquo; à la fin de chaque hostname, sans quoi vous aurez une erreur de syntaxe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lancer-le-playbook-dinstallation-de-proxmox-ve-6"&gt;Lancer le playbook d’installation de Proxmox VE 6
&lt;/h2&gt;&lt;p&gt;Nous y voilà. Normalement vous pouvez accéder en SSH à l’ensemble de vos machines. Pour installer Proxmox VE 6 sur une debian 10, il faut donc simplement lancer la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i pve_inventory.yml proxmox_prerequisites.yml -u root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, le playbook vous promptera pour répondre à quelques questions basiques (votre domaine, est ce que les machines commencent par test plutôt que proxmox dans le hostname, &amp;hellip;) et à l’issue, un reboot sera effectué (pour basculer sur le noyau Linux de PVE et pas celui de debian Buster).&lt;/p&gt;
&lt;h2 id="mise-en-réseau-privé-virtuel-avec-tinc"&gt;Mise en réseau privé virtuel avec Tinc
&lt;/h2&gt;&lt;p&gt;Cette étape n’est pas forcément nécessaire. Si vous travaillez sur des machines qui sont dans un même réseau local, il vaut mieux s’en passer.&lt;/p&gt;
&lt;p&gt;En revanche, dans le cas où comme moi vous louez des serveurs chez un provider et qu’il ne vous met pas à disposition un moyen de simuler un réseau privé (RPN chez Online, Rack quelque chose chez OVH je crois), il sera préférable de monter un VPN entre les différentes machines du cluster.&lt;/p&gt;
&lt;p&gt;Je dis préférable et pas nécessaire, &lt;a class="link" href="https://blog.zwindler.fr/2019/07/16/sortie-de-proxmox-ve-6-0-les-nouveautes/" &gt;car jusqu’à la version 6 de Proxmox (et Corosync v3), il était nécessaire également de faire passer du multicast&lt;/a&gt; entre les machines pour faire fonctionner le cluster. Ce n’est aujourd’hui plus le cas et on peut donc très bien imaginer un cluster Proxmox avec des machines sur des LAN distincts. Cependant, pour activer des fonctionnalités comme Ceph (et probablement d’autre), il est toujours nécessaire d’avoir un LAN.&lt;/p&gt;
&lt;p&gt;Pour se faire, j’utilise Tinc plutôt qu’OpenVPN, qui a l’avantage d’être simple à configurer et surtout multipoint (pas de notion de serveur maitre et de clients connectés dessus). Ce n’est pas le cas avec OpenVPN, dont la structure client/serveur complexifie beaucoup l’implémentation si on veut éviter un SPOF (en gros il faut un serveur sur toutes les machines, et que l’ensemble des serveurs soient tous clients les uns des autres, en toile d’araignée). Vous pouvez &lt;a class="link" href="https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/" &gt;quand même jeter un oeil sur mes premières tentatives ici&lt;/a&gt;, si ça vous intéresse.&lt;/p&gt;
&lt;p&gt;Comme j’automatise tout avec Ansible, j’ai donc aussi créé un playbook qui permet d’installer et configurer Tinc sur toutes nos machines et de les mettre en réseau sur un VPN dédié.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i pve_inventory.yml tinc_installation.yml -u root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous avez donc 3 machines Proxmox VE 6, connectés ensembles sur un VPN avec l’adresse 10.10.10.0/24&lt;/p&gt;
&lt;h2 id="le-réseau-cest-compliqué-"&gt;Le réseau c’est compliqué ?
&lt;/h2&gt;&lt;p&gt;Un point pas forcément évident avec Proxmox est que la configuration du réseau dépend beaucoup de comment vos machines sont connectées en réseau.&lt;/p&gt;
&lt;p&gt;Les différentes configurations conseillées sont détaillées &lt;a class="link" href="https://pve.proxmox.com/wiki/Network_Configuration" target="_blank" rel="noopener"
&gt;dans un article dédié sur le wiki de Proxmox&lt;/a&gt;. J’aurais vraiment aimé connaître cette page lorsque M4vr0x et moi avons fait nos premières expériences avec PVE car nous avons beaucoup tâtonné&amp;hellip;&lt;/p&gt;
&lt;p&gt;Dans mon cas précis, j’ai des machines hostées par un provider. Je n’ai donc aucunement la main sur le réseau et je ne souhaite pas acheter d’IP supplémentaires.&lt;/p&gt;
&lt;p&gt;Dans ce cas là, le plus simple est donc de créer un bridge Linux, qui portera un réseau virtuel interne à chaque serveur et dont le trafic externe sera routé.&lt;/p&gt;
&lt;p&gt;L’inconvénient de cette solution est qu’on ne peut pas utiliser l’interface graphique pour faire ces modifications, et aussi qu’en cas d’erreur, vous n’aurez plus accès à votre serveur&amp;hellip;&lt;/p&gt;
&lt;h2 id="configuration-réseau-pour-des-machines-dédiées-chez-un-provider-type-oneprovider"&gt;Configuration réseau pour des machines dédiées chez un Provider type OneProvider
&lt;/h2&gt;&lt;p&gt;Nous voilà donc dans les premières bidouilles manuelles. Connectez vous en SSH à votre (vos) serveurs, et modifier le fichier /etc/network/interfaces.&lt;/p&gt;
&lt;p&gt;Je me suis basé sur la section &lt;a class="link" href="https://pve.proxmox.com/wiki/Network_Configuration#_masquerading_nat_with_tt_span_class_monospaced_iptables_span_tt" target="_blank" rel="noopener"
&gt;&amp;ldquo;Masquerading (NAT) with iptables&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le mien ressemble à ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto eth0
#real IP address
iface eth0 inet static
address x.x.x.x
netmask 24
gateway x.x x.1
auto vmbr0
iface vmbr0 inet static
address 192.168.0.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s &amp;#39;192.168.0.0/24&amp;#39; -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s &amp;#39;192.168.0.0/24&amp;#39; -o eth0 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le plus important ici pour que tout fonctionne est que vous ne vous trompiez pas sur le nom de l’interface réseau (eth0 dans mon exemple).&lt;/p&gt;
&lt;p&gt;Ensuite, une fois que les modifications sont faites, redémarrez le réseau (&lt;em&gt;systemctl restart networking&lt;/em&gt;) ou carrément le serveur (c’est ce que Proxmox conseille, même si je ne vois pas bien l’intérêt).&lt;/p&gt;
&lt;p&gt;Ici, la configuration est beaucoup plus simple que ce que nous avions imaginé &lt;a class="link" href="https://blog.zwindler.fr/2017/07/18/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-2/" &gt;avec M4vr0x dans la série d’articles détaillés sur PVE 5&lt;/a&gt;. Et c’est tant mieux car ça suffira amplement à la plupart d’entre vous ;-).&lt;/p&gt;
&lt;h2 id="configuration-du-cluster-proxmox-ve"&gt;Configuration du cluster Proxmox VE
&lt;/h2&gt;&lt;p&gt;Ok ! Maintenant tous les prérequis sont en place, on peut donc construire le cluster. Le wizard de la GUI a assez peu évolué depuis la V5 (même s’il y a quelques petites améliorations)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous vous connectez sur une des machines&lt;/li&gt;
&lt;li&gt;Dans la vue Datacenter, vous sélectionnez Create Cluster, puis vous copiez les informations de connexion pour les autres serveurs.&lt;/li&gt;
&lt;li&gt;Sur les autres serveurs, vous rejoignez le cluster en collant les informations des&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Plus de détails dans l’article précédent)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/proxmox_ve_6_create_cluster.avif"
loading="lazy"
&gt;&lt;/p&gt;</description></item><item><title>Un cluster Proxmox VE en 5 minutes avec Ansible</title><link>https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/</link><pubDate>Mon, 22 Jul 2019 11:45:34 +0000</pubDate><guid>https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/08/cropped-proxmox_logo-1.webp" alt="Featured image of post Un cluster Proxmox VE en 5 minutes avec Ansible" /&gt;&lt;h2 id="cool-on-va-encore-déployer-du-proxmox-ve-"&gt;Cool on va (encore) déployer du Proxmox VE !!!
&lt;/h2&gt;&lt;p&gt;Petit tuto aujourd’hui, massivement facilité par l’usage d’Ansible : on va déployer un cluster de machines Proxmox VE via le cloud provider Scaleway.&lt;/p&gt;
&lt;p&gt;A noter : Si jamais vous ne voulez pas utiliser Scaleway, les playbooks ont été découpés de manière à ce que la partie d’installation de Proxmox ainsi que l’installation de tinc et la mise en cluster puissent être réalisés à part. Vous pouvez donc tout à faire partir de machines sous Debian 9 via ces playbooks.&lt;/p&gt;
&lt;p&gt;Pourquoi Scaleway me direz vous ? Tout simplement parce qu’ils ont, contrairement à d’autres, une très bonne API, qui a permis à un de leurs employés de faire de très bons modules Ansible, notamment un module permettant de gérer l’inventaire dynamique (pas besoin de renseigner un fichier hosts pour Ansible, c’est directement l’API qui nous liste les VMs).&lt;/p&gt;
&lt;p&gt;J’ai d’ailleurs utilisé ce provider à plusieurs reprises pour cette raison (voir mon article sur &lt;a class="link" href="https://blog.zwindler.fr/2019/03/21/deployer-en-5-minutes-un-cluster-kubernetes-sur-arm-avec-k3s-et-ansible/" &gt;k3s et Ansible&lt;/a&gt; ou mon talk à BDX I/O &lt;a class="link" href="https://www.youtube.com/watch?v=WPRE1_f0pyg" target="_blank" rel="noopener"
&gt;Ami développeur, deviens un ops sans effort avec Ansible&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="proxmox-ve-54--pourquoi-pas-60-"&gt;Proxmox VE 5.4 ? Pourquoi pas 6.0 ?
&lt;/h2&gt;&lt;p&gt;La deuxième question, tout aussi légitime, repose donc sur &amp;ldquo;pourquoi diantre monter un cluster Proxmox VE 5.4 alors que tu viens de nous faire un article qui vante &lt;a class="link" href="https://blog.zwindler.fr/2019/07/16/sortie-de-proxmox-ve-6-0-les-nouveautes/" &gt;les bienfaits de la version 6.0&lt;/a&gt; qui vient de sortir ?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Et là j’ai deux raisons (une bonne et une mauvaise). La mauvaise, c’est simplement que l’article trainait dans mes brouillons et que je n’ai pas cliqué sur &amp;ldquo;Poster&amp;rdquo;&amp;hellip; La &amp;ldquo;bonne&amp;rdquo; raison, c’est que la version 10 de Debian, qui est la base de Proxmox VE 6, n’est pas encore disponible sur Scaleway, ce qui complique un peu l’installation.&lt;/p&gt;
&lt;p&gt;Lorsqu’elle le sera, je ne manquerais pas de faire un petit refresh de l’article ainsi que des playbooks Ansible ;)&lt;/p&gt;
&lt;h2 id="déployer-les-vms-avec-ansible"&gt;Déployer les VMs avec Ansible
&lt;/h2&gt;&lt;p&gt;Je l’ai dis juste avant, le gros avantage de Scaleway, c’est de pouvoir spawner des VMs à la volées avec Ansible et surtout d’avoir l’inventaire dynamique.&lt;/p&gt;
&lt;p&gt;Petite (grosse?) limitation : comme il s’agit de VMs, il ne sera évidemment pas possible de faire tourner des VMs de type KVM/qemu sur ces machines (sauf moyennant un hack de type nesting de VM dans une VM).&lt;/p&gt;
&lt;p&gt;Cependant, depuis quelques temps, je n’utilise plus du tout les VMs (je n’ai pas de workload Windows) et j’utilise plutôt des containers LXC.&lt;/p&gt;
&lt;p&gt;C’est vraiment plus léger en terme d&amp;rsquo;empreinte mémoire (je n’ai jamais été embêté côté CPU mais côté RAM, chaque Mo compte) et ça se gère (install, gestion, sauvegarde) de la même façon qu’une VM, contrairement à Docker qui nécessite une gymnastique mentale complémentaire.&lt;/p&gt;
&lt;h2 id="bon-on-fait-ça-comment-"&gt;Bon, on fait ça comment ?
&lt;/h2&gt;&lt;p&gt;Maintenant que j’ai posé le décor, on peut commencer le tuto. L’idée va être de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer des VMs&lt;/li&gt;
&lt;li&gt;Récupérer leurs informations (IP publique, surtout)&lt;/li&gt;
&lt;li&gt;Installer les prérequis de Proxmox VE (puis les rebooter pour passer sur le kernel PVE)&lt;/li&gt;
&lt;li&gt;Installer les prérequis et configurer tinc, le VPN qui va nous permettre d’initier le cluster et de laisser passer les trames multicast, nécessaires au clustering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A l’issue de ces étapes, on arrêtera là l’automatisation et on passera sur quelques (rapides) étapes manuelles.&lt;/p&gt;
&lt;p&gt;Ok, j’avoue que c’est dommage que tout ne soit pas automatisé. Mais le gros du boulot, c’est vraiment les étapes précédentes. Pour s’en convaincre, vous pouvez lire l’article que j’avais écris &lt;a class="link" href="https://blog.zwindler.fr/2018/06/05/creation-dun-cluster-de-virtualisation-proxmox-ve-5-2-x/" &gt;pour la version 5.2 (mais avec OpenVPN)&lt;/a&gt; ou tout simplement lire le contenu des playbooks.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Et oui, il y a quand même quelques prérequis à ce tuto. Il faudra :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoir un compte sur Scaleway&lt;/li&gt;
&lt;li&gt;Avoir une clé SSH, avoir la clé publique à la racine du projet, et l’appeler admin.pub&lt;/li&gt;
&lt;li&gt;Installer les package pip&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install jinja2 PyYAML paramiko cryptography packaging
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Installer Ansible depuis les sources (&amp;gt;= 2.8)&lt;/li&gt;
&lt;li&gt;Installer &lt;code&gt;jq&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J’aurai pu faire aussi un playbook pour ça, mais comme c’est très dépendant de votre distribution Linux (ou Windows ahaha), &amp;hellip;&lt;/p&gt;
&lt;h2 id="you-token-to-me-"&gt;You token to me ?
&lt;/h2&gt;&lt;p&gt;Créez un token sur le site de Scaleway pour les accès distants et le stocker dans un fichier scaleway_token sur votre machine avec Ansible :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export SCW_API_KEY=&amp;#39;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis sourcez le fichier :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source scaleway_token
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de maintenant, vous avez le pouvoir tout puissant du cloud au bout de vos doigts (et de votre CB) !&lt;/p&gt;
&lt;h2 id="générer-les-machines"&gt;Générer les machines
&lt;/h2&gt;&lt;p&gt;Là, on tire totalement parti du travail de &lt;a class="link" href="https://github.com/scaleway/ansible" target="_blank" rel="noopener"
&gt;Rémy Léone sur https://github.com/scaleway/ansible et des modules Ansible pour Scaleway, intégrés au repo officiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On va donc utiliser le playbook create_proxmox_vms.yaml pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;récupérer l’ID d’organisation du compte Scaleway (votre identifiant unique)&lt;/li&gt;
&lt;li&gt;récupérer un ID d’une image disque compatible debian Stretch (de la bonne taille)&lt;/li&gt;
&lt;li&gt;ajouter si nécessaire la clé SSH de l’admin dans le portail Scaleway, qui sera injectée dans vos VMs à leur création&lt;/li&gt;
&lt;li&gt;créer autant de machines que nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook create_proxmox_vms.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon, je vous ai pas menti, c’est quand même hyper simple non ?&lt;/p&gt;
&lt;p&gt;A noter, actuellement le script traite les demandes de création de machines séquentiellement. Pour 3 VMs, comptez environ 3 minutes.&lt;/p&gt;
&lt;p&gt;Cependant, si vous avez un gros besoin, sachez qu’il est possible de modifier le script pour les lancer en parallèle (déjà fait dans mon repo &lt;a class="link" href="https://github.com/zwindler/ansible-deploy-azure/issues/2" target="_blank" rel="noopener"
&gt;ansible-deploy-azure&lt;/a&gt; sur Github) via la fonction async d’Ansible.&lt;/p&gt;
&lt;h2 id="mise-en-place-de-linventaire-dynamique"&gt;Mise en place de l’inventaire dynamique
&lt;/h2&gt;&lt;p&gt;J’arrête pas de vous en parler depuis tout à l’heure, normalement dans Ansible, maintenant que nos VMs sont créées, pour pouvoir nous y connecter, on devrait créer un fichier texte &amp;ldquo;inventory&amp;rdquo; contenant la liste des hôtes et de leur IP (a minima). C’est fastidieux, surtout si vous avez beaucoup de VMs.&lt;/p&gt;
&lt;p&gt;Et là, on a juste un fichier inventory.yml, contenant le nom du plugin, la région utilisée (Paris dans mon script) et le tag des machines générées :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;plugin: scaleway
regions:
- par1
tags:
- proxmoxve
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, on peut vérifier le retour de la commande ansible-inventory&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-inventory --list -i inventory.yml
{
&amp;#34;_meta&amp;#34;: {
&amp;#34;hostvars&amp;#34;: {
&amp;#34;x.x.x.x&amp;#34;: {
&amp;#34;arch&amp;#34;: &amp;#34;x86_64&amp;#34;,
&amp;#34;commercial_type&amp;#34;: &amp;#34;DEV1-S&amp;#34;,
&amp;#34;hostname&amp;#34;: &amp;#34;test3&amp;#34;,
[...]
&amp;#34;proxmoxve&amp;#34;: {
&amp;#34;hosts&amp;#34;: [
&amp;#34;x.x.x.x&amp;#34;,
&amp;#34;y.y.y.y&amp;#34;,
&amp;#34;z.z.z.z&amp;#34;
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Petite hack SSH : comme Ansible se connecte en SSH aux hôtes distants, à la première connexion on va bloquer sur l’acceptation de la fingerprint.&lt;/p&gt;
&lt;p&gt;Un moyen de bypasser ça en une ligne de commande est d’utiliser la commande ssh-keyscan et de coller tout ça dans votre known_hosts. On peut le faire avec ce petit oneliner :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-inventory --list -i inventory.yml | jq -r &amp;#39;.proxmoxve.hosts | .[]&amp;#39; | xargs ssh-keyscan &amp;gt;&amp;gt; ~/.ssh/known_hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ce n’est évidemment pas recommandé en production !!! Mais dans le cadre d’un test temporaire, vous me pardonnerez cette liberté.&lt;/p&gt;
&lt;p&gt;Ajoutez votre clé SSH dans l’agent, puis vérifiez que vous pouvez vous connecter à tous les serveurs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eval `ssh-agent`
ssh-add myprivate.key
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;ansible proxmoxve -i inventory.yml -u root -m ping
x.x.x.x | SUCCESS =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
y.y.y.y | SUCCESS =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
z.z.z.z | SUCCESS =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="préparation-du-serveur"&gt;Préparation du serveur
&lt;/h2&gt;&lt;p&gt;Ok ! Maintenant, on a 3 (ou plus) VMs Debian 9. A partir de là, j’ai créé un playbook Ansible qui suit &lt;a class="link" href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Stretch" target="_blank" rel="noopener"
&gt;la doc d’installation officielle de Proxmox sur un Debian Stretch&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory.yml -u root proxmox_prerequisites.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A l’issue de l’installation, il est nécessaire de rebooter les serveurs (manuellement ou via ansible), pour passer sur le kernel de PVE.&lt;/p&gt;
&lt;h2 id="installation-et-configuration-de-tinc"&gt;Installation et configuration de tinc
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;C’est piou-piou.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois que vos serveurs sont revenus à la vie, vous avez installé Proxmox. Pas mal hein ?&lt;/p&gt;
&lt;p&gt;Cependant, chez Scaleway (et tous les autres providers que je connais), le multicast est coupé entre vos VMs. Et ça c’est la loose car tout notre clustering va passer par des trames multicast.&lt;/p&gt;
&lt;p&gt;Pour bypasser ce souci de taille, le plus simple est de passer par un VPN, de créer un réseau privé virtuel entre toutes nos instances, qui lui ne filtrera rien.&lt;/p&gt;
&lt;p&gt;Dans les articles précédents, &lt;a class="link" href="https://blog.zwindler.fr/2018/06/05/creation-dun-cluster-de-virtualisation-proxmox-ve-5-2-x/" &gt;j’avais utilisé OpenVPN&lt;/a&gt; (parce que c’est ce que je connais le mieux). Le souci d’OpenVPN c’est qu’il fonctionne sur un base client-serveur. Or, dès qu’on dépasse les 3 serveurs, on se retrouve avec 1 serveur maitre et 2 (ou plus clients), et donc un SPOF&amp;hellip;&lt;/p&gt;
&lt;p&gt;L’avantage avec tinc, c’est qu’on a pas cette notion de client/serveur. Tous les tincs sont connectés à tous les tincs, dans un genre de gros maillage qui nous évite donc tout SPOF.&lt;/p&gt;
&lt;p&gt;L’installation de tinc n’est en soit pas follement complexe (cf le &lt;a class="link" href="https://github.com/zwindler/ansible-proxmoxve/blob/master/tinc_installation.yml" target="_blank" rel="noopener"
&gt;playbook&lt;/a&gt;), mais là encore, l’automatiser c’est toujours sympa.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory.yml -u root tinc_installation.yml
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="etapes-additionnelles-manuelles"&gt;Etapes additionnelles manuelles
&lt;/h2&gt;&lt;p&gt;Une fois que vous en êtes là, on arrive dans les tâches non triviales à automatiser.&lt;/p&gt;
&lt;p&gt;Actuellement, il n’est pas possible de créer un cluster Proxmox VE sans avoir un mot de passe root. Or, lors de la création des VMs, Scaleway utilise notre clé SSH (ce qui est beaucoup mieux). Nous allons donc devoir nous connecter sur l’ensemble des machines et réinitialiser le mot de passe du compte root.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@test1:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-un-cluster"&gt;Créer un cluster
&lt;/h2&gt;&lt;p&gt;Cette partie aurait pu être automatisée. Dans le tutoriel précédent, je le faisais en ligne de commandes, à cause d’une limitation dans le wizard de création de cluster. En effet, dans les précédentes versions de Proxmox, on ne pouvait pas sélectionner sur quelle interface réseau on souhaitait utiliser, et donc mon cluster ne passait pas par le VPN et les trames multicast ne passaient jamais.&lt;/p&gt;
&lt;p&gt;Pour autant, maintenant on peut profiter du beau wizard tout neuf et le faire via la GUI :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se connecter à l’UI de Proxmox avec un des noeuds (le premier, au hasard)&lt;/li&gt;
&lt;li&gt;Dans Datacenter (à gauche), sélectionner Cluster puis cliquer sur &amp;ldquo;Create Cluster&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Donner un nom au cluster, mais surtout, donner comme adresse ring0 l’adresse VPN (10.10.10.1 si on est sur le noeud 1)&lt;/li&gt;
&lt;li&gt;Une fois l’opération terminée, cliquer sur &amp;ldquo;Join Information&amp;rdquo;, dans le même menu, et copier les informations en cliquant sur &amp;ldquo;Copy Information&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/create.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="joindre-le-cluster"&gt;Joindre le cluster
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Se connecter sur l’UI de la 2ème machine&lt;/li&gt;
&lt;li&gt;Dans Datacenter, sélectionner Cluster puis cliquer sur &amp;ldquo;Join Cluster&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Dans le champ &amp;ldquo;Information&amp;rdquo;, coller les données récupérée lors de l’étape précédente. Les informations de connexion devraient automatiquement être remplies, &lt;strong&gt;SAUF le Corosync ring0, qu’il faut positionner à 10.10.10.2&amp;quot;&lt;/strong&gt;, et le mot de passe root du noeud 1. Cliquer sur &amp;ldquo;Join&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Si l’opération réussie, un message doit s’afficher pour dire de recharger la page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Répéter l’opération pour les noeuds suivants (3, voire ++)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/clusterupandrunning.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et en attendant la même chose avec la v6, amusez vous bien :)&lt;/p&gt;</description></item><item><title>[Tutoriel] Faire un petit cluster Proxmox chez Kimsufi avec OpenVPN</title><link>https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/</link><pubDate>Tue, 29 Aug 2017 11:40:23 +0000</pubDate><guid>https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/08/proxmox_logo.webp" alt="Featured image of post [Tutoriel] Faire un petit cluster Proxmox chez Kimsufi avec OpenVPN" /&gt;&lt;h2 id="cest-la-rentrée-vous-reprendrez-bien-un-petit-article-sur-proxmox-"&gt;C’est la rentrée, vous reprendrez bien un petit article sur Proxmox !
&lt;/h2&gt;&lt;p&gt;Ou plutôt, c’est bientôt la rentrée et il est grand temps que je solde les articles qui trainent dans mes tiroirs car je moi pars bientôt en vacances.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;« Et tout le monde s’en fout »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’ai donc rédigé un tutoriel pas à pas pour vous montrer qu’on peut créer rapidement un petit cluster sous Proxmox avec deux petites machines chez un hébergeur pas cher type Kimsufi (j’avais justement deux machines car j’ai profité d’une promo chez eux), sans que les machines soient dans le même sous réseau IP.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/kimsufi01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si vous ne connaissez pas Proxmox, je vous renvoie vers &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=Proxmox" &gt;les articles que M4vr0x ou moi avons écris sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="pourquoi-un-tutoriel-pour-les-clusters-proxmox-"&gt;Pourquoi un tutoriel pour les clusters Proxmox ?
&lt;/h2&gt;&lt;p&gt;Vous allez me dire, pourquoi un énième article sur le sujet ? &lt;a class="link" href="https://pve.proxmox.com/wiki/Proxmox_VE_4.x_Cluster" target="_blank" rel="noopener"
&gt;La documentation officielle, même si elle est en anglais&lt;/a&gt;, est assez claire et il existe plusieurs tutoriels en Français pour le faire.&lt;/p&gt;
&lt;p&gt;Ah ah oui&amp;hellip; mais la distinction c’est « faire un cluster de machines Proxmox, &lt;strong&gt;sans que les machines soient dans le même sous réseau IP&lt;/strong&gt; » !&lt;/p&gt;
&lt;p&gt;Et à moins que vous ayez une chance de ouf’, il est peu probable que vos deux Kimsufi le soient.&lt;/p&gt;
&lt;h2 id="petit-rappel-des-prérequis-pour-faire-un-cluster-proxmox"&gt;Petit rappel des prérequis pour faire un cluster Proxmox
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deux serveurs physiques (au minimum)&lt;/li&gt;
&lt;li&gt;Port 22 accessible au moins dans un premier temps pour configurer le cluster&lt;/li&gt;
&lt;li&gt;Que la latence d’un serveur à l’autre soit inférieure à 2ms&lt;/li&gt;
&lt;li&gt;Que les deux serveurs soient capables de communiquer en multicast&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Et là, c’est le drame !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jusqu’à ce qu’on arrive à la dernière ligne, nous étions sereins.&lt;/p&gt;
&lt;p&gt;Si jamais vous avez deux serveurs chez Kimsufi (ou autre) et que vous essayez de les faire communiquer en multicast, vous allez vite vous rendre compte que le multicast est bloqué !&lt;/p&gt;
&lt;p&gt;Impossible donc de faire fonctionner correctement votre cluster Proxmox (basé sur &lt;strong&gt;corosync&lt;/strong&gt;) sans cela. Vous pouvez mettre tous les autres tutos à la poubelle ;-).&lt;/p&gt;
&lt;h2 id="bidouille--compagnie-et-les-risques-encourus"&gt;Bidouille &amp;amp; compagnie, et les risques encourus
&lt;/h2&gt;&lt;p&gt;Si vous vous sentez la curiosité de monter quand même un cluster sur votre Kimsufi, on va contourner le problème en montant un VPN entre les deux machines. &lt;a class="link" href="https://blog.zwindler.fr/2017/07/25/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-3/" &gt;M4vr0x a déjà détaillé l’utilisation d’OpenVPN avec pfSense sur Proxmox&lt;/a&gt;, mais on n’était pas dans le même contexte.&lt;/p&gt;
&lt;p&gt;On ne peut pas se baser là dessus dans le cas présent car Proxmox a la fâcheuse manie de &lt;strong&gt;réinitialiser toute la configuration lorsqu’on démarre le mode « cluster »&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION !!!&lt;/strong&gt;&lt;br&gt;
Oui, ça veut bien dire que vous ne verrez plus ni vos VMs existantes, ni le stockage que vous avez précédemment configuré&amp;hellip;&lt;br&gt;
Les VMs continuent d’exister et sont accessibles tant que vous ne rebootez pas. Le stockage aussi. Ce n’est juste plus visible.&lt;/p&gt;
&lt;p&gt;Vous l’avez deviné, c’est du vécu : j’ai flingué ma configuration existante lorsque j’ai initialisé le cluster.&lt;/p&gt;
&lt;h2 id="mise-en-réseau"&gt;Mise en réseau
&lt;/h2&gt;&lt;p&gt;Maintenant que vous savez ce que vous risquez, on va donc configurer tout ça à la main, directement en SSH sur les machines Proxmox :&lt;/p&gt;
&lt;h3 id="sur-le-serveur-1"&gt;Sur le serveur 1
&lt;/h3&gt;&lt;p&gt;La première chose à faire est simplement d’installer &lt;strong&gt;openvpn&lt;/strong&gt;, ainsi qu’un utilitaire qui s’appelle &lt;strong&gt;easy-rsa&lt;/strong&gt; qui va nous faciliter la tâche de configuration.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get update
apt-get upgrade
apt-get install openvpn easy-rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est fait, on copie les templates de config et les scripts de easy-rsa et on modifie les valeurs par défaut par nos propres valeurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cp -ai /usr/share/easy-rsa/ /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa/
vi vars
[...]
# These are the default values for fields
# which will be placed in the certificate.
# Don&amp;#39;t leave any of these fields blank.
export KEY_COUNTRY=&amp;#34;FR&amp;#34;
export KEY_PROVINCE=&amp;#34;Aquitaine&amp;#34;
export KEY_CITY=&amp;#34;Bordeaux&amp;#34;
export KEY_ORG=&amp;#34;mondomaine.tld&amp;#34;
export KEY_EMAIL=&amp;#34;key@mondomaine.tld&amp;#34;
export KEY_OU=&amp;#34;key&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sourcez le fichier nouvellement rempli :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;. ./vars
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nettoyez les clés provenant d’anciennes itérations de l’outil (pas nécessaire si c’est la première fois mais si vous n’en êtes pas au premier coup, ça peut éviter des erreurs bêtes) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./clean-all
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et enfin, on génère l’ensemble des clés dont vous aurez besoin (les CA, les clés serveurs, les clés clientes et la diffie helmann) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./build-ca
./build-key-server serveur1.mondomaine.tld
./build-key serveur2.mondomaine.tld
./build-dh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement tout devrait se passer sans encombre et vous devriez avoir plusieurs certificats nouvellement créés. On va copier les certificats du serveur OpenVPN dans le dossier /etc/openvpn, puis envoyer les certificats du client par SCP :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cp keys/ca.* keys/serveur1.mondomaine.tld.* keys/dh2048.pem /etc/openvpn/
scp keys/ca.crt keys/serveur2.mondomaine.tld.crt keys/serveur2.mondomaine.tld.key serveur2.mondomaine.tld:/etc/openvpn/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant qu’on a tout, on peut créer le fichier de configuration. Ici rien de bien compliqué à comprendre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On créé un fichier server.conf qui va monter un VPN sur le port 1194 en UDP via un device de type TAP (j’y reviendrai) et on force le réseau en 10.9.0.0/24&lt;/li&gt;
&lt;li&gt;On donne le chemin vers tous les certificats qu’on vient de créer&lt;/li&gt;
&lt;li&gt;On ajoute un script « up » et un script « down », avec l’option script-security à « 2 » sinon ça ne fonctionnera pas&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; /etc/openvpn/server.conf &amp;lt;&amp;lt; EOF
# [server.conf]
port 1194
proto udp
#dev tun
dev tap
ca /etc/openvpn/ca.crt
cert /etc/openvpn/serveur1.mondomaine.tld.crt
key /etc/openvpn/serveur1.mondomaine.tld.key
dh /etc/openvpn/dh2048.pem
server 10.9.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
script-security 2
up /etc/openvpn/add_multicast_route
down /etc/openvpn/add_multicast_route
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon et qu’est ce qu’il contient ce fameux script ? Et bien pour l’instant il se contente simplement d’ajouter et de supprimer une route sur les serveurs qui va router « à la main » tout le traffic multicast non par vers la gateway, mais vers le VPN ! Et c’est comme ça qu’on va contourner le blocage des flux multicast entre nos deux Kimsufi !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/openvpn/add_multicast_route
#!/bin/bash
#
# Add a route to force multicast through VPN
[ &amp;#34;$script_type&amp;#34; ] || exit 0
case &amp;#34;$script_type&amp;#34; in
up)
route add -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
down)
route del -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
esac
chmod +x /etc/openvpn/add_multicast_route
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On termine par démarrer (et activer au démarrage) le serveur OpenVPN :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl enable openvpn
systemctl start openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ce cas là, comme on est pas en réel mode client serveur ou l’ensemble du traffic client est routé sur le serveur on a pas besoin de modifier le paramètre kernel « ip_forward » :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="aparté-tun-vs-tap"&gt;Aparté tun vs tap
&lt;/h3&gt;&lt;p&gt;Les plus aguerris d’entre vous auront remarqués que j’ai volontairement choisi de ne pas utiliser une interface virtuelle de type &lt;strong&gt;tun&lt;/strong&gt; (par défaut dans OpenVPN) mais une interface de type &lt;strong&gt;tap&lt;/strong&gt;.&lt;br&gt;
Historiquement, ce type d’interface est connu pour ne pas fonctionner correctement en multicast, ce qui est ici notre but principal.&lt;/p&gt;
&lt;p&gt;A priori c’est censé être résolu depuis longtemps, mais chez moi ça n’a pas marché alors que dès que j’ai switché sur &lt;strong&gt;tap&lt;/strong&gt; ça a fonctionné directement. Je vous engage à regarder si ça vous intéresse. J’ai mis un lien vers une discussion à ce sujet sur le forum d’OpenVPN en fin d’article.&lt;/p&gt;
&lt;h3 id="sur-le-serveur-2"&gt;Sur le serveur 2
&lt;/h3&gt;&lt;p&gt;Maintenant que le serveur est configuré, au tour du client. Même topo, à ceci près qu’on ne va pas générer de certificats (c’est déjà fait).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get update
apt-get upgrade
apt-get install openvpn
cat &amp;gt; /etc/openvpn/client.conf &amp;lt;&amp;lt; EOF
# [client.conf]
client
#dev tun
dev tap
proto udp
remote @IP_publique_du_serveur1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/ca.crt
cert /etc/openvpn/serveur2.mondomaine.tld.crt
key /etc/openvpn/serveur2.mondomaine.tld.key
ns-cert-type server
comp-lzo
verb 3
script-security 2
up /etc/openvpn/add_multicast_route
down /etc/openvpn/add_multicast_route
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/openvpn/add_multicast_route
#!/bin/bash
#
# Add a route to force multicast through VPN
[ &amp;#34;$script_type&amp;#34; ] || exit 0
case &amp;#34;$script_type&amp;#34; in
up)
route add -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
down)
route del -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
esac
chmod +x /etc/openvpn/add_multicast_route
systemctl enable openvpn
systemctl start openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Facile, hein ?&lt;/p&gt;
&lt;h3 id="sur-tous-les-nœuds"&gt;Sur tous les nœuds
&lt;/h3&gt;&lt;p&gt;Pour s&amp;rsquo;assurer que tout fonctionne comme ça devrait (ou pour déboguer), vous pouvez autoriser temporairement la réponse à l&amp;rsquo;ICMP sur multicast. Un simple ping permettra de s&amp;rsquo;assurer que les deux serveurs se voient bien :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.icmp_echo_ignore_broadcasts=0
root@serveur1:/etc/pve# ping 224.0.0.1
PING 224.0.0.1 (224.0.0.1) 56(84) bytes of data.
64 bytes from 10.9.0.1: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 10.9.0.2: icmp_seq=1 ttl=64 time=1.07 ms (DUP!)
64 bytes from 10.9.0.1: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 10.9.0.2: icmp_seq=2 ttl=64 time=0.672 ms (DUP!)
64 bytes from 10.9.0.1: icmp_seq=3 ttl=64 time=0.020 ms
64 bytes from 10.9.0.2: icmp_seq=3 ttl=64 time=0.619 ms (DUP!)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les deux serveurs répondent aux pings depuis l&amp;rsquo;interface du VPN, on est bons ! Du coup vous pouvez re-désactiver la réponse aux broadcasts avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour faciliter la résolution de noms dans le cluster, vous pouvez ajouter les IPs VPN des serveurs dans le fichier /etc/hosts.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/hosts
[...]
10.9.0.1 serveur1-vpn
10.9.0.2 serveur2-vpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="création-du-cluster"&gt;Création du cluster
&lt;/h2&gt;&lt;h3 id="sur-le-nœud-1"&gt;Sur le nœud 1
&lt;/h3&gt;&lt;p&gt;En théorie, si on lit la documentation il suffit simplement de faire &amp;ldquo;pvecm create mycluster&amp;rdquo; et le tour est joué.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STOOOOP !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous le faite, ça ne fonctionnera pas (et vous pourrez &lt;a class="link" href="https://blog.zwindler.fr/2017/09/19/tutoriel-demonter-proprement-cluster-proxmox-ve/" &gt;vous en sortir avec cet article&lt;/a&gt;). Pourtant tout est correct au niveau des prérequis : les nœuds fonctionnent bien et que le multicast est correctement routé via le VPN. Un coup d’œil au fichier de configuration de corosync nous en apprendra plus :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/pve/corosync.conf
logging {
debug: off
to_syslog: yes
}
nodelist {
node {
name: serveur2
nodeid: 2
quorum_votes: 1
ring0_addr: serveur2
}
node {
name: serveur1
nodeid: 1
quorum_votes: 1
ring0_addr: serveur1
}
}
quorum {
provider: corosync_votequorum
}
totem {
cluster_name: mycluster
config_version: 4
ip_version: ipv4
secauth: on
version: 2
interface {
bindnetaddr: @IP_publique_du_serveur1
ringnumber: 0
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En fait le problème ici, c&amp;rsquo;est que l&amp;rsquo;adresse bindée &lt;strong&gt;bindnetaddr:&lt;/strong&gt; n&amp;rsquo;est pas bonne. Si vous n&amp;rsquo;avez pas lu mon gros &amp;ldquo;STOOOOP&amp;rdquo;, il faut tout réinitialiser car il est assez compliqué de modifier un cluster existant sous Proxmox (a priori pas possible proprement mais je vous donnerai la tips dans un prochain article).&lt;/p&gt;
&lt;p&gt;Voilà la bonne commande à taper :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm create mycluster -bindnet0_addr 10.9.0.1 -ring0_addr serveur1-vpn
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sur-le-noeud-2"&gt;Sur le noeud 2
&lt;/h3&gt;&lt;p&gt;En théorie, là aussi c&amp;rsquo;est très facile. Il suffit de faire &amp;ldquo;pvecm add serveur2-vpn&amp;rdquo; pour que l&amp;rsquo;hôte serveur2.mondomaine.tld rejoigne le cluster créé sur le noeud serveur1.mondomaine.tld.&lt;/p&gt;
&lt;p&gt;Voilà ce qui va se passer si vous le faites :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm add serveur1-vpn
The authenticity of host &amp;#39;serveur1-vpn (10.9.0.1)&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:VOIH2X7kTzWLUEzRPCl4431hlYnc3HCsDmzXYEs3V+g.
Are you sure you want to continue connecting (yes/no)? yes
root@serveur1-vpn&amp;#39;s password:
copy corosync auth key
stopping pve-cluster service
backup old database
Job for corosync.service failed because the control process exited with error code.
See &amp;#34;systemctl status corosync.service&amp;#34; and &amp;#34;journalctl -xe&amp;#34; for details.
waiting for quorum...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Même principe ici. Si l&amp;rsquo;adresse &lt;strong&gt;ring0_addr&lt;/strong&gt; n&amp;rsquo;est pas spécifiée explicitement, corosync va tenter de s&amp;rsquo;abonner sur une IP multicast sur l&amp;rsquo;IP de l&amp;rsquo;interface Ethernet principale. Elle ne passera donc pas pas notre VPN et le cluster ne communiquera pas en multicast !&lt;/p&gt;
&lt;p&gt;Vous pouvez &lt;a class="link" href="https://pve.proxmox.com/wiki/Separate_Cluster_Network#quorum.expected_votes_must_be_configured" target="_blank" rel="noopener"
&gt;en lire plus là dessus sur ce lien&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur le noeud serveur2, on ajoute donc l&amp;rsquo;adresse IP (et donc l&amp;rsquo;interface) que corosync devra emprunter pour communiquer avec serveur1-vpn (via le VPN donc).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm add serveur1-vpn -ring0_addr 10.9.0.2
The authenticity of host &amp;#39;serveur1-vpn (10.9.0.1)&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:oKkuOYY1pbEa1RrM0y9fWVJfnQabhUvG7la+6fZUnQ4.
Are you sure you want to continue connecting (yes/no)? yes
root@serveur2-vpn&amp;#39;s password:
copy corosync auth key
stopping pve-cluster service
backup old database
waiting for quorum...OK
generating node certificates
merge known_hosts file
restart services
successfully added node &amp;#39;serveur2&amp;#39; to cluster.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, tout devrait marcher. Vous devriez avoir sur la même interface vos deux serveurs, et avoir perdu toutes vos VMs si vous n&amp;rsquo;avez pas bien lu mon avertissement ;-)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/pve_cluster_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A noter : chose qui n&amp;rsquo;était pas possible entre la version 3 et la version 4 (car les deux composants n&amp;rsquo;utilisaient pas le même logiciel pour le clustering), il est possible de faire un cluster ProxMox mixant version 4 et version 5 comme le montre cette capture d&amp;rsquo;écran :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/pve_cluster_2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="aller-plus-loin--les-limites-dopenvpn"&gt;Aller plus loin : les limites d&amp;rsquo;OpenVPN
&lt;/h2&gt;&lt;p&gt;On a maintenant un cluster de 2 machines Proxmox. Pour autant, ce n&amp;rsquo;est pas idéal et ça ne suffira pas pour passer en production, notamment en cas de coupure réseau entre les deux machines (split brain). On va vite vouloir en rajouter au moins une, sinon plus.&lt;/p&gt;
&lt;p&gt;Cependant, on sera bloqués. Les limites de cette méthode est que la configuration d&amp;rsquo;OpenVPN est en mode client-serveur. Si vous avez plus de 2 machines, vous vous rendrez vite compte que vous pouvez communiquer entre les clients et le serveurs, mais pas entre clients.&lt;/p&gt;
&lt;p&gt;Et en gros ça ne marche pas, le 3ème noeud ne rejoindra pas le cluster car il ne peut pas joindre l&amp;rsquo;ensemble des membres et il se mettra en defaut.&lt;/p&gt;
&lt;p&gt;Pour bien faire en conservant ce mécanisme, il va falloir monter un service VPN externe aux serveurs Proxmox, qui seront tous clients de ce service, ou alors se créer un réseau de type full mesh, par exemple avec de l&amp;rsquo;IPSec si vous êtes un maitre en Réseau/Telco.&lt;/p&gt;
&lt;p&gt;Autant dire qu&amp;rsquo;il vaut mieux passer par un hébergeur qui permet le multicast ou qui fourni un service VPN. Ca ira plus vite&amp;hellip;&lt;/p&gt;
&lt;h2 id="sources-et-sujets-connexes"&gt;Sources et sujets connexes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://developers-club.com/posts/251541/" target="_blank" rel="noopener"
&gt;Un autre tuto qui ne me semble pas 100% exact, notamment la partie création et &amp;ldquo;join&amp;rdquo; du cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.openvpn.net/viewtopic.php?t=8036" target="_blank" rel="noopener"
&gt;Sending multicast over a openvpn tunnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Separate_Cluster_Network" target="_blank" rel="noopener"
&gt;La documentation officielle pour les clusters sur des sous réseaux distincts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linuxquestions.org/questions/linux-networking-3/openvpn-full-mesh-ubuntu-4175588844/" target="_blank" rel="noopener"
&gt;Un topic intéressant sur les limites d&amp;rsquo;OpenVPN et les réseaux full mesh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>