Podman : présentation générale

Quid

Podman est le gestionnaire de conteneurs (OCI) implémenté RedHat.

Podman est conçu pour être utilisé sans les droits root (rootless), c'est la différence clef avec Docker.

Liens utils

Comment est configuré podman

La commande podman info donne toutes les informations de configuration de podman.

L'option --format permet de filtrer la sortie et récupérer des confgurations particulières. Par exemple:

# Le Backend réseau
$ podman info --format {{.Host.NetworkBackend}} 
netavark
# Les plugins réseau
$ podman info --format {{.Plugins.Network}} 
[bridge macvlan ipvlan]

Les fichiers de configuration

podman utilise les fichiers de configuration standards :

  • système: /etc/containers*
  • utilisateur: "$HOME"/.config/containers/*

Le réseau

Présentation

La configuration du réseau dépend du backend configuré.

Podman supporte 2 backend réseaux, netavark et CNI.

  • CNI est déprécié et sera supprimé en version 5.0
  • netavark fait partie de l'écosystème des produits RedHat.

Schéma général

graph Podman --> netavark netavark --> slirp4netns slirp4netns --> slirp

netavark

  • netavark est écrit en Rust.
  • implémente un mécanisme de plugins
  • API
  • create: crée une configuration réseau
  • setup: configure le réseau
  • teardown: liste la configuration réseau
  • info: donne les infos sur le plugin
$ podman info  --format "{{.Host.NetworkBackendInfo.Path}}"
/usr/lib/podman/netavark
$ podman info  --format "{{.Host.NetworkBackendInfo.Version}}"
netavark 1.10.3
$ /usr/lib/podman/netavark
netavark 1.10.3

netavark usage

Usage: netavark [OPTIONS] <COMMAND>

Commands:
  setup             Configures the given network namespace with the given configuration
  update            Updates network dns servers for an already configured network
  teardown          Undo any configuration applied via setup command
  version           Display info about netavark
  dhcp-proxy        Start dhcp-proxy
  firewalld-reload  Listen for the firewalld reload event and reload fw rules
  help              Print this message or the help of the given subcommand(s)

Options:
  -f, --file <FILE>
          Instead of reading from STDIN, read the configuration to be applied from the given file
      --firewall-driver <FIREWALL_DRIVER>
          Select netavark's firewall driver [env: NETAVARK_FW=]
  -c, --config <CONFIG>
          config directory for aardvark, usually path to a tmpfs
  -r, --rootless <ROOTLESS>
          Tells if current netavark invocation is for rootless container [possible values: true, false]
  -a, --aardvark-binary <AARDVARK_BINARY>
          Path to the aardvark-dns binary
      --plugin-directory <PLUGIN_DIRECTORIES>
          Path to netavark plugin directories, can be set multiple times to specify more than one directory
  -h, --help
          Print help
  -V, --version
          Print version

netavark code

  • Inclus dans la libnetwork
  • utilise le format de stockage bbolt d'etcd pour stoquer les données IPAM.
  • données stockées dans /run/user/"$(id -u)"/containers/netavark/imap.db
$ go install go.etcd.io/bbolt/cmd/bbolt@lates
$ "$GOPATH"/bin/bbolt info /run/user/"$(id -u)"/containers/netavark/imap.db 
$ "$GOPATH"/bin/bbolt buckets /run/user/"$(id -u)"/containers/netavark/imap.db 
$ "$GOPATH"/bin/bbolt pages /run/user/"$(id -u)"/containers/netavark/imap.db 
$ "$GOPATH"/bin/bbolt page-item /run/user/"$(id -u)"/containers/netavark/imap.db 1 0

$ go install github.com/br0xen/boltbrowser@master
$ "$GOPATH"/bin/boltbrowser /run/user/"$(id -u)"/containers/netavark/imap.db

Lire ipam.db

slirp4netns pour traiter le rootless

Notes

  • en jouant avec une journée, je suis tombé sur des bugs dans la gestion du réseau. On retrouve ces bugs dans les PR #21194 et #15708du projet. Le sujet ne semble pas traité depuis plusieurs années :/ Cela pousse à étudier docker rootless
  • le dev global nécessite la mise en place de chaine de build go/rust/python.