Table des matières

2022/05/07 (Neutriton) : Atelier Proxmox

Présences :

Météo

Moment informel durant lequel on exprime en peu de mots comment on se sent et si on a une attente forte pour la réunion. Ce n'est pas un moment de discussion mais d'expression individuelle et ce n'est pas obligatoire 🙂

Attente(s) forte(s)

Si l'une ou l'autre personne exprime une attente forte, merci de vous en occuper en priorité ou de la noter dans le hub ou dans un point approprié.

Atelier

Proposition d'aujourd'hui : nous laisser plein de choix, des manières différentes de faire.

Par exemple, est-ce qu'on commence sur une iso, ou un truc déjà préparer.

Actuellement, on a des machines avec Ubuntu installé dessus, les login et mot de passe sont neutrinet.

Tharyrok va nous donner une plage IP, pour qu'on puisse bronzer.

D'abord, on va donc choisir comment on démarre l'installation de Debian. On résinstallera donc la machine. Puis on installera Proxmox (on verra si on met un pfsense our pas).

Mettre une première VM et puis on verra où est-ce qu'on en sera pour la mise en cluster.

On mangera aussi ! Et on dira gère.

Sieste ! Recherche ! Développement !

Creation preseed/iso/kexec

Qu'est-ce qu'un preseed ? Un fichier de config que l'installateur de debian va lire. Toutes les distibutions qui utilisent Debian sont compatibles avec cet installateur, sauf Ubuntu. Vilain Ubuntu, pas bien.

Cela permet de faire certains choix en amont et on doit renseigner moins d'informations au moment de l'installation. Ca permet de donc de gagner du temps en évitant les questions où on va toujours donner les mêmes réponses.

Exemple de ce qu'on utilise dans Neutrinet : https://gitlab.domainepublic.net/Neutrinet/ketupa/build-images

Pour CentOS goût menthe c'est pas preseed, mais kickstart. Sinon le principe est le même.

Le soucis c'est qu'il faut faire une install complet pour s'assurer que le preseed fonctionne comme prévu. Pour éviter ça, on a un outil qui s'appelle Packer : https://www.packer.io/

On peut lui dire de démarrer une VM qemu, et puis lui demander de simuler la frappe sur le clavier.

Dans le fichier source de packer, on définit les ressources de la VM qu'il faut créer. On désactive le headless pour faire du debugging car la fenêtre va s'afficher.

Dans le fichier build-debian-11 on définit ce que va faire packer lors de l'install avec l'iso debian 11.

Autre exemple : Packer s'occupe de la création des images vagrant.

Lorsque la VM est créée on peut lancer des scripts. Pour Neutrinet, on utilise un playbook ansible.

Dans le dossier http, on retrouve le preseed pour debian 11.

A la fin, on peut lancer une commande. Mais les late-commandes de Debian ne foncitonnent pas toujours très bien donc mieux vaut se contenter du minimum, puis provisionner avec ansible (sachant que packer permet de lancer un playbook ansible à la fin de toute façon). Ici, on utilise le late-command pour permettre de se connecter en ssh via root avec un mot de passe (nécessaire pour exécuter le playbook ansible)

Maintenant, soit on crée une iso en injectant le preseed dans l'initram, soit on utilise kexec.

Kexec est un outil qui s'installe et qui permet de faire un pivot du kernel. Un kernel est en train de tourner, et au lieu de redémarrer, on demande à l'OS d'aller chercher un autre kernel en lui donnant le chemin de ce kernel.

Ca fait la même chose qu'un redémarrage mais sans redémarrage 😛

Cela permet de lancer le serveur SSH sans devoir passer par le bios. En gros, on donne une IP, on lance le serveur SSH, et hop on passe sur ce nouveau kernel. Ensuite on continue l'installation.

Cela peut être utilse quand on a qu'un accès SSH, qu'on a pas accès pour utiliser un ISO, ou si une installation ne nous convient pas.

On ne devra pas installer packer, cest un outil qui permet de vérifier plus rapidement ses pressed (sans tester une install à chaque fois).

Installation Debian minimal

Cela correspond à l'image mini.iso, cela ne contient que grub, syslinux, le kernel et l'initram de l'installateur debian.

Contrairement à la net install où on a déjà les modules de l'installateur (on télécharge mais on a déjà l'installateur).

C'est pour cette raison que la config réseau se fait au tout début de l'install avec debian mini, parce qu'il va en avoir besoin pour télécharger le reste de l'installateur.

Lien vers le mini iso : https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/mini.iso

L'inconvénient de la mini iso est que comme elle doit télécharger les modules de l'installateur sur internet, si la version de Debian a changé, on n'y a plus accès (passage de la 10.2 à la 10.3 par exemple). Les modules téléchargés ne sont plus compatibles. Alors que la netinstall fonctionnera de toute manière car elle a déjà l'installateur.

