Proxmox

De Justine's wiki
Aller à la navigation Aller à la recherche

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

  1. real IP address

iface eno1 inet static

       address  198.51.100.5
       netmask  255.255.255.0
       gateway  198.51.100.1

auto vmbr0

  1. 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

  1. 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
  1. 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
  1. 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
  1. 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 !