Project

General

Profile

Tâche #34772

Scénario #34727: Gestion des logs générés par les applications installées dans les conteneurs podman

Étude

Added by Benjamin Bohard over 1 year ago. Updated over 1 year ago.

Status:
Fermé
Priority:
Normal
Assigned To:
Start date:
10/01/2022
Due date:
% Done:

100%

Remaining (hours):
0.0

0002-Backport-logging.patch View (2.81 KB) Benjamin Bohard, 10/25/2022 02:41 PM

History

#1 Updated by Benjamin Bohard over 1 year ago

  • Status changed from Nouveau to En cours

#2 Updated by Benjamin Bohard over 1 year ago

Il existe une option permettant de modifier le nom du programme associé aux journaux. Malheureusement, la version embarquée sur Ubuntu (3.4.4 + quelques patchs) n’est pas fonctionnelle de ce point de vue :

  • le nom du conteneur devrait normalement être utilisé à la place de conmon, ce qui ne nous arrangerait pas vu que ce nom est différent à chaque exécution ;
  • l’option tag ne semble pas avoir d’effet ;
  • les journaux sont en double (conmon + podman).

Testé avec succès avec la version 4.2.1 de podman sur une fedora pour vérifier (https://github.com/containers/podman/issues/13200).

#3 Updated by Benjamin Bohard over 1 year ago

Message type

Tue 2022-10-25 09:38:57.016532 CEST [s=9d2d7a93fbd249f6bdd681abe25e9bdd;i=192e3;b=87547c6b9b4e49698e582470139257e8;m=126320c17d;t=5ebd7002d4d6e;x=e7d9d2e8b4699622]
    PRIORITY=6
    _SELINUX_CONTEXT=unconfined
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=87547c6b9b4e49698e582470139257e8
    _MACHINE_ID=2fba12537a944bfcb8dc4e5f1a933366
    _HOSTNAME=scribe
    _TRANSPORT=journal
    _UID=0
    _GID=0
    _CAP_EFFECTIVE=1ffffffffff
    _SYSTEMD_CGROUP=/system.slice/eole-sso.service
    _SYSTEMD_UNIT=eole-sso.service
    CONTAINER_TAG=eole-sso
    CONTAINER_NAME=eolesso
    CODE_FILE=src/ctr_logging.c
    CODE_LINE=264
    CODE_FUNC=write_journald
    SYSLOG_IDENTIFIER=conmon
    _COMM=conmon
    _EXE=/usr/bin/conmon
    MESSAGE=comme sujet du certificat /etc/eolesso/eole.crt: 192.168.0.26
    _SYSTEMD_INVOCATION_ID=6a4cab08c250451382f7bffa51d9f76e
    CONTAINER_ID_FULL=c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44
    CONTAINER_ID=c678e2b2475d
    _PID=168074
    _CMDLINE=/usr/bin/conmon --api-version 1 -c c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44 -u c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44 -r /usr/bin/crun -b /var/lib/containers/storage/overlay-containers/c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44/userdata -p /run/containers/storage/overlay-containers/c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44/userdata/pidfile -n eolesso --exit-dir /run/libpod/exits --full-attach -s -l journald --log-level warning --runtime-arg --log-format=json --runtime-arg --log --runtime-arg=/run/containers/storage/overlay-containers/c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44/userdata/oci-log --log-tag eole-sso --conmon-pidfile /run/containers/storage/overlay-containers/c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44/userdata/conmon.pid --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /run/containers/storage --exit-command-arg --log-level --exit-command-arg warning --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /run/libpod --exit-command-arg --runtime --exit-command-arg crun --exit-command-arg --events-backend --exit-command-arg journald --exit-command-arg container --exit-command-arg cleanup --exit-command-arg --rm --exit-command-arg c678e2b2475d601e45d52b68032217856d743437da8f6776e71e2612a9a49f44
    _SOURCE_REALTIME_TIMESTAMP=1666683537016532

Tue 2022-10-25 09:38:57.016990 CEST [s=9d2d7a93fbd249f6bdd681abe25e9bdd;i=192d3;b=87547c6b9b4e49698e582470139257e8;m=126320bcad;t=5ebd7002d489e;x=f0b0ede69e1fb3dd]
    _TRANSPORT=stdout
    PRIORITY=6
    SYSLOG_FACILITY=3
    _SELINUX_CONTEXT=unconfined
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=87547c6b9b4e49698e582470139257e8
    _MACHINE_ID=2fba12537a944bfcb8dc4e5f1a933366
    _HOSTNAME=scribe
    _UID=0
    _GID=0
    _CAP_EFFECTIVE=1ffffffffff
    SYSLOG_IDENTIFIER=podman
    _COMM=podman
    _EXE=/usr/bin/podman
    _SYSTEMD_CGROUP=/system.slice/eole-sso.service
    _SYSTEMD_UNIT=eole-sso.service
    MESSAGE=comme sujet du certificat /etc/eolesso/eole.crt: 192.168.0.26
    _PID=167948
    _CMDLINE=/usr/bin/podman run --log-driver=journald --log-opt tag=eole-sso -v /etc/ssl/certs:/etc/ssl/certs:ro -v /etc/eolesso:/etc/eolesso -v /usr/share/sso/interface:/usr/share/sso/interface -v /usr/share/sso/app_filters:/usr/share/sso/app_filters -p 8443:8443 --name eolesso --rm hub.eole.education/eole/eole-sso-server:dev
    _SYSTEMD_INVOCATION_ID=6a4cab08c250451382f7bffa51d9f76e
    _STREAM_ID=5dd7f5cf243341889cbe308525261c64

Et côté rsyslog, avec la transmission par journald sur la socket /dev/log :

Debug line with all properties:
FROMHOST: 'scribe.domscribe.ac-test.fr', fromhost-ip: '127.0.0.1', HOSTNAME: 'scribe.domscribe.ac-test.fr', PRI: 14,
syslogtag 'conmon[165952]:', programname: 'conmon', APP-NAME: 'conmon', PROCID: '165952', MSGID: '-',
TIMESTAMP: 'Oct 25 09:28:08', STRUCTURED-DATA: '-',
msg: ' comme sujet du certificat /etc/eolesso/eole.crt: 192.168.0.26'
escaped msg: ' comme sujet du certificat /etc/eolesso/eole.crt: 192.168.0.26'
inputname: imuxsock rawmsg: '<14>Oct 25 09:28:08 conmon[165952]: comme sujet du certificat /etc/eolesso/eole.crt: 192.168.0.26'
$!:
$.:
$/:

On perd les champs en cours de route et comme la modification de APP-NAME avec le système de tag ne fonctionne pas, les options pour le filtrage s’amenuisent.

#4 Updated by Benjamin Bohard over 1 year ago

Avec le conteneur mongodb, les journaux semblent associés à podman seulement, et pas à conmon. C’est peut-être parce que l’applicatif ne renvoie pas ses messages sur la sortie standard.
Un montage a été effectué pour récupérer les journaux de l’application dans /var/log/mongodb.

#5 Updated by Benjamin Bohard over 1 year ago

Plusieurs solutions pour remettre les journaux dans le circuit rsyslog avec des filtres adéquats (par conteneur) :
  • le tag (non fonctionnel sur ubuntu)
  • l’écriture des journaux dans un fichier par conteneur et lecture de ces fichiers par rsyslog
  • utilisation du module imjournal de rsyslog plutôt que imuxsock pour récupérer les métadonnées depuis les entrées de journald (lecture depuis le fichier de journald, performances dissuassives si utilisé sur l’ensemble des messages)

La première méthode serait la plus simple mais ne semble pas envisageable (voir patch joint depuis la note suivante).
La deuxième méthode nécessite de faire attention à la taille des fichiers de logs intermédiaires et ne permet pas forcément d’associer les logs du conteneurs avec les logs du service lui-même (une partie gérée par podman pour le lancement, l’arrêt, etc et une partie gérée également avec conmon).
La troisième méthode ne paraît pas raisonnable, l’écriture dans un fichier journald spécifique ne semblant pas possible.

/usr/bin/podman run --log-driver=k8s-file --log-opt path=/var/log/container-eolesso.log --log-opt max-size=10M -v /etc/ssl/certs:/etc/ssl/certs:ro -v /etc/eolesso:/etc/eolesso -v /usr/share/sso/interface:/usr/share/sso/interface -v /usr/share/sso/app_filters:/usr/share/sso/app_filters -p 8443:8443  --name eolesso --rm hub.eole.education/eole/eole-sso-server:${CONTAINER_TAG}

module(load="imfile")
input(type="imfile" Facility="local0" File="/var/log/container-eolesso.log" Tag="eolesso")

Avec le problème de droits sur le fichier de log créé par podman (root:root vs syslog: nécessaire pour permettre à rsyslog de le lire).

#6 Updated by Benjamin Bohard over 1 year ago

Après test, il semble que le problème du tag provienne d’une mauvaise correspondance entre les versions de podman et de conmon distribuées par ubuntu.

Il manque, dans la version de conmon distribuée, la prise en compte de l’option. On peut patcher assez facilement pour que ce soit pris en compte.

#7 Updated by Benjamin Bohard over 1 year ago

On peut forcer l’identifiant syslog dans le fichier .service avec le paramètre SyslogIdentifier. C’est à utiliser en conjonction avec les options StandardOutput et StandardError avec la valeur journal (valeur par défaut, https://www.freedesktop.org/software/systemd/man/systemd.exec.html).

Cette méthode convient pour les services (eole-sso, mongodb) mais n’est pas applicable pour l’application graphique era.
L’application era n’est pas lancé via un service (ce n’en est pas un) et un "transient service" avec systemd-run, qui permettrait de passer le paramètre SyslogIdentifier, ne permet pas d’accéder à l’affichage.
J’ai tendance à penser que ce n’est pas bloquant, les messages aboutissant sur la sortie standard, donc visibles dans le terminal depuis lequel la commande a été lancée. Ces messages sont également triés par rsyslog dans le dossier conmon pour les raisons décrites précédemment.

#8 Updated by Benjamin Bohard over 1 year ago

  • Status changed from En cours to À valider

#9 Updated by Benjamin Bohard over 1 year ago

  • % Done changed from 0 to 100

#10 Updated by Ludwig Seys over 1 year ago

  • Status changed from À valider to Résolu

#11 Updated by Joël Cuissinat over 1 year ago

  • Status changed from Résolu to Fermé
  • Remaining (hours) set to 0.0

Also available in: Atom PDF