Встречайте - cl-lxc для управления контейнерами!

LXC контейнеры давно и прочно вошли в нашу жизнь. В нашей компании их количество исчисляется десятками. Контейнеры можно легко и быстро развернуть, настроить, но вот дальнейшее сопровождение начинает вызывать определенные затруднения. Обновления сервисов со временем начинают требовать более свежие версии библиотек. Это требует обновлений уже устаревших систем. И тут мы вспоминаем, что контейнер давно не обновлялся. Длительный период обновления контейнера может на время поломать работу запущенных в нем служб. Результат обновления может также оказаться непредсказуемым, т.к. обновляются сразу все пакеты. Есть ещё проблема занимаемого места на диске, ведь в каждом контейнере хранится копия портежей и скачиваемые пакеты.

Мы долгое время не обращали на это внимание, ведь у LXC есть собственные утилиты развертывания и настройки, пока проблема не стала отнимать значительное время. А это не то, к чему мы стремимся. Итак, представляем вашему вниманию новую утилиту cl-lxc. Программа написана на BASH и входит в состав пакета sys-apps/calculate-toolkit начиная с версии 0.3.0.

Особенности

  • Поддержка обновления контейнеров из образа
  • Уменьшения использования дисковой памяти
  • Поддержка файловой системы Btrfs

Для обновления контейнеров, cl-lxc использует традиционный для Calculate Linux способ обновления из образа. Для этого раздел /var/calculate системы вынесен в отдельную точку монтирования. Перед обновлением программа подготавливается образ: развертывает и обновляет контейнер, устанавливает дополнительные пакеты, которые были установлены в обновляемой системе. После этого во время перезагрузки происходит замещение корня системы. Все данные остаются в /var/calculate, а настройки применяются шаблонами во время первой загрузки.

Во время своей работы cl-lxc использует кэш. Вы можете развернуть десятки контейнеров в максимально короткое время. Подготовленный для обновления образ кэшируется и может использоваться для последующих обновлений. Контейнеры настроены таким образом, чтобы использовать портежи хостовой машины. В результате размер развернутого Calculate Container Scratch занимает всего около 1,2 Гб. Если вы используете файловую систему Btrfs, то утилита будет использовать reflink при копировании и позаботиться о создании подтома для новых контейнеров. В отличие от lxc-create, cl-lxc создаст подтом для директории контейнера, а не для rootfs. Это удобно, так как в отдельном подтоме контейнера может какое-то время оставаться несколько корневых образов системы.

Установка

Убедитесь, что у вас установлен пакет sys-apps/calculate-toolkit версии 0.3.0 или выше.

Установите утилиты LXC:

emerge -a app-containers/lxc

Настройка хостовой машины

Контейнеры, настраиваемые утилитой cl-lxc монтирует портежи и оверлеи с хостовой машины, но оверлея Container по-умолчанию в хостовой машине нет. Чтобы оверлей обновлялся в контейнере, его следует добавить. Для этого отредактируйте файл /var/calculate/calculate.env добавив в него:

[update]
cl_update_rep_name = gentoo,calculate,distros,container
cl_update_rep_url = https://git.calculate-linux.org/calculate/gentoo-overlay,https://git.calculate-linux.org/calculate/calculate-overlay,https://git.calculate-linux.org/calculate/distros-overlay,https://git.calculate-linux.org/calculate/container-overlay

Выполните синхронизацию портежей, чтобы убедиться, что оверлей Container подключен, выполнив cl-update --sync-only:

Создание контейнера

Для создания контейнера “test”, выполните cl-lxc --create test:

После выполнения будет создан путь /var/calculate/lxc с директорией с контейнера test. Для запуска контейнера достаточно выполнить:
lxc-start test

Для подключения к контейнеру выполните:
lxc-attach test

Обратите внимание, что приглашение пользователя root в контейнере имеет другой цвет.

Если в хостовой системе не настроен сетевой мост, то настройки сети будут наследованы контейнером.

Обновление

Помимо традиционного способа обновления контейнера при помощи cl-update или emerge, вы можете использовать обновление образом. При подготовке нового образа, утилита cl-lxc переносит сет custom (/etc/portage/sets/custom) из контейнера. Поэтому устанавливая пакеты, прописывайте их в этот сет. Помимо удобного переноса, вы всегда будете знать, что и зачем вы устанавливали в систему из дополнительного программного обеспечения.

Простой пример установки текстового редактора Vim:

Теперь давайте подготовим образ для обновления вашего контейнера. Для этого в хостовой машине достаточно выполнить:
cl-lxc --prepare test

На время будет создан временный контейнер, перенесен сет custom и выполнено обновление. После этого контейнер будет сохранен в кэше /var/calculate/lxc/.cache/rootfs-test и удален.

Теперь, чтобы обновить ваш контейнер, достаточно выполнить cl-lxc --upgrade test:

Вся операция займет несколько секунд. В директории /var/calculate/lxc/test будет файл config с настройками контейнера, директория calculate монтируемая в /var/calculate контейнера и два образа с корнем rootfs и rootfs1. После проверки работоспособности директорию rootfs можно будет удалить.

Обратите внимание, что настройки сети, языка и локали, списка пакетов были перенесены из обновляемой системы в новую во время обновления. Дальнейшие настройки можно переносить при помощи шаблонов, а сами данные разместить в разделе /var/calculate.

Шаблоны

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

В директории calculate/templates при подготовке контейнера уже создаются базовые шаблоны для настройки сервера бинарных обновлений. Давайте рассмотрим их подробней.

Для удобства, все базовые шаблоны настройки контейнера находятся в директории default. Свойства директории описаны в файле .calculate_directory:

# Calculate env=install ac_install_live==on append=skip

Где:

  • env=install - описывает область действия переменных
  • ac_install_live==on - проверка на событие установки пакета. Подробнее можно прочитать в /var/db/repos/calculate/profiles/templates/3.6/3_ac_install_live/README-rus.txt.
  • append=skip - пропускает перенос директории в настраиваемую систему

Шаблон portage.binhost имеет примерно следующее содержимое:

# Calculate mergepkg(sys-apps/portage)!= path=/etc/portage/make.conf name=binhost protected comment=#
PORTAGE_BINHOST="https://mirror.calculate-linux.org/grp/x86_64"

Где:

  • mergepkg(sys-apps/portage)!= - проверка наличия пакета sys-apps/portage
  • path=/etc/portage/make.conf name=binhost - путь и имя исправляемого файла
  • protected - не связывать создаваемый файл с пакетом sys-apps/portage
  • comment=# - символ разделителя комментариев

Шаблон runlevel.eth0 создается в том случае, если на хостовой машине настроен bridge. Он имеет следующее содержимое:

# Calculate mergepkg(sys-apps/openrc)!= path=/etc/runlevels/default name=net.eth0 protected link=/etc/init.d/net.lo symbolic

Где:
link=/etc/init.d/net.lo symbolic - означает создание символической ссылки на /etc/init.d/net.lo.

Заключение

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

4 Likes