Поиск по сайту:

Как включить автоматическое обновление контейнеров Podman


Podman — это платформа контейнеризации, совместимая с OCI, которая часто используется вместо Docker. Его модель без демонов и обширный набор функций делают его хорошим кандидатом для использования как в разработке, так и в производстве.

В этой статье мы покажем, как использовать систему автоматического обновления Podman для перезапуска ваших контейнеров при выпуске новых образов. Podman можно настроить на периодическую проверку обновлений, извлечение последнего образа и повторное создание затронутых контейнеров с использованием их текущих настроек.

Зачем автоматически обновлять контейнеры?

Контейнеры часто недолговечны, но их все равно необходимо регулярно обслуживать. Критическая уязвимость внутри образа может дать злоумышленникам плацдарм в вашем приложении, которое будет использовано в течение нескольких часов после его обнаружения.

Большинство популярных контейнерных технологий требуют, чтобы вы вручную обновляли свои контейнеры. Это возлагает на операционные группы бремя подписки на объявления о выпуске и создания инструментов, которые внедряют новые изменения.

Встроенная система обновления контейнеров Podman решает эту проблему и поддерживает актуальность рабочих нагрузок. Контейнеры можно быстро обновлять после отправки новых версий образов, что обеспечивает уверенность в том, что в ваших развертываниях установлены последние исправления и исправления ошибок.

Включение автоматического обновления

Автообновления активируются для контейнера путем установки метки io.containers.autoupdate при его создании.

$ podman run -d -p 8080:80 \
    --name nginx-container \
    --label io.containers.autoupdate=registry \
    docker.io/library/nginx:latest

Метка может иметь два возможных значения:

  • registry — во время проверки обновлений Podman свяжется с реестром образов, чтобы проверить, доступна ли новая версия тега, используемого вашим контейнером. В этом случае образ будет извлечен, и ваш контейнер перезапустится. Обновления реестра работают только в том случае, если вы используете полный путь реестра — ссылка docker.io/library/nginx:latest, показанная выше, является преднамеренной, так как nginx:latest слишком расплывчато.
  • local — этот метод обновления ограничивает Podman просмотром образов контейнеров, которые уже существуют в файловой системе вашего хоста. Контейнер будет перезапущен, если локальная версия тега изображения отличается от версии, в которой запущен контейнер. Это может быть полезно при перестроении изображений во время разработки.

Наличие метки делает этот пример контейнера NGINX пригодным для автоматического обновления. Однако требуется дополнительная работа, прежде чем обновления могут быть действительно применены.

Создание службы Systemd

Механизм обновления Podman требует, чтобы ваши контейнеры работали внутри сервисов systemd. Поскольку Podman не содержит демонов, ему не хватает центрального контроллера, который может запускать и останавливать ваши контейнеры. Обертывание их в службу systemd обеспечивает возможности управления жизненным циклом и возможность перезапуска в ответ на определенные события.

Интерфейс командной строки Podman включает команду, которая создает определение модуля systemd из контейнера:

$ podman generate systemd --name nginx-container > /etc/systemd/system/nginx-container.service

Приведенные выше команды создают новый контейнер NGINX со службой systemd в правильном месте.

Затем перезагрузите systemd, чтобы зарегистрировать определение службы, затем включите и запустите службу:

$ systemctl daemon-reload
$ systemctl enable nginx-container.service
$ systemctl start nginx-container.service

Ваш контейнер NGINX теперь является службой systemd, которая запускается автоматически при загрузке вашего хоста. Вы можете использовать команды systemctl для запуска и остановки контейнера вместо интерфейса командной строки Podman:

$ systemctl start nginx-container.service
$ systemctl stop nginx-container.service

Чтобы удалить контейнер в будущем, вы должны остановить, отключить и удалить юнит-файл службы. После этого перезапустите systemd, чтобы полностью применить изменения.

$ systemctl stop nginx-container.service
$ systemctl disable nginx-container.service
$ rm /etc/systemd/system/nginx-container.service
$ systemctl daemon-reload

Выполнение обновления

Теперь все настроено для успешного автоматического обновления контейнера NGINX. Вы можете запустить проверку обновлений по запросу с помощью команды Podman auto-update:

$ 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

Это обновляет контейнеры в службах systemd, которые доступны пользователю, выполняющему команду. Вам может понадобиться использовать sudo, чтобы следовать приведенному выше примеру; если это так, запустите команду auto-update также от имени пользователя root:

$ sudo podman auto-update

В этом примере использовалась стратегия обновления registry, поэтому Podman подключается к реестру образов, проверяет наличие изменений и затем извлекает новый образ, если он применим. Вывод команды указывает, был ли обновлен каждый контейнер службы.

Поскольку контейнеры управляются systemd, Podman может определить, успешно ли запущен новый контейнер. Podman автоматически откатится к предыдущей версии образа, если будет обнаружен сбой обновления. Чтобы это работало надежно, приложение внутри контейнера должно уведомлять systemd об успешном запуске. Это можно сделать, запустив systemd-notify --ready.

Проверка обновлений

Иногда вам может понадобиться проверить, доступны ли обновления для вашего контейнерного парка, не применяя их немедленно. Используйте команду auto-update с флагом --dry-run, чтобы получить список сервисов, где опубликовано обновленное изображение:

$ podman auto-update --dry-run
...
UNIT                     CONTAINER      IMAGE                               POLICY      UPDATED
nginx-container.service  2de4ba96b09    docker.io/library/nginx:latest      registry    pending

Для служб, обозначенных как ожидающие, доступно обновление.

Применение обновлений по расписанию

Теперь мы успешно настроили обновления контейнеров по требованию. Вам не нужно вручную извлекать новые образы или перезапускать контейнеры. Последним шагом является настройка расписания, чтобы Podman периодически применял обновления, не запуская команду auto-update.

Большинство дистрибутивов Podman для этой цели включают системный таймер. Вы можете активировать таймер с помощью systemctl:

$ systemctl enable podman-auto-update.timer

Таймер настроен на проверку обновлений каждый день. Вы можете настроить расписание, открыв файл таймера с помощью systemctl edit и изменив значение поля OnCalendar:

$ systemctl edit podman-auto-update.timer

[Timer]
OnCalendar=Fri *-*-* 18:00

Выражение времени, показанное выше, будет запускать проверку обновлений каждую пятницу в 18:00. Синтаксис задокументирован в руководстве systemd.

Теперь, когда таймер включен, вы можете начать развертывание своих контейнеров с меткой io.containers.autoupdate. Они будут периодически обновляться и перезапускаться, автоматизируя процедуры обслуживания.

Вам не нужно использовать системный таймер Podman для создания расписания обновлений. Вы можете запустить автоматическое обновление podman внутри вашего существующего инструментария или другого планировщика заданий, такого как cron.

Краткое содержание

Автоматические обновления Podman позволяют перемещать контейнеры в новые версии образов без их ручного перезапуска или использования внешних инструментов. Это может помочь вам поддерживать свой парк контейнеров, поскольку образы выпускают исправления ошибок и исправления безопасности.

Хотя автоматические обновления являются полезным инструментом, их не следует использовать без должного внимания. Разрешение автоматических обновлений может привести к собственным проблемам, если поврежденный образ будет случайно выпущен. Контейнеры, которые перезапускаются сами по себе, также могут привести к простою или нарушению работы зависимых служб.

Следовательно, вы должны оценить пригодность вашего собственного приложения, прежде чем внедрять это решение. Один промежуточный подход заключается в периодическом запуске auto-update --dry-run и отправке результатов в службу мониторинга. Это информирует вас о доступных обновлениях, не подвергая риску их применения без утверждения.