Déployez vos machines virtuelles KVM sur Proxmox VE avec Cloud-Init
Après un premier article expliquant comment configurer l'interface réseau d'une machine virtuelle KVM sur Proxmox VE en utilisant qemu-nbd, il était nécessaire d'y ajouter une seconde partie pour détailler l'une des nouvelles fonctionnalités de Proxmox : le support de Cloud-Init (depuis la release 5.1). Dans ce tutoriel nous allons voir comment déployer et configurer une machine virtuelle KVM avec Cloud-init.
Qu'est ce que Cloud-init ?
Commençons par une présentation de Cloud-Init. Il s'agit d'une application (ou package en anglais) multi-plateforme dont la fonction est de réaliser la configuration initiale des machines virtuelles (ou instances public cloud) déployées depuis des templates.
Les tâches généralement réalisées par Cloud-Init sont :
- Définir le hostname
- Générer les clés privées SSH
- Configurer les interfaces réseaux
- Définir le mot de passe de l'utilisateur
- Ajouter une clé SSH
- Redimensionner le(s) disque(s) (si nécessaire)
- Mettre à jour les paquets via APT
Dans le cas de Proxmox, Cloud-Init permet de configurer les machines virtuelles KVM aussi facilement que le containers LXC. Il n'est plus nécessaire de se connecter via la console NoVNC pour configurer une machine virtuelle.
Cloud-Init est d'autant plus pratique lorsqu'il s'agit de déployer une machine virtuelle nécessitant une configuration réseau particulière (comme une passerelle par défaut qui n'est pas dans le même sous-réseau que la machine virtuelle chez OVH).
Déployer une machine virtuelle KVM avec Cloud-Init
Créer un template de machine virtuelle
La première étape avant de pouvoir déployer notre première machine virtuelle avec Cloud-Init est la création d'un template de VM, qui pourra être cloné pour déployer une nouvelle VM.
À l'heure actuelle, il est déjà possible d'ajouter un disque Cloud-Init à une machine virtuelle depuis l'interface web de Proxmox, cependant l'import d'une image disque nécessite toujours l'utilisation de la CLI de Proxmox.
Pour nous faire gagner du temps, Canonical met à disposition des images minimales de machines virtuelles sur le site cloud-images.ubuntu.com. Cloud-Init est préinstallé sur l'ensemble de ces images permettant un déploiement automatisé.
Ubuntu n'est pas la seule distribution linux à proposer des images cloud, vous pouvez également télécharger des images Debian ou Centos.
Dans notre exemple, nous allons utiliser l'image Ubuntu Server 18.04 LTS Bionic.
Il est tout à fait possible d'installer une distribution linux depuis un ISO avant d'installer Cloud-Init pour en faire un template. Il est cependant important de noter que le redimensionnement automatique de la partition root n'est possible qu'en l'absence de partition swap (pratique courante sur les instances public cloud)
On se connecte donc en SSH à notre hôte Proxmox VE, et on commence par télécharger l'image Ubuntu Server 18.04 LTS :
wget -O bionic.img \
http://cloud-images.ubuntu.com/daily/server/bionic/current/bionic-server-cloudimg-amd64.img
Pour simplifier l'étape suivante, nous allons définir l'ID de notre VM Proxmox via une variable. Notre espace de stockage se nomme ici local
, mais il généralement nommé local-lvm
lorsque Proxmox est installé depuis un ISO.
# on définit l'ID de la VM
ID_VM=1804
# Créer une VM avec 2GB de RAM + une interface réseau connectée au bridge vmbr0
qm create ${ID_VM} --memory 2048 --net0 virtio,bridge=vmbr0
# on importe l'image de VM précédemment téléchargée
qm importdisk ${ID_VM} bionic.img local
# on associe le nouveau disque virtuel à la machine
qm set ${ID_VM} --scsihw virtio-scsi-pci --scsi0 local:${ID_VM}/vm-${ID_VM}-disk-0.raw
Nous avons ainsi créé notre VM puis importé l'image disque téléchargée depuis cloud-images.ubuntu.com. Il ne nous reste plus qu'à configurer Cloud-Init. Pour cela nous allons ajouter un lecteur Cloud-Init qui permettra la configuration de la VM depuis Proxmox.
# ajouter un disque cloudinit
qm set ${ID_VM} --ide2 local:cloudinit
# définir sur quel disque la VM doit booter
qm set ${ID_VM} --boot c --bootdisk scsi0
# ajout d'une interface vga connectée au serial
qm set ${ID_VM} --serial0 socket --vga serial0
Voilà, notre VM est prête, on peut enfin la transformer en template avec la commande :
# transformer la VM en template
qm template ${ID_VM}
Configurer une VM avec Cloud-Init
La configuration d'une VM avec Cloud-Init peut se faire via la CLI de Proxmox ou via l'interface web. Dans notre exemple, l'ID de notre VM est 158 et son IP est 192.168.0.201.
Configuration via l'interface web
On commence par cloner notre template afin de créer une nouvelle machine virtuelle. On peut alors se diriger vers l'onget "Hardware" de notre VM pour la redimensionner selon nos besoins (notamment le disque dont la taille est de 2.5Go par défaut) :
Efin, pour configurer notre VM via l'interface web, il suffit d'aller dans l'onglet "Cloud-Init" pour accéder à la liste des paramètres disponibles :
Parmi les paramètres disponibles, on retrouve
- l'utilisateur, qui est généralement le nom de la distribution linux choisie, autrement dit "ubuntu" dans notre cas.
- le mot de passe de l'utilisateur
- les paramètres DNS des fichier /etc/hosts et /etc/resolv.conf
- une ou plusieurs clé SSH publiques
- la configuration du l'interface réseau
On peut lorsqu'on a terminé, démarrer notre VM.
Configuration via la CLI
Via la CLI, la démarche est relativement similaire puisqu'on commence par cloner notre template de machine virtuelle :
qm clone 1000 158 --name xenial
Pour redimensionner le disque, il suffit d'utiliser :
qm resize 158 scsi0 10G
On peut alors ajouter une clé SSH pour pouvoir se connecter à la machine virtuelle, par exemple la clé publique de notre hôte Proxmox :
qm set 158 --sshkey ~/.ssh/id_rsa.pub
Et la dernière étape est la configuration de l'interface réseau qui se fait via l'argument --ipconfig[x]
où [x]
est le numéro de l'interface réseau :
qm set 158 --ipconfig0 ip=192.168.0.201/24,gw=192.168.0.1
Une fois la configuration terminée, on peut démarrer notre vm avec la commande :
qm start 158
Quelques informations complémentaires
Après quelques mois d'utilisation, j'ai eu l'occasion d'utiliser Cloud-Init dans un certain nombre de cas et j'ai parfois remarqué des points qu'il semble important de souligner.
La configuration d'IP fail-over chez OVH
J'ai longtemps cherché la solution pour configurer une IP fail-over OVH sur une VM Ubuntu 18.04 LTS qui utilise netplan pour la configuration de l'interface réseau. Je l'ai découvert un peu par hasard, et je ne comprends toujours pas pourquoi cette configuration fonctionne.
Dans mon cas, je définis l'IP de la VM dans Cloud-Init, du type 178.XX.XX.XX/32 mais au lieu de définir 54.XX.XX.254 en tant que passerelle (IP de l'hôte .254), je définis simplement l'IP de la VM en tant que passerelle.
La configuration post-déploiement
Par défaut Cloud-Init mettra à jour le fichier /etc/hosts, bloquera l'accès SSH en tant que root et mettra à jour le hostname de la machine à chaque démarrage de cette dernière.
Vous pouvez désactiver ces actions en éditant le fichier /etc/cloud/cloud.cfg.