Proxmox
Présentation
ProxmoxVE : Proxmox Virtual Environment
Hyperviseur "Bare-metal". Ses concurrents sont VMWare, HyperV, Citrix. Son OS est Debian et les outils de virtualisation incluent KVM, LXC, Apache... des élements indépendants qui sont assemblés dans Proxmox. Tout ça est distribué en licence libre et gratuite. Le développement est actif, les premières version datent de 2008, environ trois versions par an (et une version majeure tous les deux ans). Il est simple à installer, comme tout Linux. L'interface de gestion se fait par le web (d'où Apache). La configuration inclue la création de clusters, les interfaces peuvent être mises en pont ou en bond, interfaces virtuelles... L'espace de stockage peut être partage réseau, NAS, SAN... On peut créer les utilisateurs dans les interfaces ou utiilser des annuaires (la gestion des utilisateurs est assez fine!). On peut virtualiser avec KVM ou des conteneur LXC, plus performants. Les templates LXC sont à télécharger une fois par hyperviseur. La migration de machines virtuelle entre hyperviseurs peut se faire à chaud si l'espace de stockage est en réseau; si l'espace de stockage est local il faut d'abord migrer le disque dur virtuel avant de migrer la machine en elle-même.
La haute disponibilité est également là : on peut faire des clusters redondants.
Concernant les utilisateurs, on peut créer des VM que l'on va catégoriser, pour par la suite avoir des utilisateurs qui auront différents droits sur ces VMs (éteindre/allumer, dupliquer, supprimer...).
http://pve.proxmox.com/wiki/
ProxmoxVE sur youtube.
WebUI
Pour y accéder : https://@ip:8006 (pas http !)
On peut faire beaucoup de choses en CLI avec Proxmox, mais on utilise généralement l'interface web.
On a le datacenter sur la gauche (datacenter = cluster de machines reliées entre elles). Chaque serveur contient des VMs et des conteneurs. En cliquant sur une VM, j'ai des éléments sur celle-ci à droite. J'ai quelque options dans la barre supérieure (notamment créer des VMs et des conteneurs) et des logs dans la partie basse de l'affichage.
Menu "Datacenter" (cluster)
Summary
La partie sommaire contient des infos sur la santé du cluster, si le quorum est atteint (les noeuds sont allumés/synchronisés), les invités (VMs / conteneurs) fonctionnent-ils, etc. Un résumé des ressources utilisées.
Storage
La partie stockage : je lique sur datacenter > storage. La partie stockage se déclare au niveau datacenter et pas dans chacun des noeuds. On peut avoir dans la partie "ID" deux types de stockages : local ou network. Le type de stockage que l'on va faire est aussi affiché : dans "content", on peut avoir "VZDump backup file (une backup de la VM), Disk Image (Image de disque dur), ISO image, conteneur, container template... En gros je vois ce que contient chacun de mes stockages, que ce soit en local ou distant. En cliquant sur un espace de stockage, on peut changer ce qu'il a le droit de stocker.
Backups
Proxmox peut sauvegarder automatiquement les VMs/conteneurs. Les backups s'appuieront sur les espaces de stockage déclarés comme pouvant acceuillir des backup. Je vais dans backups et je vois les backups activées, avec les périodes, avec la selection dont les numéros correspondent aux VMs (100 peut être une VM, 101 une autre...).
On peut créer une backup en cliquant sur "add". Je choisis l'espace de stockage, la période, et le mode de sélection : toutes les VMs, certaines VMs... On peut lui dire d'envoyer un email à la fin du backup, ou seulement en cas de problème.
On peut faire des backups à la main : Je vais sur la VM à sauver et je vais dans son option backup et je clique sur "backup now". Il est ensuite assez facile de restaurer les VMs, ça garde le disque dur et la configuration.
Stockages et templates
Téléchargement des templates
Dans Datacenter>Storage, je vois les unités de stockage. Chacune d'entre elle peut contenir des templates de conteneurs. Il est bien sûr plus intéressant de mettre les templates sur les stockages partagés. On peut voir le contenu de chaque zone de stockage; en cliquant sur templates, mon Proxmox va se connecter pour aller voir quels templates sont disponibles. Par exemple, turnkey propose des wordpress, etc. Il suffit ensuite de cliquer sur "Create CT" pour ajouter un conteneur.
Ajouter un espace de stockage
Pour ajouter des espaces de stockage, cela se passe au niveau du datacenter : il suffit d'aller dans storage > add. On peut ensuite choisir quelque chose (un partage NFS sur un NAS...) et il faut ensuite donner un nom cohérent, indiquer l'IP, etc. Il faut ensuite choisir le type de contenus que peut recevoir cet espace de stockages.
Créer une machine de type conteneur LXC
On clique sur Create CT, on ajoute un nom, un mot de passe (l'ID généré est unqiue), et dans l'onglet template je choisis mon template. On peut ensuite choisir les ressources physiques, le nom de l'interface, etc... On lui donne aussi une adresse IPv4 en CIDR, la passerelle, le DNS... On a ensuite un retour par rapport à la création de la machine virtuelle. Les conteneurs LXC ont l'air plus proches d'une VM que ne peuvent l'être les conteneurs Dockers (même si ça reste du LXC... Bizarre). On peut aussi les migrer directement vers un autre noeud du cluster.
Additionnel : Ajouter un disque
https://www.hostfav.com/blog/index.php/2017/02/01/add-a-new-physical-hard-drive-to-proxmox-ve-4x-5x/
Réseau
https://pve.proxmox.com/wiki/Network_Configuration
La configuration du réseau peut se faire soit via la GUI, soit par le fichier interfaces. Une fois la configuration faite, on peut utiliser les commandes traditionnelles comme ifup, etc. Bien que les outils Proxmox essayent de tenir compte des modifications faites sur les fichiers, il est préférable de passer par la GUI.
Les conventions de nommages sont les suivantes :
- eno0, eno1 : Cartes réseaux Ethernet, depuis Proxmox 5.0
- eth0, eth1... : idem avant Proxmox 5.0
- Bridges : vmbr0, vmbr1...
- Bonds : bond0, bond1...
- VLANS : On ajoute simplement le numéro du VLAN à l'interface en question, avec un point : en1.50, bond3.70...
Attention, SystemD ne se contente pas de nommer les cartes réseaux avec des numéros, il nous fait des choses comme enp0s3...
Choisir une configuration réseau
Bridged
https://pve.proxmox.com/pve-docs/images/default-network-setup-bridge.svg
Utile si le serveur Proxmox est derrière un NAT, ou dans certains autres cas particuliers. C'est équivalent à avoir nos VMs branchées directement sur un switch, qui serait lui-même directement branché sur notre routeur (la Freebox, quoi...). Par défaut, le programme crée un seul bridge nommé vmbr0, connecté à la première carte Ethernet.
La conf par défaut ressemble à ça : <source> auto lo iface lo inet loopback
iface eno1 inet manual
auto vmbr0 iface vmbr0 inet static
address 192.168.10.2 netmask 255.255.255.0 gateway 192.168.10.1 bridge_ports eno1 bridge_stp off bridge_fd 0
</source>
Routed
https://pve.proxmox.com/pve-docs/images/default-network-setup-routed.svg
La configuration "routed" est utile quand le Proxmox est directement chez un hébergeur (qui pour la plupart n'aiment pas voir plusieurs adresses MAC sortir d'une seule interface), direct sur le WAN. Du coup, on va faire la NAT directement dans le Proxmox.
Ici, on une IP publique (198.51.100.5) et un bloc IP pour nos VMs (203.0.113.16/29). La configuration recommandée est la suivante : <source> auto lo iface lo inet loopback
auto eno1 iface eno1 inet static
address 198.51.100.5 netmask 255.255.255.0 gateway 198.51.100.1 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp
auto vmbr0 iface vmbr0 inet static
address 203.0.113.17 netmask 255.255.255.248 bridge_ports none bridge_stp off bridge_fd 0
</source>
Du NAT avec iptables
Dans le cas du NAT (si nos hôtes ont des adresses privées, donc), on va devoir faire du NAT avec iptables, soit du Masquerading ! Un exemple ! <source> auto lo iface lo inet loopback
auto eno1
- real IP address
iface eno1 inet static
address 198.51.100.5 netmask 255.255.255.0 gateway 198.51.100.1
auto vmbr0
- private sub network
iface vmbr0 inet static
address 10.10.10.1 netmask 255.255.255.0 bridge_ports none bridge_stp off bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
</source>
Bonds
Le bond, ou aggrégation, permet d'assembler entre elles des interfaces pour qu'elles soient vues comme une seule. On peut faire de la HA, de la QoS, ou les deux. On a 7 mode de bonding différents :
- Round-Robin (balance-rr) : chacun son tour, les cartes traitent les paquets
- Active-Backup (active-backup) : Seule une NIC slave est active; une autre slave ne s'active que si la première échoue. L'adresse MAC visible reste la même.
- XOR (balance-xor): On transmet les paquets selon : @MAC src XOR @MAC dst MODULO NIC slave count. Ainsi, on a la même NIC pour chaque @mac dst.
- Broadcast (broadcast) : On balance sur toutes les interfaces disponibles.
- IEEE 802.3ad Dynamic link aggregation (802.3ad)(LACP): Creates aggregation groups that share the same speed and duplex settings. Utilizes all slave network interfaces in the active aggregator group according to the 802.3ad specification.
- Adaptive transmit load balancing (balance-tlb): Linux bonding driver mode that does not require any special network-switch support. The outgoing network packet traffic is distributed according to the current load (computed relative to the speed) on each network interface slave. Incoming traffic is received by one currently designated slave network interface. If this receiving slave fails, another slave takes over the MAC address of the failed receiving slave.
- Adaptive load balancing (balance-alb): Includes balance-tlb plus receive load balancing (rlb) for IPV4 traffic, and does not require any special network switch support. The receive load balancing is achieved by ARP negotiation. The bonding driver intercepts the ARP Replies sent by the local system on their way out and overwrites the source hardware address with the unique hardware address of one of the NIC slaves in the single logical bonded interface such that different network-peers use different MAC addresses for their network packet traffic.
Si le switch support LACP (IEEE 802.3ad), il est recommandé d'utiliser le mode de bonding correspondant (802.3ad). Sinon, active-backup devrait être utilisé, en général. Si on met le cluster sur les interfaces en bonding, il faut utiliser le mode actif-passif sur les interfaces en bond. Les autres modes ne sont pas supportés.
EXEMPLES
Avec une IP fixe : <source> auto lo iface lo inet loopback
iface eno1 inet manual
iface eno2 inet manual
auto bond0 iface bond0 inet static
slaves eno1 eno2 address 192.168.1.2 netmask 255.255.255.0 bond_miimon 100 bond_mode 802.3ad bond_xmit_hash_policy layer2+3
auto vmbr0 iface vmbr0 inet static
address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.1 bridge_ports eno1 bridge_stp off bridge_fd 0
</source>
En utilisant le bond en tant que port de bridge:
https://pve.proxmox.com/pve-docs/images/default-network-setup-bond.svg <source> auto lo iface lo inet loopback
iface eno1 inet manual
iface eno2 inet manual
auto bond0 iface bond0 inet manual
slaves eno1 eno2 bond_miimon 100 bond_mode 802.3ad bond_xmit_hash_policy layer2+3
auto vmbr0 iface vmbr0 inet static
address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.1 bridge_ports bond0 bridge_stp off bridge_fd 0
</source>
VLANs
Des VLANs pour les réseaux des guests :
Proxmox supporte cette fonctionnalité d'emblée. On peut spécifier le tag voulu à la création de la VM, il fait partie de la configuration du guest. On a plusieurs modes d'implémentations des VLANs, en fonction de la configuration du bridge :
- VLAN awareness on the Linux bridge: In this case, each guest’s virtual network card is assigned to a VLAN tag, which is transparently supported by the Linux bridge. Trunk mode is also possible, but that makes the configuration in the guest necessary.
- "traditional" VLAN on the Linux bridge: In contrast to the VLAN awareness method, this method is not transparent and creates a VLAN device with associated bridge for each VLAN. That is, if e.g. in our default network, a guest VLAN 5 is used to create eno1.5 and vmbr0v5, which remains until rebooting.
- Open vSwitch VLAN: This mode uses the OVS VLAN feature.
- Guest configured VLAN: VLANs are assigned inside the guest. In this case, the setup is completely done inside the guest and can not be influenced from the outside. The benefit is that you can use more than one VLAN on a single virtual NIC.
VLAN sur l'hôte :
To allow host communication with an isolated network. It is possible to apply VLAN tags to any network device (NIC, Bond, Bridge). In general, you should configure the VLAN on the interface with the least abstraction layers between itself and the physical NIC.
For example, in a default configuration where you want to place the host management address on a separate VLAN.
Example: Use VLAN 5 for the Proxmox VE management IP with traditional Linux bridge
<source>
auto lo
iface lo inet loopback
iface eno1 inet manual
iface eno1.5 inet manual
auto vmbr0v5 iface vmbr0v5 inet static
address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.1 bridge_ports eno1.5 bridge_stp off bridge_fd 0
auto vmbr0 iface vmbr0 inet manual
bridge_ports eno1 bridge_stp off bridge_fd 0
</source>
Example: Use VLAN 5 for the Proxmox VE management IP with VLAN aware Linux bridge <source> auto lo iface lo inet loopback
iface eno1 inet manual
auto vmbr0.5 iface vmbr0.5 inet static
address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.1
auto vmbr0 iface vmbr0 inet manual
bridge_ports eno1 bridge_stp off bridge_fd 0 bridge_vlan_aware yes
</source> The next example is the same setup but a bond is used to make this network fail-safe. Example: Use VLAN 5 with bond0 for the Proxmox VE management IP with traditional Linux bridge auto lo iface lo inet loopback
iface eno1 inet manual
iface eno2 inet manual
auto bond0 iface bond0 inet manual
slaves eno1 eno2 bond_miimon 100 bond_mode 802.3ad bond_xmit_hash_policy layer2+3
iface bond0.5 inet manual
auto vmbr0v5 iface vmbr0v5 inet static
address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.1 bridge_ports bond0.5 bridge_stp off bridge_fd 0
auto vmbr0 iface vmbr0 inet manual
bridge_ports bond0 bridge_stp off bridge_fd 0
</source>
Exemple issu de mon serveur
La situation est la suivante:
Le proxmox est hébergé sur un VPS et ne dipose que d'une seule IP. On aussi un OPNSense qui a un pied vers l'extérieur (vmbr0) et un autre dans le LAN (vmbr1). Les VMs, elles, sont dans le LAN. On veut pouvoir exploiter facilement notre infra sans s'embêter à faire plein de port-forward; du coup, tout ce qui arrive sur le proxmox et n'est pas destiné à l'un de ses ports à lui est renvoyé vers OPNSense (192.168.1.253). Ainsi, je pourrait faire mes port forward vers mes VM directement dans OPNSense. Le fichier de conf est le suivant :
<source> source /etc/network/interfaces.d/*
auto lo iface lo inet loopback
iface lo inet6 loopback
- Cette partie est générée d'office par Hertnzer, l'hébergeur
auto enp4s0 iface enp4s0 inet static
address 1.2.3.4/26 gateway 1.2.3.1 up route add -net 1.2.3.5 netmask 255.255.255.192 gw 1.2.3.1 dev enp4s0
- route 1.2.3.0/26 via xxxx
iface enp4s0 inet6 static
address <ipv6>/64 gateway fe80::1
auto vmbr0 iface vmbr0 inet static
address 192.168.1.254/24 bridge-ports none bridge-stp off bridge-fd 0
- WAN!
post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '192.168.1.254/24' -o enp4s0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.1.254/24' -o enp4s0 -j MASQUERADE
auto vmbr1 iface vmbr1 inet static
address 10.255.255.254/8 bridge-ports none bridge-stp off bridge-fd 0
- LAN
post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -i enp4s0 -t nat -A PREROUTING -p tcp -m multiport --dports 10:21 -j DNAT --to 192.168.1.253 post-up iptables -i enp4s0 -t nat -A PREROUTING -p tcp -m multiport --dports 23:110 -j DNAT --to 192.168.1.253 post-up iptables -i enp4s0 -t nat -A PREROUTING -p tcp -m multiport --dports 112:3127 -j DNAT --to 192.168.1.253 post-up iptables -i enp4s0 -t nat -A PREROUTING -p tcp -m multiport --dports 3129:8005 -j DNAT --to 192.168.1.253 post-up iptables -i enp4s0 -t nat -A PREROUTING -p tcp -m multiport --dports 8007:65535 -j DNAT --to 192.168.1.253 </source>
Backups et Restore
Même si l'entreprise Proxmox propose un utilitaire de Backup Dédié à installer, Proxmox Virtual Environment a tout ce qu'il faut pour backuper ses machines (tout intégré directement dedans, hein VMWare ? :) ). Les machines sont "snapshottées", compressées et gardées dans un dossier (local en l'occurence, je n'ai pas de stockage en réseau sur mon proxmox).
Backup
Tout se fait via l'interface (des utilitaires en ligne de commande existent aussi). On sec connecte, on clique sur le datacenter, onglet Backup, Add:
Ensuite, c'est assez explicite : on choisit le node (je n'en ai qu'un donc c'est grisé), le stockage, le ou les jours de la semaine, l'heure, le mode de sélection (on peut choisir tout, ou exclure certaines VMs...), éventuellement un email de notification, etc:
Et c'est tout. C'est limité à de la backup full, donc plutôt pour de petites infra, bien sûr. Mais cela fonctionne pour les VMs comme pour les conteneurs.
Le tout est stocké dans /var/lib/vz/dump (quand on choisit le stockage local en tout cas).
Effacer les vieilles backups, backups hors site
Pour cela, il suffit d'une bête crontab :
<source> 0 6 * * * /usr/bin/find /var/lib/vz/dump/ -type f -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1 </source>
Ici, je supprime toutes les backups de plus de 30 jours (mtime +30). De la même façon, pour avoir des backups hors site, un simple rsync en crontab suffit. Par exemple, sur une storage box dans le cloud:
<source> 30 6 * * * /usr/bin/rsync -az -e "ssh -p 23" /var/lib/vz/dump/ user@storage.domain.tld: > /dev/null 2>&1 </source>
Les backups sont générées sous la forme d'un fichier .tar.zst (si on sauvegarde en zst bien sûr), accompagnée chacune de leur fichier de log :
<source> root@pve /var/lib/vz/dump # ls -halt total 156G drwxr-xr-x 2 root root 36K Apr 4 00:16 . -rw-r--r-- 1 root root 1001M Apr 4 00:14 vzdump-lxc-103-2021_03_08-01_30_04.tar.zst -rw-r--r-- 1 root root 1.4K Mar 29 02:35 vzdump-lxc-113-2021_03_29-02_32_31.log -rw-r--r-- 1 root root 1.2G Mar 29 02:35 vzdump-lxc-113-2021_03_29-02_32_31.tar.zst -rw-r--r-- 1 root root 1.4K Mar 29 02:32 vzdump-lxc-112-2021_03_29-02_28_20.log [...] </source>
Les fichiers de log sont là à titre d'information. Même lors d'une sauvegarde hors site, il faut garder le nom des fichiers autant que possible. Ils ont tous un nom unique.
Restauration
Les restaurations se font aussi via l'interface. On restaure vers une nouvelle machine. Pour réimporter une sauvegarde depuis l'extérieur (lors d'une migration par exemple), il suffit de la mettre dans /var/lib/vz/dump. Ensuite, je clique sur mon stockage, onglet backups. Je peux choisir le fichier en question cliquer sur Restore:
Je peux ensuite choisir dans quel stockage ira la machine restaurée, lui donner un VMID et quelques autres options en fonction de la machine :
Et voilà.
Certificats avec OVH (et autres)
Il est possible d'automatiser la création de certificats pour l'interface web de proxmox en utilisant les DNS OVH (et plein d'autres que je n'ai pas essayé). En effet, Proxmox utilise le programme de gestion de certificats appellé acme.sh.
Je vais automatiser la création de certificats pour mon interface Web avec des challenges DNS (ce qui m'évitera de passer par HTTP, qui ne fonctionnera pas à cause de mes port-forward de toute façon).
Je commence par récupérer des codes pour l'API OVH : voir Certbot.
Ensuite, je me rends au niveau du datacenter et je créée un challenge dans la section ACME:
Je lui donne:
- Un ID (soit un nom sans points ni espaces)
- Je choisis l'API DNS OVH
- Je lui donne ensuite mes codes récupérés chez OVH.
Puis "ADD". Je me rends ensuite au niveau de mon serveur Proxmox, puis dans system > certificates. Sous la section ACME, je clique sur "ADD" pour ajouter un nouveau certificat.
- Challenge Type : DNS
- Plugin : je choisis l'ID précedemment créé
- Domain : le nom de domaine de mon serveur.
...puis "CREATE". Enfin, je clique sur "Order certificates now" pour récupérer mes nouveaux certifs, et enfin un refresh de la page. C'est bon !