Os Immutable: Flatcar Linux
FlatCar Linux est un fork de CoreOS Container Linux développé par la société Kinvolk ↗. Ce fork a été initié pour assurer la pérennité de CoreOS à la suite de l’annonce de Redhat d’acquérir CoreOS.
Concepts de FlatCar Linux
FlatCar Linux ne contient que ce qui est nécessaires pour déployer des applications dans des conteneurs, ce qui permet de limiter sa surface d’attaque.
Il est considéré comme immuable, car sa partition principale (/usr) est montée en lecture seule et il n’intègre pas de gestionnaire de packages. Pour les mises à jour, FlatCar reprend le système de mise à jour de ChromeOS. Il existe en fait deux partitions où est installé des versions différentes du système d’exploitation, mais une seule est active. Lors de la publication d’une nouvelle version, la nouvelle image est chargée sur la partition inactive. Au prochain reboot, c’est cette nouvelle version qui deviendra active. En cas de problème de démarrage, le système revient automatiquement à l’ancienne version.
La configuration des instances est fait comme pour CoreOS via un fichier de configuration au format ignition (proche de cloud-init). Via ce fichier, il est possible de :
- Ajouter des utilisateurs et groupes
- Créer et gérer des devices, système de fichiers, des fichiers et définir la swap.
- De customiser les mises à jour et reboots automatiques
- De créer des configurations réseaux
- De définir les services à démarrer
Installation de FlatCar Linux
FlatCar Linux peut être installé sur toutes les plateformes cloud suivantes :
- AWS EC2
- Equinix Metal
- Microsoft Azure
- VMware
- Google Compute Engine
- DigitalOcean
- Hetzner
Mais il peut être aussi installé sur :
- Libvirt
- Qemu
- VirtualBox
On peut le tester avec Vagrant via les boxes mise à disposition. C’est ce que nous allons voir, dans un premier temps et nous verrons par la suite comment l’installer sur du libvirt avec Terraform.
Test de FlatCar Linux avec Vagrant et VirtualBox
Il faut installer au préalable VirtualBox et Vagrant :
Maintenant on peut passer au test :
On vérifie que /usr est bien en read only :
Installation de FlatCar avec Terraform
En m’appuyant sur la documentation du site ↗ (qui est excellente), je vais monter une VM dans ma VM de développement avec du Terraform.
Ce qui est sympathique avec Terraform c’est que la transpilation du
fichier iginition est assuré par le provider posseidon/ct
. Il suffit
donc de créer un fichier de configuration via le système de template
de
Terraform.
Si vous voulez instancier sur d’autres plateformes le site du projet regorge d’exemples ↗
On commence par écrire le fichier main.tf
:
Le fichier de variables.tf
:
Un fichier terraform.tfvars
(remplacer la clé ssh avec la vôtre) :
Nous devons récupérer l’image de base, celle définie par la variable base_image
:
Et pour finir, nous allons créer le fichier de template pour la configuration Ignition :
On applique :
Et on lance le script créé par la configuration ignition :
Docker est opérationnel ?
Mais comment ajouter des packages à FlatCar Linux ?
Customisation de FlatCar Linux
Il est possible de modifier la configuration Ignition et tout est très bien documenté sur le site officiel ↗
Ajouter des packages ?
Il est possible de customiser FlatCar Linux
en lui ajoutant des packages par
exemple. Pour cela il faut ajouter des packages Gentoo via le SDK de
FlatCar Linux. Tiré de la documentation du
site ↗
Pourquoi pas lui ajouter zsh (pour faire simple) ?
Il faut dans un premier temps récupérer le SDK de FlatCar Linux :
Nous sommes sur la branche main du projet et donc la dernière version nigthly. Pour changer de version, il suffit de regarder dans les branches et de basculer sur celle désirée :
Pour lancer le SDK, qui tourne dans container, on a à disposition un script. Ce script se charge de récupérer l’image du sdk correspondant à la branche dans laquelle vous avez basculé :
Il faut ensuite récupérer le projet Gentoo :
Avant tout ajout, il faut builder tous les packages (c’est assez long !) :
On recherche zsh dans le projet Gentoo :
Il faut copier ce répertoire dans celui de FlatCar Linux et lancer sa compilation :
Il faudra répéter l’opération pour chaque dépendance manquante !
Il faut ensuite ajouter au fichier de description de FlatCar zsh :
Ensuite on lance le build :
On sort de la session docker en cours, on copie la nouvelle image à la place de celle utilisée dans la configuration Terraform.
On vérifie que zsh
est disponible :
Voilà on a réussi, j’ai testé avec docker-compose
et ça fonctionne également,
mais il faut copier pas mal de dépendances de dev-python
. La liste :
pycparser, urllib3, six, idna, charset-normalizer, cffi, certifi, websocket-client, requests, pynacl, cryptography, bcrypt, pyrsistent, paramiko, docker, attrs, texttable, PyYAML, python-dotenv, jsonschema, docopt, dockerpty, distro, docker-compose
Dans un contexte de production, il y aura du travail pour créer un CI permettant de builder en automatique ce genre d’image et de les stocker.
Plus loin
C’est franchement une belle découverte. J’imagine déjà pas mal de cas d’utilisation. Vu que ssh et python fonctionne pourquoi pas utiliser Ansible pour installer des produits du type rundeck. Je pense que cette distribution a pas mal de potentiels, pas étonnant qu’on la retrouve chez tous les clouders.