Мониторинг контейнеров#
Используйте команды Podman для управления средой. С их помощью можно определить состояние контейнера, благодаря информации о системе и pod, а также отслеживать события Podman.
Проверка состояния контейнера#
Можно использовать проверку состояния, чтобы определить готовность процесса, запущенного внутри контейнера.
Если проверка прошла успешно, контейнер помечается как healthy. В противном случае присваивается статус unhealthy. Можно сравнить проверку состояния с выполнением команды podman exec и проверкой кода завершения. Нулевое значение отражает, что контейнер healthy.
Проверки состояния можно установить при создании образа с помощью инструкции HEALTHCHECK в файле Containerfile или при создании контейнера в командной строке. Для отображения состояние проверки состояния (health-check status) используйте команды podman inspect или podman ps.
Проверка состояния состоит из шести основных компонентов:
Command (опция
--health-cmd) - выполняет команду внутри целевого контейнера и ждет кода завершения;Retries (опция
--health-retries) - определяет количество последовательных неудачных проверок, которые должны произойти до того, как контейнер будет помечен какunhealthy. Успешная проверка состояния сбрасывает счетчик повторений;Interval (опция
--health-interval) - описывает время между выполнением команды проверки. Обратите внимание, небольшие интервалы заставляют систему тратить много времени на проверку. Большие интервалы вызывают трудности с тайм-аутами;Start-period (опция
--health-start-period) - устанавливает время между запуском контейнера и моментом, когда нужно пропускать сбои проверки состояния;Timeout (опция
--health-timeout) - описывает период времени, в течение которого проверка должна быть завершена, прежде чем попытка будет считаться неудачной;Container recovery (опция
--health-on-failure) - определяет, какие действия выполнять при состоянииunhealthy. Когда приложение выходит из строя, Podman автоматически перезапускает его.
Компоненты, связанные с планированием проверки, необязательны.
Опция --health-on-failure поддерживает четыре действия:
none- не предпринимает никаких действий (значение по умолчанию);kill- останавливает контейнер;restart- перезапускает контейнер;stop- приостанавливает контейнер.
Примечание
Опция --health-on-failure доступна в Podman 4.2 и более поздних версиях.
Важно
Не объединяйте команду restart с опцией --restart. При работе внутри systemd unit рассмотрите возможность использования действия kill или stop, чтобы использовать политику перезапуска systemd.
Проверки состояния проходят внутри контейнера. Они имеют смысл только в том случае, если известно какие существуют состояния службы и можно провести различие между успешной и неудачной проверкой.
Выполнение проверки работоспособности через командную строку#
Можно установить проверку работоспособности из командной строки при создании контейнера.
Запустите проверку работоспособности:
podman run -dt --name=hc-container -p 8080:8080 --health-cmd='curl http://localhost:8080 || exit 1' --health-interval=0 registry.example.ru/ubi8/httpd-24В данной команде опции выполняют следующие действия:
--health-cmd- устанавливает команду проверки работоспособности для контейнера;--health-interval=0со значением 0 - указывает, что проверка работоспособности запускается вручную.
Проверьте состояние контейнера
hc-container:С помощью команды
podman inspect:podman inspect --format='{{json .State.Health.Status}}' hc-containerПример вывода команды:
healthyС помощью команды
podman ps:podman psПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-containerС помощью команды
podman healthcheck run:podman healthcheck run hc-containerПример вывода команды:
healthy
Выполнение проверки работоспособности с помощью Containerfile#
Можно выполнять проверку работоспособности, используя инструкцию HEALTHCHECK в файле Containerfile.
Создайте
Containerfile:cat ContainerfileПример вывода команды:
FROM registry.example.ru/ubi8/httpd-24 EXPOSE 8080 HEALTHCHECK CMD curl http://localhost:8080 || exit 1Примечание
Инструкция
HEALTHCHECKподдерживается только для формата образаdocker. Для формата образаociинструкция не учитывается.Создайте контейнер и добавьте имя образа:
podman build --format=docker -t hc-container .Пример вывода команды:
STEP 1/3: FROM registry.example.ru/ubi8/httpd-24 STEP 2/3: EXPOSE 8080 --> 5aea97430fd STEP 3/3: HEALTHCHECK CMD curl http://localhost:8080 || exit 1 COMMIT health-check Successfully tagged localhost/health-check:latest a680c6919fe6bf1a79219a1b3d6216550d5a8f83570c36d0dadfee1bb74b924eЗапустите контейнер:
podman run -dt --name=hc-container localhost/hc-containerПроверьте статус работоспособности контейнера
hc-container:С помощью команды
podman inspect:podman inspect --format='{{json .State.Health.Status}}' hc-containerПример вывода команды:
healthyС помощью команды
podman ps:podman psПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-containerС помощью команды
podman healthcheck run:podman healthcheck run hc-containerПример вывода команды:
healthy
Отображение системной информации о Podman#
Команда podman system позволяет управлять системами Podman, отображая системную информацию:
Для отображения использования дисков введите:
podman system dfПример вывода команды:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 2 1.085GB 233.4MB (0%) Containers 2 0 28.17kB 28.17kB (100%) Local Volumes 3 0 0B 0B (0%)Для раскрытия детальной информации об использовании пространства введите:
podman system df -vПример вывода команды:
Images space usage: REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS registry.example.ru/ubi9 latest b1e63aaae5cf 13 days 233.4MB 233.4MB 0B 0 registry.example.ru/ubi9/httpd-24 latest 0d04740850e8 13 days 461.5MB 0B 461.5MB 1 registry.example.io/rhel8/podman latest dce10f591a2d 13 days 390.6MB 233.4MB 157.2MB 1 Containers space usage: CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES 311180ab99fb 0d04740850e8 /usr/bin/run-httpd 0 28.17kB 16 hours exited hc1 bedb6c287ed6 dce10f591a2d podman run ubi9 echo hello 0 0B 11 hours configured dazzling_tu Local Volumes space usage: VOLUME NAME LINKS SIZE 76de0efa83a3dae1a388b9e9e67161d28187e093955df185ea228ad0b3e435d0 0 0B 8a1b4658aecc9ff38711a2c7f2da6de192c5b1e753bb7e3b25e9bf3bb7da8b13 0 0B d9cab4f6ccbcf2ac3cd750d2efff9d2b0f29411d430a119210dd242e8be20e26 0 0BДля раскрытия информации о хосте, текущей статистике хранилища и сборке Podman используйте:
podman system infoПример вывода команды:
host: arch: amd64 buildahVersion: 1.22.3 cgroupControllers: [] cgroupManager: cgroupfs cgroupVersion: v1 conmon: package: conmon-2.0.29-1.module+el8.5.0+12381+e822eb26.x86_64 path: /usr/bin/conmon version: 'conmon version 2.0.29, commit: 7d0fa63455025991c2fc641da85922fde889c91b' cpus: 2 distribution: distribution: '"rhel"' version: "8.5" eventLogger: file hostname: localhost.localdomain idMappings: gidmap: - container_id: 0 host_id: 1000 size: 1 - container_id: 1 host_id: 100000 size: 65536 uidmap: - container_id: 0 host_id: 1000 size: 1 - container_id: 1 host_id: 100000 size: 65536 kernel: 4.18.0-323.el8.x86_64 linkmode: dynamic memFree: 352288768 memTotal: 2819129344 ociRuntime: name: runc package: runc-1.0.2-1.module+el8.5.0+12381+e822eb26.x86_64 path: /usr/bin/runc version: |- runc version 1.0.2 spec: 1.0.2-dev go: go1.16.7 libseccomp: 2.5.1 os: linux remoteSocket: path: /run/user/1000/podman/podman.sock security: apparmorEnabled: false capabilities: CAP_NET_RAW,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT rootless: true seccompEnabled: true seccompProfilePath: /usr/share/containers/seccomp.json selinuxEnabled: true serviceIsRemote: false slirp4netns: executable: /usr/bin/slirp4netns package: slirp4netns-1.1.8-1.module+el8.5.0+12381+e822eb26.x86_64 version: |- slirp4netns version 1.1.8 commit: d361001f495417b880f20329121e3aa431a8f90f libslirp: 4.4.0 SLIRP_CONFIG_VERSION_MAX: 3 libseccomp: 2.5.1 swapFree: 3113668608 swapTotal: 3124752384 uptime: 11h 24m 12.52s (Approximately 0.46 days) registries: search: - registry.fedoraproject.org - registry.example.ru - registry.centos.org - docker.io store: configFile: /home/user/.config/containers/storage.conf containerStore: number: 2 paused: 0 running: 0 stopped: 2 graphDriverName: overlay graphOptions: overlay.mount_program: Executable: /usr/bin/fuse-overlayfs Package: fuse-overlayfs-1.7.1-1.module+el8.5.0+12381+e822eb26.x86_64 Version: |- fusermount3 version: 3.2.1 fuse-overlayfs: version 1.7.1 FUSE library version 3.2.1 using FUSE kernel interface version 7.26 graphRoot: /home/user/.local/share/containers/storage graphStatus: Backing Filesystem: xfs Native Overlay Diff: "false" Supports d_type: "true" Using metacopy: "false" imageStore: number: 3 runRoot: /run/user/1000/containers volumePath: /home/user/.local/share/containers/storage/volumes version: APIVersion: 3.3.1 Built: 1630360721 BuiltTime: Mon Aug 30 23:58:41 2021 GitCommit: "" GoVersion: go1.16.7 OsArch: linux/amd64 Version: 3.3.1Для удаления всех неиспользуемых контейнеров, образов и данных тома используйте команду:
podman system pruneПример вывода команды:
WARNING! This will remove: - all stopped containers - all stopped pods - all dangling images - all build cache Are you sure you want to continue? [y/N] yВ данном примере:
Команда
podman system pruneудаляет все неиспользуемые контейнеры (зависшие и без ссылок), pods и, опционально, тома из локального хранилища;Опция
--allудаляет все неиспользуемые образы. Неиспользуемые образы — это зависшие образы и образы, на основе которых нет никаких контейнеров;Опция
--volumeудаляет тома. По умолчанию тома не удаляются, чтобы предотвратить потерю важных данных при отсутствии контейнера.
Типы событий Podman#
Можно отслеживать события, происходящие в Podman. Существует несколько типов событий, и каждый сообщает о разных статусах.
Тип события container сообщает о следующих статусах:
attach;checkpoint;cleanup;commit;create;exec;export;import;init;kill;mount;pause;prune;remove;restart;restore;start;stop;sync;unmount;unpaus.
Тип события pod сообщает о следующих статусах:
create;kill;pause;remove;start;stop;unpause.
Тип события image сообщает о следующих статусах:
prune;push;pull;save;remove;tag;untag.
Тип события system сообщает о следующих статусах:
refresh;renumber.
Тип события volume сообщает о следующих статусах:
create;prune;remove.
Мониторинг событий Podman#
Можно отслеживать и отображать события, которые происходят в Podman, с помощью команды podman events. Каждое событие будет включать в себя метку времени, тип, статус, имя, если это применимо, и образ, если это возможно.
Запустите контейнер
myubi:podman run -q --rm --name=myubi registry.example.ru/ubi8/ubi:latestРаскройте события Podman:
Для отображения всех событий введите:
now=$(date --iso-8601=seconds) podman events --since=now --stream=falseПример вывода команды:
2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi,...) 2023-03-08 14:27:20.652325082 +0100 CET image pull registry.example.com/ubi8/ubi:latest 2023-03-08 14:27:20.795695396 +0100 CET container init d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi...) 2023-03-08 14:27:20.809205161 +0100 CET container start d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi...) 2023-03-08 14:27:20.809903022 +0100 CET container attach d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi...) 2023-03-08 14:27:20.831710446 +0100 CET container died d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi...) 2023-03-08 14:27:20.913786892 +0100 CET container remove d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.ru/ubi8/ubi:latest, name=myubi...)Опция
--stream=falseгарантирует, что выполнение командыpodman eventsзавершится при чтении последнего известного события.Список событий, происходящих в
podman run, может включать:container create- создание нового контейнера;image pull- получении образа, если образ контейнера отсутствует в локальном хранилище;container init- инициализация контейнера во время выполнения и настройки сети;container start- запуск контейнера;container attach- присоединение к терминалу контейнера. Такое событие происходит, если контейнер работает в приоритетном режиме;container died- выход из контейнера;container remove- удаление контейнера после выхода из него (если указан флаг--rm).
Для отображения событий Podman используйте команду
journalctl:journalctl --user -r SYSLOG_IDENTIFIER=podmanПример вывода команды:
Mar 08 14:27:20 fedora podman[129324]: 2023-03-08 14:27:20.913786892 +0100 CET m=+0.066920979 container remove ... Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>Чтобы отобразить события Podman, связанные с созданием контейнеров, введите:
podman events --filter event=create2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.example.com/ubi8/ubi:latest, name=myubi,...)Можно также использовать команду
journalctl:journalctl --user -r PODMAN_EVENT=createПример вывода команды:
Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>
Использование событий Podman для аудита#
В предыдущих версиях события (в выводе команд) должны были связываться с событием для правильной интерпретации. Например, событие container-create должно было связываться с событием image-pull для понимания, какой образ использовался. Событие container-create не включало все данные, например, настройки безопасности, тома, точки монтирования и так далее.
Начиная с Podman v4.4, можно получить всю соответствующую информацию о контейнере непосредственно из одного события и записи в journald. Данные представлены в формате JSON, соответствующем команде podman container inspect, и включают в себя все настройки конфигурации и безопасности контейнера. Можно настроить Podman, присоединив данные проверки контейнера для целей аудита.
Измените файл
~/.config/containers/containers.confи добавьте опциюevents_container_create_inspect_data=trueв раздел [engine]:cat ~/.config/containers/containers.confПример вывода команды:
[engine] events_container_create_inspect_data=trueДля общесистемной конфигурации измените файл
/etc/containers/containers.confили/usr/share/container/containers.conf.Создайте контейнер:
podman create registry.example.ru/ubi8/ubi:latestПример вфвода команды:
19524fe3c145df32d4f0c9af83e7964e4fb79fc4c397c514192d9d7620a36cd3Отобразите события Podman:
С помощью команды
podman events:now=$(date --iso-8601=seconds) podman events --since $now --stream=false --format "{{.ContainerInspectData}}" | jq “.Config.CreateCommand"Пример вывода команды:
[ "/usr/bin/podman", "create", "registry.example.com/ubi8" ]В данном примере:
Опция
--format "{{.ContainerInspectData}}"отображает данные проверки;jq ". Config.CreateCommand"преобразует данные JSON в более читаемый формат и отображает параметры для командыpodman create.
Используя команду
journalctl:journalctl --user -r PODMAN_EVENT=create --all -o json | jq ".PODMAN_CONTAINER_INSPECT_DATA | fromjson" | jq ".Config.CreateCommand"Пример вывода команды:
[ "/usr/bin/podman", "create", "registry.example.ru/ubi8" ]Выводы события
podmanи командыjournalctlсовпадают.