Après, c'est très simple de re-générer une image avec les bons modules.

La Grande Référence : https://wiki.debian.org/DebianInstaller/Preseed/EditIso

sudo -sE # Garde le shell de l'utilisateur et l'historique dans le home de l'utilisateur
mkdir /tmp/edit-iso
7z x -o/tmp/edit-iso mini.iso 
cd /tmp/edit-iso

Il y a deux fichiers importants:

-rw-------  1 root     root      6840768 Mar 17 16:40  linux
-rw-------  1 root     root     29955944 Mar 23 09:42  initrd.gz

linux = le kernel initrd = installateur de debian

On télécharge le preseed, on décompresse initrd (installateur), puis on injecte le preseed dans l'installateur. Et on recompresse le tout. On peut bien sûr modifier le preseed.

wget https://gitlab.domainepublic.net/Neutrinet/ketupa/build-images/-/raw/main/images/http/preseed-debian-11.cfg -Opreseed.cfg
gzip -d initrd.gz
echo preseed.cfg | cpio -H newc -o -A -F initrd
gzip -9 initrd

Add non-free firmware binary blobs if needed (cdimages.debian.org est down juste la maintenant…)

Quand il n'est pas down: https://cdimage.debian.org/images/unofficial/non-free/firmware/stable/current/firmware.cpio.gz

wget https://ftp.free.org/mirrors/cdimage.debian.org/cdimage-unofficial/non-free/firmware/stable/current/firmware.cpio.gz

mv initrd.gz initrd.gz.orig
cat initrd.gz.orig firmware.cpio.gz > initrd.gz
rm initrd.gz.orig firmware.cpio.gz

Ensuite on installe les paquets isolinux / syslinux / xorriso (selon les distributions) et puis on fait la commande barbare ci-dessous.

La grande difficulté est de faire une iso qui soit compatible BIOS et UEFI. Il faut trouver la bonne ligne de commande…

En fonction des distributions, le fichier isohdpfx se trouve : - OpenSUSE : /usr/share/syslinux/isohdpfx.bin - Archlinux : /usr/lib/syslinux/bios/isohdpfx.bin - debian : /usr/lib/ISOLINUX/isohdpfx.bin

Pour le trouver, on peut faire:

find /usr -name "*isohdpfx*"
xorriso -as mkisofs \
   -r -V 'Debian 11 mini' \
   -o /tmp/preseed-debian-11-mini.iso \
   -J -J -joliet-long -cache-inodes \
   -isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin \
   -b isolinux.bin \
   -c boot.cat \
   -boot-load-size 4 -boot-info-table -no-emul-boot \
   -eltorito-alt-boot \
   -e boot/grub/efi.img \
   -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus \
    /tmp/edit-iso

Ensuite on peut créer une VM dans Virtualbox pour tester cette nouvelle iso.

Bon ici les repos debian sont cassés, donc on va devoir trouver un mirroir.

https://unix.stackexchange.com/questions/216348/debian-disabling-use-mirror-on-preseed-cfg ?

On a plusieurs choix pour l'install : - kexec

  1. ssh et full install
  2. automatiser l'install (wget, ptr)

- preseed (hgo, celo) - standard

NB : par rapport au pressed de ketupa, on a enlevé la rubrique partitionnement pour l'installa sur noms machines proxmox, et on a aussi enlevé l'adresse qui suit http dans d-i mirror/http/proxy string http://192.168.30.31:3142

Kexec

https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/debian-installer/amd64/ linux et initrd.gz wget https://ftp.free.org/mirrors/cdimage.debian.org/cdimage-unofficial/non-free/firmware/stable/current/firmware.cpio.gz

d-i netcfg/choose_interface select {interface}
d-i netcfg/disable_dhcp boolean true
d-i netcfg/get_ipaddress string {address}
d-i netcfg/get_netmask string {netmask}
d-i netcfg/get_gateway string {gateway}
d-i netcfg/get_nameservers string {nameservers}
d-i netcfg/confirm_static boolean true 
kexec --command-line="vga=788" --initrd=initrd.gz linux

https://github.com/Tharyrok/kexec-remote-debian-install

IP des gens

172.16.3.201/22 fdf7:90ec:3825:8456::1/128 → celo 172.16.3.202/22 fdf7:90ec:3825:8456::2/128 → hgo 172.16.3.203/22 fdf7:90ec:3825:8456::3/128 → ptr proxmox-03 172.16.3.204/22 fdf7:90ec:3825:8456::4/128 → wget

172.16.3.254/22 → gateway/dns

