Abonnez-vous au flux

Le mode image pour Red Hat Enterprise Linux (RHEL) s'appuie sur les mêmes outils, compétences et modèles que les applications conteneurisées afin de fournir un système d'exploitation plus facile à assembler, distribuer et exécuter. Cet article présente le mode image ainsi que les concepts fondamentaux qui permettent de mettre en paquets les systèmes d'exploitation dans des images de conteneurs OCI (Open Container Initiative).

Les étapes et processus ci-dessous vous aideront à mieux comprendre le mode image pour RHEL, en assemblant et en déployant vous-même une image personnalisée.

Prérequis :

  1. Un système RHEL 9.x enregistré (ordinateur portable, machine virtuelle, etc.) avec un minimum de 10 Go d'espace disque disponible. Davantage d'espace disque peut s'avérer nécessaire en fonction du nombre d'images créées et de leur taille.
  2. Un compte Red Hat associé à une souscription pour la production ou le développement (des souscriptions gratuites pour le développement sont disponibles ici).

Un registre de conteneurs : cet exemple utilise quay.io pour la publication des contenus, mais vous pouvez choisir un autre service de registre hébergé ou exécuter un registre en local. Vous pouvez créer un compte quay.io rapidement et facilement ici.

Démarrage

Commencez par vérifier que votre système est bien enregistré et qu'il peut accéder aux contenus RHEL.

$ sudo subscription-manager register

Ensuite, installez Podman. Nous vous recommandons d'utiliser la dernière version disponible, mais toutes les versions à partir de 4.* fonctionnent. D'autres outils de conteneurisation, tels que Docker ou les outils de pipeline de conteneurs, peuvent fonctionner dans un environnement de production. Cet exemple présente les concepts associés à Podman, mais d'autres outils peuvent s'avérer plus pertinents pour votre environnement.

$ sudo dnf -y install podman

Authentifiez-vous via registry.redhat.io. Rendez-vous sur https://access.redhat.com/terms-based-registry, puis cliquez sur « New service account ». Cliquez ensuite sur le nom de la nouvelle entrée et copiez-collez les instructions « docker login » dans le terminal, en remplaçant la commande docker par podman. Vous trouverez des instructions plus complètes ici. Avec podman, la conversion de l'image de conteneur en image de disque à l'aide de l'outil de création d'images nécessite des privilèges élevés. Authentifiez-vous dans le registre avec et sans sudo.

$ podman login registry.redhat.io
#repeat with sudo
$ sudo podman login registry.redhat.io

D'un point de vue technique, les images de conteneurs bootc diffèrent des conteneurs d'applications à deux niveaux :

  • Les images bootc utilisent OSTree à l'intérieur du conteneur.
  • Une image bootc possède un noyau et suffisamment d'autres paquets pour démarrer une machine physique ou virtuelle.

Les images de base de conteneurs d'applications contiennent généralement un ensemble minimal de paquets qui ne sont pas liés à la gestion du matériel. De plus, contrairement à l'image de base universelle de Red Hat, les images bootc RHEL sont distribuées sous les mêmes conditions de licence que RHEL.

Utilisez la commande suivante pour extraire l'image de base rhel-bootc.

$ podman pull registry.redhat.io/rhel9/rhel-bootc:9.4

Création d'un fichier Containerfile

Prenons un exemple de fichier Containerfile. Vous connaissez peut-être ces fichiers sous le nom de Dockerfiles. Voyons d'abord comment installer une pile LAMP. Enregistrez le texte ci-dessous dans un nouveau fichier appelé Containerfile :

FROM registry.redhat.io/rhel9/rhel-bootc:9.4

#install the lamp components
RUN dnf module enable -y php:8.2 nginx:1.22 && dnf install -y httpd mariadb mariadb-server php-fpm php-mysqlnd && dnf clean all

#start the services automatically on boot
RUN systemctl enable httpd mariadb php-fpm

