Podman - Concepts

Un conteneur est un ensemble de processus isolés du reste du système et permet d’empaqueter des applications en simplifiant leur déploiement et leur gestion.

RHEL prend en charge les conteneurs en utilisant :

  • Control Groups (cgroups) pour la gestion des ressources
  • Namespaces pour l’isolement des processus
  • SELinux et Seccomp (Secure Computing Mode) pour appliquer les limites de sécurité

Différences entre conteneurs et machines virtuelles

Les conteneurs et machines virtuelles ont de nombreux avantages en commun : sécurité, stockage et isolement réseau. Tout deux isolent leurs bibliothèques d’applications et leurs ressources.

Machine virtuelle :

  • Permet à plusieurs systèmes d’exploitation de s’exécuter simultanément sur une seule plateforme matérielle
  • Utilise un hyperviseur pour diviser le matériel en plusieurs systèmes matériels virtuels
  • Nécessite un environnement de système d’exploitation complet pour prendre en charge l’application

Conteneur :

  • S’exécute directement sur le système d’exploitation hôte et partage les ressources matérielles avec tous les conteneurs du système
  • Partage le noyau de l’hôte mais isole les processus d’application du reste du système
  • Nécessite beaucoup moins de ressources matérielles donc les conteneurs sont plus rapides à démarrer
  • Inclut toutes les dépendances : système, programmation et les paramètres de configuration

Note : certaines applications ne fonctionnent pas en tant que conteneur, généralement si elles ont besoin d’accéder à des informations matérielles de bas niveau.

Architectures et gestion des conteneurs

Généralement, on fait en sorte que 1 service = 1 conteneur. Le but étant de faciliter la maintenance et les services/applications restent indépendantes et ne sont pas affectées.

Les conteneurs permettent de :

  • réutiliser les applications
  • rendre portables les applications
  • être déplacés d’un environnement à un autre (ex: DEV -> PROD)
  • avoir plusieurs versions (des copies)
  • avoir une utilisation temporaire
  • avoir leur données générées enregistrées dans un stockage persistant
  • s’exécuter lorsque cela est nécessaire

Conteneurs Rootful et Rootless

Les conteneurs peuvent être exécuté en tant que root (rootful) ou en tant qu’utilisateur normal (rootless) et définissent l’accès aux ressources système.

  • Conteneurs rootful : conteneurs exécutés par un utilisateur privilégié.
  • Conteneurs rootless : conteneurs exécutés par un utilisateur non privilégié.

Outils de gestion de conteneur

Les principaux outils pour exécuter des conteneurs sont :

  • podman : gestion des conteneurs et des images
  • skopeo : inspection, copie, suppression et signature des images
  • buildah : création des images de conteneur

Images de conteneurs et registres

Pour exécuter des conteneurs, il faut utiliser une image de conteneur qui est un fichier servant de modèle pour créer des conteneurs (ces images empaquètent les applications avec leurs dépendances).

Le registre de conteneur (privé ou public) est un référentiel pour le stockage et la récupération des images de conteneur.

Les registres de conteneurs certifiés Red Hat sont :

  • registry.redhat.io : conteneurs basés sur les produits Red Hat
  • registry.connect.redhat.com : conteneurs basés sur des produits tiers

La commande podman login permet de s’authentifier auprès des registres :

# podman login registry.lab.example.com
Username: luci
Password: My4w3s0m3P4SS!
Login Succeeded!

Ne pas utiliser l’option --password car stocké dans les logs.

Vérification de connection avec l’argument --get-login :

#  podman login registry.access.redhat.com --get-login
luci

Configuration de registres de conteneurs

Le fichier de configuration par défaut pour les registres de conteneurs est /etc/containers/registries.conf.

# cat /etc/containers/registries.conf

[...]

unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "quay.io", "docker.io"]

# [[registry]]
# # The "prefix" field is used to choose the relevant [[registry]] TOML table;
# # (only) the TOML table with the longest match for the input image name
# # (taking into account namespace/repo/tag/digest separators) is used.
# #
# # The prefix can also be of the form: *.example.com for wildcard subdomain
# # matching.
# #
# # If the prefix field is missing, it defaults to be the same as the "location" field.
# prefix = "example.com/foo"
#
# # If true, unencrypted HTTP as well as TLS connections with untrusted
# # certificates are allowed.
# insecure = false
#
# # If true, pulling images with matching names is forbidden.
# blocked = false
#
[...]

Pour faire du rootless, il est possible de créer un fichier de conf dans $HOME/.config/containers.

Ce fichier remplacera /etc/containers/registries.conf et sera utilisé par Podman en mode rootless.

La section unqualified-search-registries est utilisée par défaut (et peut rester vide).

Pour rechercher l’image de conteneur si rien n’est précisé :

$ podman pull ubi

Avec un nom complet (recommandé) de l’image de conteneur :

$ podman pull registry.access.redhat.com/ubi8/ubi:latest

Pour configurer des registres de conteneurs :

# [[registry]]
# # The "prefix" field is used to choose the relevant [[registry]] TOML table;
# # (only) the TOML table with the longest match for the input image name
# # (taking into account namespace/repo/tag/digest separators) is used.

[[registry]]
location = "registry.prod.my.company.org"
insecure = false
blocked = false

[[registry]]
location = "registry.dev.my.company.org"
insecure = true
blocked = false

[[registry]]
location = "registry.test.my.company.org"
insecure = true
blocked = false

Options :

  • location : emplacement du registre de conteneurs
  • insecure :
    • true : connexion non chiffrées, certificats non approuvés
    • false : connexion chiffrées, certificats approuvés
  • blocked
    • true : les images ne peuvent pas être téléchargées à partir du registre
    • false : les images peuvent être téléchargées à partir du registre

Fichiers de conteneurs pour compiler des images de conteneur

Les fichiers de conteneur contiennent des instructions pour compiler une image de conteneur.

Exemple utilisant la dernière image d’Ubi :

$ cat myContainerFile

FROM registry.access.redhat.com/ubi8/ubi:latest
RUN dnf install -y python3
CMD ["/bin/bash", "-c", "echo hello Princess Bean and Luci !!!"]

Red Hat OpenShift

Red Hat propose une distribution Kubernetes appelée Red Hat OpenShift.

C’est un ensemble de composants et de services créés par-dessus Kubernetes :

  • gestion à distance basée sur le Web
  • architecture multisite
  • contrôle
  • audit
  • sécurité
  • gestion des cycles de vie

Kubernetes :

  • équilibre les charges
  • vérifie l’intégrité des conteneurs
  • redémarre les conteneurs en cas d’échec

/!\ Résumé des commandes

Commandes :

podman login registry.lab.example.com
podman login registry.access.redhat.com --get-login
podman pull registry.access.redhat.com/ubi8/ubi:latest

Fichiers :

/etc/containers/registries.conf   // fichier de config principal
$HOME/.config/containers // fichier utilisé par Podman si rootless

Configurer des registres de conteneurs :

[[registry]]
location = "registry.prod.my.company.org"
insecure = false
blocked = false

Documentation

MAN cgroups(7)
MAN namespaces(7)
MAN seccomp(2)

https://www.openshift.com
https://github.com/opencontainers/image-spec/blob/master/spec.md
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/htmlsingle/building_running_and_managing_containers/index
https://www.redhat.com/en/resources/container-security-openshift-cloud-devopswhitepaper
https://access.redhat.com/containers : Red Hat Container Catalog
https://access.redhat.com/products/red-hat-quay

> Partager <