Une fois debian installé, on va modifier /etc/hostname et /etc/hosts pour y mettre les hosts proxmox-0X, et dans le second fichier, on va aussi enlever l'IPv4 et mettre les IPv6 à la place. Dans /etc/hosts, on va aussi mettre les adresses IPv6 des autres serveurs proxmox du futur cluster.

On modifie ensuite /etc/network/interface

# The loopback network interface
auto lo
iface lo inet loopback
	address fdf7:90ec:3825:8456::X/128

En faisant ça, on va router les IPs qu'on vient de s'assigner avec le lien local IPv6. L'avantage, c'est que si la configuration réseau change (on enlève une interface…), on garde toujours le lien réseau.

C'est ce qui nous a permis chez Neutrinet de créer un nouveau réseau pour CEPH facilement.

Un autre avantage est aussi si on relie des serveurs, on doit en principe passer pour du broadcast, ici, en mode routage, on envoie uniquement l'informations aux différents serveurs. De ce fait, on n'est pas obligé de faire du boadcast… ce qui permet de préserver la bande passante ! On tire alors le maximum de nos liens réseau.

Pour installer ifupdown2 il faut avoir toutes les intefaces en mode auto et pas hotplug dans le /etc/network/interface et faire dans un screen :

apt install ifupdown2 && ifreload -a

Ne pas oublier de faire le reload des interfaces… sinon ça s'installe et plus de réseau… On n'a pas toujours un datacenter à 5m de chez soi, donc il vaut mieux ne pas oublier 😛

Installation proxmox

https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_11_Bullseye

On doit installer wget et ca-certificates qui ne sont pas présent après l'installation avec la mini.iso. (on a vérifié, wget est bien installé, il a deux bières en main)

Pourquoi installe-t-on depuis Debian ?

L'ISO de proxmox force un certain partionnement avec LVM. Avec Debian, on peut faire un partitionnement spécifique.

On va ajouter la configuration du switch virtuel dans /etc/network/interface :

auto XXXXX
iface XXXXX inet static

auto vmbr0
iface vmbr0 inet6 auto
iface vmbr0 inet static
    address 172.16.3.20X/22
    gateway 172.16.3.254
    bridge-ports XXXXXX
	bridge-stp off
	bridge-fd 0

On ajoute ensuite l'image ISO qu'on a créé tout à l'heure dans le storage local du node proxmox

Installation pfsense

Premiere VM

System

Disk

CPU

Memory

Ràs

Network

Options

Hardware