#create an awe inspiring home page!
RUN echo '<h1 style="text-align:center;">Welcome to image mode for RHEL</h1> <?php phpinfo(); ?>' >> /var/www/html/index.php

Nous venons de décrire un système d'exploitation simple qui exécute un serveur web sur le port 80 avec une base de données et un environnement php. Voyons maintenant comment créer l'image de conteneur.

Création d'une image

$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc:latest

Remarques :

L'option -t balise l'image. Cet exemple suppose que quay.io est le registre utilisé. En fonction du registre que vous utilisez, vous devrez ajuster ce paramètre.

L'option -f indique à Podman d'utiliser le fichier Containerfile que nous avons créé.

Test de l'image

Testons rapidement notre nouvelle image. Parce qu'il s'agit d'un conteneur, son exécution est rapide et toute faute de frappe est signalée par une erreur. Nommez-la « lamp » pour plus de simplicité :

$ podman run -d --rm --name lamp -p 8080:80 quay.io/[my_account]/lamp-bootc:latest /sbin/init

Le conteneur démarre (aucune connexion n'est nécessaire à ce stade). Ouvrez un navigateur et vérifiez que vous pouvez afficher cette page web : http://[votre_adresse_ip]:8080. Si la page ne se charge pas, vérifiez les règles du pare-feu. Si vous utilisez un système local, l'adresse de bouclage doit fonctionner correctement. Dans cet exemple, nous démarrons systemd. Cependant, dans de nombreux scénarios de test, il s'avère plus efficace de simplement démarrer une application. La rapidité des tests et validations joue un rôle essentiel dans l'utilisation des conteneurs pour définir des images de système d'exploitation.

Vous pouvez vous connecter à l'instance de conteneur en cours d'exécution via le shell avec la commande  podman exec, en utilisant le nom que nous avons défini ci-dessus.

$ podman exec -it lamp /bin/bash

Arrêtez l'instance en utilisant le même nom :

$ podman stop lamp

Envoi à un registre

Ensuite, authentifiez-vous en vous connectant à quay.io, envoyez l'image au registre et configurez le référentiel pour qu'il soit accessible  au public.

$ podman login quay.io
$ podman push quay.io/[my_account]/lamp-bootc:latest

Nous avons créé une image en couches que nous pouvons déployer et installer de diverses façons sur un hôte. Nous pouvons utiliser le programme d'installation de RHEL et démarrer un système bare metal (déployé via USB, PXE, etc.), ou utiliser l'outil de création d'images pour convertir l'image de conteneur en image de démarrage. Une fois ce conteneur « installé », les prochaines mises à jour s'appliquent directement à partir du registre de conteneurs, dès leur publication. Le processus d'installation ne s'exécute donc qu'une seule fois.

Déploiement via KVM/QEMU avec une image de disque Qcow2

Cet exemple utilise l'outil de création d'images pour convertir l'image de conteneur disque au format qcow2, en supposant que l'image se trouve dans un référentiel accessible au public. Consultez la documentation sur l'outil de création d'images pour en savoir plus sur l'utilisation d'une image à partir d'un référentiel privé. Il existe aussi d'autres formats d'image.

Créez d'abord un fichier config.json qui permet de configurer le disque obtenu. Ici, ce fichier inclut les utilisateurs que vous souhaitez créer.  Collez votre clé et votre mot de passe SSH dans cet exemple.

{
 "blueprint": {
   "customizations": {
     "user": [
       {
         "name": "cloud-user",
         "password": "changeme",
         "key": "ssh-rsa AAAAB3Nz..........",
         "groups": [
           "wheel"
         ]
       }
     ]
   }
 }
}

Ensuite, transmettez le fichier config.json à l'outil de création d'images avec notre conteneur lamp :

$ sudo podman run --rm -it --privileged \
-v .:/output \
-v $(pwd)/config.json:/config.json \
--pull newer \
registry.redhat.io/rhel9/bootc-image-builder:9.4 \
--type qcow2 \
--config /config.json \
quay.io/[my_account]/lamp-bootc:latest

Une fois l'image prête, exécutez-la en utilisant libvirt (ou qemu directement).

virt-install \
 --name lamp-bootc \
 --memory 4096 \
 --vcpus 2 \
 --disk qcow2/disk.qcow2 \
 --import \
 --os-variant rhel9.4

Maintenant que la machine virtuelle est en cours d'exécution, vous devriez pouvoir vérifier l'affichage du site en saisissant l'adresse  http://[adresse_ip_de_votre_instance] dans un navigateur.

Déploiement sur AWS avec une image de disque AMI

Pour cet exemple, nous devons confirmer la disponibilité de cloud-init dans le fichier Containerfile lamp que nous avons créé. Nous pouvons nous servir du workflow de conteneurs et créer facilement une image en couches pour notre cas d'utilisation. Cette démonstration repose sur une image en couches, mais n'hésitez pas à modifier le fichier Containerfile d'origine pour inclure cloud-init si c'est plus simple.

FROM quay.io/[my_account]/lamp-bootc:latest
#install cloud-init for AWS
RUN dnf install -y cloud-init && dnf clean all

Créez et envoyez l'image :

$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc-aws:latest
$ podman push quay.io/[my_account]/lamp-bootc-aws:latest

Nous nous appuyons sur cloud-init pour injecter les utilisateurs et les clés SSH, ce qui nous permet d'ignorer l'étape config.json de l'exemple KVM ci-dessus (la création d'une configuration cloud-init sort du cadre de cet article). Cette méthode renforce la posture de sécurité en évitant d'inclure des informations d'identification codées en dur dans notre image. Ensuite, exécutez l'outil de création d'images pour créer l'AMI :

