Installer Weave Ignite

Guide d'installation de Weave Ignite qui va vous permettre de déployer de microVMs sous Firecracker

Installer Weave Ignite
weave ignite microvm firecracker

Au sommaire :

  • 1-Qu'est-ce que Firecracker ?
  • 2-Qu'est-ce que Weave Ignite ?
  • 3-Prérequis
  • 4-Installation
  • 5-Importation des images
  • 6-Création de la microVM
  • 7-Installation et exposition d'un service

Avant de parler de Weave Ignite, il faut que je vous présente Firecracker.

1-Qu'est-ce que Firecracker ?

Présenté lors de sa conférence annuelle Re:Invent 2018, Firecracker est un gestionnaire de machines virtuelles (VMM) open-source conçu par AWS.

Il est écris en langage Rust, publié sous licence Apache 2.0 et utilisé par AWS Fargate et AWS Lambda, des services de calcul dis "serverless" (sans serveur) de type Faas (Functions As A Service).

Présentation de Firecracker, une nouvelle technologie de virtualisation et un projet open source permettant d’exécuter des charges de travail de conteneur multi-locataires

Je cite : "AWS Lambda utilise Firecracker pour le provisionnement et l'exécution de sandbox sécurisés afin d'exécuter des fonctions client. Ces sandbox sécurisés peuvent être provisionnés rapidement avec un encombrement minimal, offrant des performances sans sacrifice de sécurité. Les tâches AWS Fargate s'exécutent également sur les microVM Firecracker, permettant à la couche d'exécution Fargate de s'exécuter plus rapidement et plus efficacement sur les instances EC2 nues, sans compromettre l'isolation des tâches au niveau du noyau."

Le point faible des conteneurs, que ce soit LXC ou Docker est qu'ils sont dépendant du noyau du système hôte. Cela veut dire que si le noyau rencontre le moindre incident, c'est l'ensemble des conteneurs qui sont impactés et le fait que Docker avait besoin (plus maintenant) des accès root n'aidait en rien à sécuriser une infrastructure.

Firefracker répond à cette problématique en créant des microVM (micro machine virtuelle) basé sur l'hyperviseur KVM qui combine à la fois la rapidité et la légèreté des conteneurs (temps de démarrage de 125ms, machine virtuelle pesant quelques centaines de Mo) avec la sécurité et l'isolation des machines virtuelles (noyau dédié, /sbin/init comme PID 1).

Beyond, it's a SUN

De plus, contrairement à une machine virtuelle classique, Firecracker n'a besoin ni de BIOS, ni de périphériques PCI à gérer. Pourquoi ? Car elle a uniquement besoin du module noyau KVM pour accéder aux instructions de virtualisation du matériel, elle n'a pas besoin de QEMU pour émuler différents périphériques.

Donc sans QEMU, ces microVMs sont beaucoup plus légères et moins gourmandes en ressources.

je cite : Firecracker a un design minimaliste. Il exclut les périphériques inutiles et les fonctionnalités orientées sur les guests afin de réduire l’encombrement de la mémoire et la surface d’attaque de chaque microVM. Cela améliore la sécurité, réduit le temps de démarrage et augmente le taux d’utilisation du matériel »

firecracker/README.md at main · firecracker-microvm/firecracker
Secure and fast microVMs for serverless computing. - firecracker/README.md at main · firecracker-microvm/firecracker

Firecracker est déjà en production dans les instances Lambda et Fargate avec des millions de charges de travail et des milliards de requêtes effectués chaque mois.

Pour en savoir plus à ce sujet.

2-Qu'est-ce que Weave Ignite ?

Weave Ignite est basé sur le VMM Firecracker (vu plus haut) et a pour particularité de pouvoir faciliter la gestion des microVMs en les traitant comme des conteneurs de manière déclarative ou via des manifestes.

What the PHOQUE again ???

Vous en faites pas, j'était dans le même état que Bron James au début.