On a ajouté une seconde interface à nos serveur (branchement d'un second câble à notre seconde interface, connectée à un switch).

On doit vérifier qu'on a le auto <interface> sur chacune de nos interface réseau. Ensuite, on prend l'IPv6 en fe80::... de la deuxième interface réseau.

On ajoute dans le fichier /etc/network/interfaces :


auto lo
iface lo inet loopback
	address fdf7:90ec:3825:8456::X/128
    post-up ip route add fdf7:90ec:3825:8456::1 via fe80::d6be:d9ff:fec5:2704 dev XXXX
    post-up ip route add fdf7:90ec:3825:8456::2 via fe80::eb6:d2ff:feb2:bd0d dev XXXX
    post-up ip route add fdf7:90ec:3825:8456::3 via fe80::3ed9:2bff:fe4d:2bbf dev XXXX
    post-up ip route add fdf7:90ec:3825:8456::4 via fe80::6e4b:90ff:fe1f:db6c dev XXXX
    pre-down ip route add fdf7:90ec:3825:8456::1 via fe80::d6be:d9ff:fec5:2704 dev XXXX
    pre-down ip route add fdf7:90ec:3825:8456::2 via fe80::eb6:d2ff:feb2:bd0d dev XXXX
    pre-down ip route add fdf7:90ec:3825:8456::3 via fe80::3ed9:2bff:fe4d:2bbf dev XXXX
    pre-down ip route add fdf7:90ec:3825:8456::4 via fe80::6e4b:90ff:fe1f:db6c dev XXXX

auto XXXXX
iface XXXX inet manual

On est allé chercher les adresses fe80::… qui sont sur nos nouvelles interfaces réseau sur chacun des serveurs en faisant un ip a.

On retire la ligne qui correspond à notre IP, parce qu'on va passer par l'interface l0 pour nous.

Puis ifreload -a

Quand on fait un ip -6 r s on doit voir par exemple:

...
fdf7:90ec:3825:8456::1 via fe80::d6be:d9ff:fec5:2704 dev enp4s6 metric 1024 pref medium
fdf7:90ec:3825:8456::2 dev lo proto kernel metric 256 pref medium
fdf7:90ec:3825:8456::3 via fe80::3ed9:2bff:fe4d:2bbf dev enp4s6 metric 1024 pref medium
fdf7:90ec:3825:8456::4 via fe80::6e4b:90ff:fe1f:db6c dev enp4s6 metric 1024 pref medium

Et on vérifie avec un ping sur chacun des proxmox-0x

Quand tout est ok et que tout le monde parvient à communiquer, on va pouvoir créer le cluster :

https://pve.proxmox.com/wiki/Cluster_Manager

Pour initier le cluster, une personne utilise cette commande :

pvecm create {name_cluster}

Ensuite les autres personnes doivent s'ajouter au cluster. Ici, on met proxmox-01 car c'est cette machine qui a créé le cluster.

Pour pouvoir rejoindre le cluster, les machines virtuelles des proxmox qui rejoignent le cluster doivent être éteintes.

pvecm add proxmox-01 -force

Oups, les personnes qui ont rejoint le cluster ont perdu leurs VM… Donc en prod, on commence en principe toujours par faire le cluster avant de mettre des machines.

Sabotage du cluster brocoli.

Ici, pour récupérer des VM, on va copier la config dans /etc/pve/node/qmu-server/ID… de proxmox-01 dans notre propre machine dans /etc/pve/node/qmu-server/notre-propre-ID :

cp proxmox-01/qemu-server/100.conf proxmox-04/qemu-server/400.conf

On peut changer les détails (noms de machine, identifiants, etc…).

Puis changer les interfaces.

Pour éviter ça, il faudrait copier tout ce qu'il ya dans /etc/pve/qemu-server AVANT de rejoindre le cluster. Mais ça c'est seulement les configs, il faudrait copier les disques virtuels aussi.

Sinon, le mieux, si on peut se permettre d'éteindre les VM, c'est de les backuper et les restaurer.

Mais il faut aussi que les ID des machines soient différents et que le stockage de backup ait un même nom.

Installation ceph

Actuellement, pour bouger une VM d'un noeud du cluster à l'autre, on doit copier le stockage. Si on installe CEPH et qu'on fait un stockage partagé, on n'a ensuite que la RAM qui doit être copiée, car le stockage de la machine est partagé entre les différents serveurs.

Une première chose à faire est de wiper le disque ou va être installé CEPH :

lsblk -fs
wipefs -a /dev/XXXXX

Puis on installe CEPH. https://pve.proxmox.com/pve-docs/chapter-pveceph.html

On peut d'abord supprimer le dépot de proxmox enterprise qui a été ajouté par défaut :

rm /etc/apt/sources.list.d/pve-enterprise.list
pveceph install

On initialise le cluster ceph sur une (!) des machines dans le cluster

pveceph init --network fdf7:90ec:3825:8456::/64

sur chacune des machines proxmox dans le cluster

pveceph mon create
pveceph mgr create

On rajoute les OSD, une unité de stockage dans CEPH.

pveceph osd create /dev/sdX

Il faut que les horloges soient toutes à l'heure, sinon ceph va râler. Du coup on installe :

apt install systemd-timesyncd

Pourquoi pas ntpd ? Parce que systemd-timesyncd est juste un client, il n'y a pas la partie serveur.

de nouveau sur une seule des hosts dans le cluster :

pveceph pool create XXXXX --add_storages

Avec cette commande pool, CEPH réorganise le stockage en fonction des unités OSD crées plus haut.

On a un warning qui dit que proxmox a fait des placements de groupes / produits trop grand (128 alors que CEPH les préfère en 32):

1 pools have too many placement groups

Pool padata has 128 placement groups, should have 32

Les placement de groupes sont des sous-blocs qui permettrent de régir le fait qu'on duplique une donnée ou non, qu'on change une donnée ou pas. C'est une algorithme qui gère dans quel node vont se retrouver les données. Il y a une formule pour calculer ce chiffre, mais ici OSEF (Ô CEPH, aide-nous).

Il y a une petite commande qui permet de passer en mode automatique:

ceph osd pool set XXXXX pg_autoscale_mode on

https://docs.ceph.com/en/latest/rados/operations/placement-groups/

Et maintenant, on va déplacer une VM pendant qu'elle tourne du disque local vers le disque padata (ceph): - Dans la partie hardware de la VM, on clique sur le disk, puis en haut dans le menu “disk actions” on choisit move

Prochaine réunion

Prochain Neutriton (config keycloak) : 11/06, à confirmer lors de la réunion hub-infra

Prochaine réunion hub-infra : 29/05 à 14h, Caldarium / Jitsi

⚠ Relire les notes du PV de la dernière réunion hub-infra et décider de la méthode de chiffrement https://wiki.neutrinet.be/fr/rapports/2022/01-09

Météo de fin

Moment informel durant lequel on exprime en peu de mots comment, à titre personnel, la réunion a été vécue que ce soit positif ou négatif. Si une ou plusieurs tension est née durant la réunion, il est peut-être nécessaire d'envisager l'une ou l'autre réunion pour y remédier.