$ sudo podman run --rm -it --privileged \
 --pull=newer \
 --security-opt label=type:unconfined_t \
 -v $XDG_RUNTIME_DIR/containers/auth.json:/run/containers/0/auth.json \
 -v $HOME/.aws:/root/.aws:ro \
 --env AWS_PROFILE=default \
 registry.redhat.io/rhel9/bootc-image-builder:9.4:latest \
 --type ami \
 --aws-ami-name lamp-bootc-aws \
 --aws-bucket bootc-bucket \
 --aws-region us-east-1 \
 quay.io/[my_account]/lamp-cloud-init-bootc:latest

D'autres options de configuration sont disponibles pour les propriétés AWS. Consultez ce lien pour plus de détails.

Une fois la publication terminée, démarrez votre image et affichez la page http://[adresse_ip_de_votre_instance] dans un navigateur.

Installation sur un système bare metal via Kickstart

Comme nous l'avons vu, il existe plusieurs façons d'installer notre conteneur. Cette section couvre l'utilisation de Kickstart, une méthode très courante pour le déploiement de systèmes bare metal à l'aide de lecteurs ISO, PXE ou USB. Ce guide s'adresse aux utilisateurs qui connaissent déjà Kickstart. Ajoutez les informations relatives aux utilisateurs, aux mots de passe et aux clés ssh dans l'exemple ci-dessous. Il est possible d'ajouter des options, mais sachez que la section %packages n'est pas viable avec ce workflow, car nous remplaçons l'instance par l'image de conteneur. Téléchargez l'ISO de démarrage 9.4 pour votre architecture à partir de ce site.

text
network --bootproto=dhcp --device=link --activate
# Basic partitioning
clearpart --all --initlabel --disklabel=gpt
reqpart --add-boot
part / --grow --fstype xfs
# Here's where we reference the container image to install - notice the kickstart
# has no `%packages` section!  What's being installed here is a container image.
ostreecontainer --url quay.io/[my_account]/lamp-bootc:latest
firewall --disabled
services --enabled=sshd
# optionally add a user
user --name=cloud-user --groups=wheel --plaintext --password=changemme
sshkey --username cloud-user "ssh-ed25519 AAAAC3Nza....."
# if desired, inject a SSH key for root
rootpw --iscrypted locked
sshkey --username root "ssh-ed25519 AAAAC3Nza....." #paste your ssh key here
reboot