Je m'explique. Weave Ignite effectue plusieurs choses :

  • Il va d'abord initialiser les microVMs à partir d'images OCI (vous savez, ces images qu'on trouve sur Docker Hub) au lieu des traditionnels formats VMDK, VHD, QCOW2
  • Chacune de ces microVMs dispose de son propre noyau (ce que n'ont pas les conteneurs classiques)
  • Il utilise également les plugins CNI pour le réseau (Flannel, Calico, etc) ainsi que Docker-Bridge
  • Enfin, pour que le tout fonctionne, ces microVMs utilisent le runtime containerd

Si vous avez déjà manipuler des conteneurs Docker, cela ne devrait même pas vous dépayser.

Dans le schéma suivant, nous pouvons voir les différentes étapes de création d'une microVM sous Weave Ignite :

  • ignite image import : les images OCI fournissent les entrées pour le rootfs (la racine du système, /) et le noyau de la machine virtuelle.
  • ignite create : la fonction de provisionnement de devicemapper est utilisée pour le copy-on-write
  • ignite start : ignite-spawn "envoie" le réseau du conteneur à la machine virtuelle en utilisant le DHCP

Enfin, Firecracker communique avec KVM et implémente la virtualisation

Jusqu'ici, tout va bien, tout va bien.......

Pour en savoir plus.

3-Prérequis

Il vous faut soit une machine physique, soit une machine virtuelle.

Ce tutoriel est basé sur la deuxième solution. Si vous êtes sur Proxmox VE, suivez ce tutoriel concocté par mes soins.

(Proxmox VE) Création d’un template avec cloud-init
Aujourd’hui, nous allons voir comment créer un template de machine virtuelle pré-configuré avec cloud-init. Qu’est-ce que Cloud-init ? Cloud-init est un outil conçu par Canonical permettant de gérer l’initialisation d’une machine virtuelle dans le cloud. Au premier démarrage, cloud-init va : *…

De plus, il vous faut activer la virtualisation imbriquée pour créer des microVMs dans une machine virtuelle sinon vous aurez le message suivant avec Ignite.

Sur votre serveur PVE, ouvrez le terminal et créez le fichier "kvm-intel-conf".

touch /etc/modprobe.d/kvm-intel.conf

Puis ajoutez la ligne suivante au fichier.

echo "options kvm-intel nested=Y" > /etc/modprobe.d/kvm-intel.conf

Chargez le module noyau "kvm_intel".

modprobe kvm_intel

Enfin, vérifiez si le mode est activé.

cat /sys/module/kvm_intel/parameters/nested

Si ça affiche "Y", c'est que c'est activé.

Ensuite, dans les paramètres de votre machine virtuelle, allez sur "Processors" et cliquez sur "Edit".

Puis changez le type de processeur par "host".

Votre machine est prête pour l'inception.

4-Installation

Mettez à jour le système.

sudo apt update && sudo apt upgrade -y

Installez les paquets suivants :

  • apt-transport-https : transport d'APT pour télécharger par HTTPS (protocole de transfert hypertexte sécurisé).
  • ca-certificates : permet l'ajout de certificats CA.
  • curl : récupération de données à travers une URL.
  • software-properties-common : abstraction de APT. Facilite la gestion des dépôts.
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

Exportez ces variables qui vous permettront d'installer la dernière version des plugins CNI et détecter le type d'architecture.

Note : La documentation n'étant pas à jour, j'ai corriger la variable "CNI_VERSION" pour avoir la dernière en date

  • VERSION : la v1.2.0
  • GOARCH : détecter l'architecture du matériel (si processeur x64 ou ARM)
export CNI_VERSION=v1.2.0
export ARCH=$([ $(uname -m) = "x86_64" ] && echo amd64 || echo arm64)

Créez un dossier pour stocker les plugins réseaux CNI.

sudo mkdir -p /opt/cni/bin

Récupérez l'archive contenant les plugins et stockez le tout dans "/opt/cni/bin".

curl -sSL https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz | sudo tar -xz -C /opt/cni/bin

Passons à la suite en installant Weave Ignite. Exportez ces variables d'environnement :

  • VERSION : la v0.10.0
  • GOARCH : détecter l'architecture du matériel (si processeur x64 ou ARM)

Note : on est actuellement à la v0.10.0 et il n'y a plus de mise à jour depuis le 19/07/2021.

export VERSION=v0.10.0
export GOARCH=$(go env GOARCH 2>/dev/null || echo "amd64")

Enfin, tapez cette commande :

  • curl ... : la commande va récupérer le dernier binaire en date selon ce qui est indiqué dans la variable "VERSION"
  • chmod +x : rend le binaire exécutable
  • sudo mv : déplace le binaire dans /usr/local/bin

Note : je décris souvent les procédures à l'attention des néophytes. C'est important qu'ils puissent comprendre le fonctionnement de chaque commande (j'ai du apprendre tel un Ronin, un samouraï sans maître).

for binary in ignite ignited; do
    echo "Installing ${binary}..."
    curl -sfLo ${binary} https://github.com/weaveworks/ignite/releases/download/${VERSION}/${binary}-${GOARCH}
    chmod +x ${binary}
    sudo mv ${binary} /usr/local/bin
done

Pour vérifier si Weave Ignite fonctionne, vérifiez avec la commande suivante.

ignite version

Note : Faut vraiment que Weave publie une nouvelle mise à jour, le Firecracker de Ignite est en v0.22.4 alors qu'on est actuellement à la v1.2.0......

Enfin, nous allons installer Docker.

Ajoutez la clés GPG avec curl en l'ajoutant à /usr/share/keyrings.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Ajoutez le dépôt de Docker avec la commande "echo" dans le dossier /etc/apt/sources.list.d.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Mettez à jour les dépôts.

sudo apt update

Et installez le paquet "docker-ce".

sudo apt install docker-ce -y

Pour pouvoir utiliser docker sans la commande "sudo", ajoutez l'utilisateur au groupe docker avec la commande suivante.

sudo usermod -aG docker username

Passons à la suite des hostilités.

5-Importation des images

Je suis aller voir les images compatible avec Weave Ignite et vous est préparer cette petite liste. Téléchargez les images les unes après les autres.

sudo ignite image import weaveworks/ignite-ubuntu
sudo ignite image import weaveworks/ignite-centos
sudo ignite image import weaveworks/ignite-kubeadm
sudo ignite image import weaveworks/ignite-alpine
sudo ignite image import weaveworks/ignite-amazonlinux
sudo ignite image import weaveworks/ignite-rockylinux
sudo ignite image import weaveworks/ignite-almalinux
sudo ignite image import weaveworks/ignite-opensuse

On tape la commande "ignite images" et on vois bien la liste des images OCi récupérés du Docker Hub qui serviront de base à nos microVMs Firecracker.

6-Déploiement

J'ai eu quelques soucis en utilisant comme runtime containerd.

Après le redémarrage de la machine physique/virtuelle, si je tente de démarrer la micro VM, voici le message qui s'affiche.

ignite@ignite:~$ sudo ignite start ubuntu
ERRO[0001] failed to setup network for namespace "ignite-aba9a22b2ac06b37": failed to allocate for range 0: 10.61.0.20 has been allocated to ignite-aba9a22b2ac06b37, duplicate allocation is not allowed 
FATA[0001] failed to allocate for range 0: 10.61.0.20 has been allocated to ignite-aba9a22b2ac06b37, duplicate allocation is not allowed 

D'après le fil de discussion ci-dessous, il faut utiliser soit :

  • docker+docker-bridge
  • docker+CNI

Du coup, obligation d'installer docker-ce au lieu de simplement installer containerd.

Lisez le fil de discussion pour en savoir plus.

How to re-run stopped VMs? · Issue #504 · weaveworks/ignite
Why reboot VMs doesn't work? How can I re-start stopped VMs? # sudo ignite vm start my-vm FATA[0000] failed to start container for VM "989923904ae4eb43": task must be stopped before d...

J'utilise pour ce tutoriel la combinaison docker+docker-bridge pour pouvoir accéder au service de la micro VM.

Note : docker-bridge reste déprécié au profit des plugins CNI donc en attente d'une mise à jour de Weave Ignite, j'utilise docker-bridge.

On indique qu'on souhaite utiliser l'image ubuntu, le runtime docker et le réseau docker-bridge.

Il portera comme nom librespeed, il aura droit à 2 cores, 2 Go de mémoire vive, 2Go d'espace disque et aura le port 9000 exposé.

Enfin, j'active le service SSH pour pouvoir me connecté dessus.

Tapez la commande et validez.

sudo ignite run weaveworks/ignite-ubuntu \
--runtime docker \
--network-plugin docker-bridge \
--name librespeed \
--cpus 2 \
--memory 2GB \
--size 2GB \
--ports 9000:9000
--ssh

Bingo!!!! Aucune erreur. Il récupère bien l'image "ignite-ubuntu", créer un réseau à partir de docker-bridge et démarre bien la machine virtuelle Firecracker dans un conteneur comme indiqué plus haut.

  • Tapez "ignite attach librespeed"
  • Tapez "root/root" comme utilisateur et mot de passe
  • Ctrl+p+q pour quitter le terminal.

La machine virtuelle Ubuntu basée sur l'image OCI consomme à peine 50 Mo.

7-Installation et exposition d'un service

On va déployer le conteneur Librespeed pour faire un test et l'exposer sur le port 9001 de la microVM.

Installez de nouveau docker (voir la procédure plus haut) et activez le service.

systemctl start docker

Éxécutez la commande suivante pour déployer le conteneur.

docker run -d \
  --name=librespeed \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/Paris \
  -p 9001:80 \
  -v /home/ignite/docker/librespeed:/config \
  --restart unless-stopped \
  lscr.io/linuxserver/librespeed:latest

Enfin, tapez l'adresse IP de la machine physique/virtuelle qui héberge les microVMs suivi du n° de port.

Ça fonctionne!!!

Si j'utilise Weave Ignite sur mon poste client sous Ubuntu et que j'ouvre le port 80 pour accéder à NGINX, ça fonctionne également.

À noter que vous pouvez également écrire des manifestes comme avec docker-compose.

On a fait le plus gros du boulot en suivant ce tutoriel. À vous par la suite de trouver des idées sympa à mettre en place comme notre amis Karim qui s'est bien éclaté avec ce tutoriel par exemple en combinant Firecracker/Weave Ignite, Kind (similaire à K3D) et l'outil de management Rancher.

Des clusters Kubernetes imbriqués avec Ignite, Firecracker, Containerd, Kind et Rancher …
J’avais déjà parlé dans un précédent article de Weave Ignite et Footloose qui continuent de se développer :

Pour finir, dites vous que ces microVMs se comportent exactement comme des machines virtuelles sous KVM sans l'émulateur QEMU et sans sa tripotée de périphériques à émuler.

Dans le cadre d'un HomeLab, ces microVMs sont parfaites et peuvent très bien remplacer les conteneurs LXC et les machines virtuelles sur un poste client ou bien êtres déployés dans une machine virtuelle avec virtualisation imbriquée.

De plus, vous allez être sensibilisé à l'un des points faible des conteneurs, leur manque d'isolation et leur dépendance au noyau du système hôte.

Et comme indiqué plus haut, Firecracker est déjà en production depuis un moment. Ce n'est pas un gadget et il est utilisé massivement dans l'univers du cloud.

Sources :

GitHub - firecracker-microvm/firecracker: Secure and fast microVMs for serverless computing.
Secure and fast microVMs for serverless computing. - GitHub - firecracker-microvm/firecracker: Secure and fast microVMs for serverless computing.
GitHub - weaveworks/ignite: Ignite a Firecracker microVM
Ignite a Firecracker microVM. Contribute to weaveworks/ignite development by creating an account on GitHub.
GitHub - containernetworking/plugins: Some reference and example networking plugins, maintained by the CNI team.
Some reference and example networking plugins, maintained by the CNI team. - GitHub - containernetworking/plugins: Some reference and example networking plugins, maintained by the CNI team.
Fire Up Your VMs with Weave Ignite
For the last few months we have been playing with a little side project called “Ignite”. Ignite is a GitOps-managed Virtual Machine (VM) with a container UX. A “container VM” that is both secure and lightning fast.
Networking - Weave Ignite
Ignite installation guide - Weave Ignite

Merci à Karim du blog Deep75 qui m'a fait découvrir Weave Ignite et tellement d'autres choses (une vrais caverne d'Ali Baba en terme d'informations). J'ai beaucoup appris avec son blog lorsque j'était en formation.

Karim – Medium
Read writing from Karim on Medium. Above the clouds, the sky is always blue ... Every day, Karim and thousands of other voices read, write, and share important stories on Medium.