Comment activer les mises à jour automatiques des conteneurs de Podman
Podman est une plate-forme de conteneurisation conforme à l’OCI qui est souvent utilisée à la place de Docker. Son modèle sans démon et son ensemble de fonctionnalités étendu en font un bon candidat pour une utilisation en développement et en production.
Dans cet article, nous montrerons comment utiliser le système de mise à jour automatique de Podman pour redémarrer vos conteneurs lorsque de nouvelles images sont publiées. Podman peut être configuré pour vérifier périodiquement les mises à jour, extraire la dernière image et recréer les conteneurs concernés en utilisant leurs paramètres actuels.
Sommaire
Pourquoi mettre à jour automatiquement les conteneurs ?
Les conteneurs ont souvent une durée de vie courte mais ils doivent tout de même être régulièrement entretenus. Une vulnérabilité critique à l’intérieur d’une image pourrait donner aux attaquants un pied dans votre application qui est exploitée dans les heures suivant sa découverte.
Les technologies de conteneurs les plus populaires nécessitent que vous mettiez à jour manuellement vos conteneurs. Cela oblige les équipes opérationnelles à s’abonner aux annonces de publication et à créer des outils qui déploient de nouvelles modifications.
Le système de mise à jour de conteneur intégré de Podman relève ce défi et maintient les charges de travail à jour. Les conteneurs peuvent être rapidement mis à jour une fois que vous avez poussé de nouvelles versions d’image, ce qui vous assure que vos déploiements exécutent les derniers correctifs et corrections de bogues.
Activation des mises à jour automatiques
Les mises à jour automatiques sont activées pour un conteneur en définissant le paramètre io.containers.autoupdate
étiquette lors de sa création.
$ podman run -d -p 8080:80 --name nginx-container --label io.containers.autoupdate=registry docker.io/library/nginx:latest
L’étiquette peut avoir deux valeurs possibles :
registry
– Lors des vérifications de mise à jour, Podman contactera le registre d’images pour vérifier si la balise utilisée par votre conteneur a une nouvelle version disponible. L’image sera extraite et votre conteneur redémarré si tel est le cas. Les mises à jour du registre ne fonctionnent que lorsque vous utilisez un chemin de registre complet – ledocker.io/library/nginx:latest
référence ci-dessus est intentionnelle, carnginx:latest
est trop vague.local
– Cette méthode de mise à jour limite Podman à la recherche d’images de conteneurs qui existent déjà sur le système de fichiers de votre hôte. Le conteneur sera redémarré si la version locale de la balise d’image diffère de la version exécutée par le conteneur. Cela peut être utile lors de la reconstruction d’images pendant le développement.
La présence de l’étiquette rend cet exemple de conteneur NGINX éligible pour les mises à jour automatiques. Cependant, des travaux supplémentaires sont nécessaires avant que les mises à jour puissent réellement être appliquées.
Création d’un service Systemd
Le mécanisme de mise à jour de Podman nécessite que vos conteneurs s’exécutent dans les services systemd. Parce que Podman est sans démon, il manque un contrôleur central qui peut démarrer et arrêter vos conteneurs. Les encapsuler dans un service systemd fournit des capacités de gestion du cycle de vie et la possibilité de redémarrages en réponse à des événements spécifiques.
La CLI de Podman inclut une commande qui crée une définition d’unité systemd à partir d’un conteneur :
$ podman generate systemd --name nginx-container > /etc/systemd/system/nginx-container.service
Les commandes ci-dessus créent un nouveau conteneur NGINX avec un service systemd au bon emplacement.
Rechargez ensuite systemd pour enregistrer la définition de service, puis activez et démarrez le service :
$ systemctl daemon-reload $ systemctl enable nginx-container.service $ systemctl start nginx-container.service
Votre conteneur NGINX est maintenant un service systemd qui démarrera automatiquement au démarrage de votre hôte. Vous pouvez utiliser systemctl
commandes pour démarrer et arrêter le conteneur, au lieu de la CLI de Podman :
$ systemctl start nginx-container.service $ systemctl stop nginx-container.service
Pour supprimer le conteneur à l’avenir, vous devez arrêter, désactiver et supprimer le fichier d’unité du service. Redémarrez systemd ensuite pour appliquer pleinement la modification.
$ systemctl stop nginx-container.service $ systemctl disable nginx-container.service $ rm /etc/systemd/system/nginx-container.service $ systemctl daemon-reload
Effectuer une mise à jour
Maintenant, tout est configuré pour réussir la mise à jour automatique de votre conteneur NGINX. Vous pouvez exécuter une vérification de mise à jour à la demande à l’aide de Podman’s auto-update
commande:
$ podman auto-update Trying to pull docker.io/library/nginx:latest... Getting image source signatures ... UNIT CONTAINER IMAGE POLICY UPDATED nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry true
Cela met à jour les conteneurs dans les services systemd qui sont accessibles à l’utilisateur exécutant la commande. Vous avez peut-être eu besoin d’utiliser sudo
suivre l’exemple ci-dessus; si c’est le cas, lancez le auto-update
commande en tant que root aussi :
$ sudo podman auto-update
La registry
La stratégie de mise à jour a été utilisée dans cet exemple afin que Podman se connecte au registre d’images, vérifie les modifications, puis extrait la nouvelle image, le cas échéant. La sortie de la commande indique si le conteneur de chaque service a été mis à jour.
Étant donné que les conteneurs sont gérés par systemd, Podman est capable de détecter si le nouveau conteneur a démarré avec succès. Podman reviendra automatiquement à la version précédente d’une image si un échec de mise à jour est détecté. Pour que cela fonctionne de manière fiable, l’application à l’intérieur du conteneur doit informer systemd lorsqu’elle a démarré avec succès. Il peut le faire en exécutant systemd-notify --ready
.
Vérification des mises à jour
Parfois, vous devrez peut-être vérifier si votre flotte de conteneurs dispose de mises à jour disponibles sans les appliquer immédiatement. Utilisez le auto-update
commande avec le --dry-run
flag pour obtenir une liste des services où une image mise à jour a été publiée :
$ podman auto-update --dry-run ... UNIT CONTAINER IMAGE POLICY UPDATED nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry pending
Services affichés comme pending
avoir une mise à jour disponible.
Application des mises à jour selon un calendrier
Nous avons maintenant configuré avec succès les mises à jour de conteneurs à la demande. Vous n’avez pas besoin d’extraire manuellement de nouvelles images ou de redémarrer vos conteneurs. La dernière étape consiste à configurer un calendrier afin que Podman applique périodiquement les mises à jour, sans que vous exécutiez le auto-update
commande.
La plupart des distributions Podman incluent une minuterie systemd à cet effet. Vous pouvez activer la minuterie en utilisant systemctl
:
$ systemctl enable podman-auto-update.timer
La minuterie est configurée pour vérifier les mises à jour tous les jours. Vous pouvez personnaliser le programme en ouvrant le fichier de minuterie à l’aide de systemctl edit
et modifier la valeur de OnCalendar
champ:
$ systemctl edit podman-auto-update.timer [Timer] OnCalendar=Fri *-*-* 18:00
L’expression de temps indiquée ci-dessus exécutera la vérification de la mise à jour tous les vendredis à 18h00. La syntaxe est documentée dans le manuel de systemd.
Maintenant que le minuteur est activé, vous pouvez commencer à déployer vos conteneurs avec le io.containers.autoupdate
étiquette. Ils seront mis à jour et redémarrés périodiquement, automatisant vos procédures de maintenance.
Vous n’avez pas besoin d’utiliser le minuteur systemd de Podman pour créer un calendrier de mise à jour. Tu pourrais courir podman auto-update
à l’intérieur de votre outillage existant ou d’un autre planificateur de tâches tel que cron
.
Sommaire
Les mises à jour automatiques de Podman vous permettent de déplacer les conteneurs vers de nouvelles versions d’image sans les redémarrer manuellement ni utiliser d’outils externes. Cela peut vous aider à maintenir votre flotte de conteneurs à mesure que les images publient des correctifs de bogues et des correctifs de sécurité.
Bien que les mises à jour automatiques soient un outil utile, elles ne doivent pas être utilisées sans considération. Autoriser les mises à jour automatiques peut introduire ses propres problèmes si une image cassée est accidentellement publiée. Les conteneurs qui redémarrent d’eux-mêmes peuvent également entraîner des temps d’arrêt ou perturber les services dépendants.
Par conséquent, vous devez évaluer l’adéquation de votre propre application avant de mettre en œuvre cette solution. Une approche intermédiaire consiste à exécuter auto-update --dry-run
périodiquement et envoyer les résultats à un service de surveillance. Cela vous tient informé des mises à jour disponibles sans encourir les risques de les appliquer sans approbation.