Copiez ce fichier de configuration sur un serveur web, mettez à jour le mot de passe et la clé SSH, démarrez tout système physique ou virtuel à l'aide du support d'installation et ajoutez ce qui suit aux arguments du noyau :

inst.ks=http://path_to_my_kickstart

Appuyez sur CTRL+X pour démarrer le système en utilisant cette option.

Si vous n'arrivez pas à accéder à un serveur HTTP, vous pouvez utiliser le module de serveur http disponible dans la plupart des installations Python. Dans le répertoire contenant le fichier kickstart, exécutez la commande suivante :

$ python -m http.server

Il est possible de ne pas utiliser de serveur HTTP pour héberger le fichier kickstart, et d'injecter celui-ci dans l'ISO du programme d'installation. Le paquet lorax inclut un utilitaire appelé mkksiso, qui peut intégrer ce fichier dans une image ISO. Vous pouvez ainsi démarrer le système directement à partir d'une clé USB et éviter de modifier le menu de démarrage. Exécutez la commande suivante : mkksiso --ks /PATH/TO/KICKSTART /PATH/TO/ISO /PATH/TO/NEW-ISO

Mise à jour

Il est important de noter que les tâches d'installation ou de déploiement ne s'effectuent qu'une seule fois. Ce modèle prend toute sa valeur à l'étape de maintenance, lorsque des changements peuvent être apportés en envoyant des images au registre. Les mises à jour automatiques sont activées par défaut. Bien évidemment, il est possible de désactiver cette option facilement ou de la configurer en fonction des créneaux de maintenance. Pour l'essayer, modifiez le fichier Containerfile et reproduisez les étapes de création et d'envoi pour que la nouvelle image soit disponible dans le registre.& Le minuteur par défaut de l'unité systemd se déclenche après une heure de disponibilité, mais vous pouvez également utiliser la commande « bootc upgrade » plus tôt pour accéder à la mise à jour.

Étapes suivantes

Vous venez de découvrir un exemple simple du mode image pour RHEL. Nous vous recommandons d'analyser vos propres cas d'utilisation et de réfléchir aux possibilités et avantages que peuvent offrir les outils de conteneurisation pour versionner et gérer le déploiement de systèmes d'exploitation. N'oubliez pas de consulter notre référentiel d'exemples bootc, qui couvre plusieurs plateformes et scénarios utiles. Nous vous conseillons également de consulter la documentation complète afin d'approfondir le sujet. 


À propos de l'auteur

Ben Breard is a Senior Principal Product Manager at Red Hat, focusing on Red Hat Enterprise Linux and Edge Offerings.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

Parcourir par canal

automation icon

Automatisation

Les dernières nouveautés en matière d'automatisation informatique pour les technologies, les équipes et les environnements

AI icon

Intelligence artificielle

Actualité sur les plateformes qui permettent aux clients d'exécuter des charges de travail d'IA sur tout type d'environnement

open hybrid cloud icon

Cloud hybride ouvert

Découvrez comment créer un avenir flexible grâce au cloud hybride

security icon

Sécurité

Les dernières actualités sur la façon dont nous réduisons les risques dans tous les environnements et technologies

edge icon

Edge computing

Actualité sur les plateformes qui simplifient les opérations en périphérie

Infrastructure icon

Infrastructure

Les dernières nouveautés sur la plateforme Linux d'entreprise leader au monde

application development icon

Applications

À l’intérieur de nos solutions aux défis d’application les plus difficiles

Original series icon

Programmes originaux

Histoires passionnantes de créateurs et de leaders de technologies d'entreprise