Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016)
Материал из 0x1.tv
Содержание
Аннотация[править | править вики-текст]
- Докладчик
- Денис Пынькин
- Обзор современного состояния проекта Linux Containers project: LXC, LXD, LXCFS.
- Установка и настройка LXD для ALT Linux, с примером создания сервера с помощью mkimage.
- Использование LXC/LXD в качестве легковесной замены виртуальной машины при разработке ПО.
Видео[править | править вики-текст]
Слайды[править | править вики-текст]
Расширенные тезисы[править | править вики-текст]
Введение[править | править вики-текст]
Проект Linux Containers уже долгое время занимается развитием набора утилит LXC, позволяющего управлять локальными контейнерами. Основное отличие LXC от других подобных систем заключается в создании и управлении контейнерами уровня операционной системы[1].
В связи со взрывным ростом использования контейнеров в облачных средах активно развиваются системы управления контейнерами, такие как Docker. Поэтому логичным шагом для проекта Linux Containers стало создание своей системы управления — LXD, которая позволяет унифицировать управление множеством контейнеров LXC на разных хостах.
В докладе рассматриваются настройка и использование LXD[2] на основе опыта пакетирования проекта для ОС ALT Linux и портирования среды разработки коммерческого проекта в контейнер LXC.
Состав проекта[править | править вики-текст]
Проект состоит из трёх подпроектов:
-
LXC— ядро системы, обеспечивающее низкоуровневое управление контейнерами; -
LXD— «высокоуровневая» часть системы, предоставляющая единообразное API управления, а также утилиты командной строки; -
lxcfs— файловая система на базе FUSE, «скрывающая» реальные подсистемыprocfs,sysfsиcgroupfs, изолируя доступ к ним от программ, работающих внутри контейнеров.
Установка LXD[править | править вики-текст]
Установка LXD выполняется командой:
apt-get install lxd
В результате будут установлены две программы для управления LXC-контейнерами, написанные на языке Go: демон lxd и клиент lxc. Вместе с LXD устанавливаются необходимые подпроекты и зависимости:
-
lxcfs -
LXC
Требования:
- пакет
shadow-submap— утилитыsubuidиsubgidдля корректной работы непривилегированных контейнеров; -
criu— библиотека и утилиты для сохранения и восстановления контейнера, обеспечивающая в том числе «живую» миграцию между хостами.
Для понижения привилегий пользователя root используется механизм ядра Linux user namespaces. Для этого настраивается список подчинённых идентификаторов пользователя и групп, позволяющий установить соответствие пользователя внутри контейнера с реальным пользователем.
Чтобы пользователь root внутри контейнера имел реальный UID, отличный от «0», необходимо добавить соответствие подчинённых идентификаторов:
usermod -v 100000-165535 -w 100000-165535 root
Таким образом, «root» внутри контейнера будет иметь UID и GID равные «0», но снаружи все его процессы будут принадлежать пользователю из заданного диапазона. Это эффективно изолирует пользователя контейнера от привилегий хостовой ОС.
Дисковое пространство[править | править вики-текст]
LXD поддерживает различные типы хранилищ для контейнеров — от LVM до файловых систем btrfs и ZFS, которые ускоряют создание контейнеров и работу со снапшотами. Для эффективной работы с множеством однотипных контейнеров рекомендуется использовать скрипт lxd-setup-lvm-storage для создания файла-образа LVM-хранилища.
Сеть[править | править вики-текст]
Сеть в LXD может быть организована по-разному: от выделения контейнеру физического интерфейса до использования виртуального моста (bridge). Мост можно создать вручную или воспользоваться сервисом lxd-bridge, добавив настройки в файл конфигурации /etc/sysconfig/lxd-bridge.
Пользовательская конфигурация[править | править вики-текст]
Локальная конфигурация пользователя хранится в:
~/.config/lxc
Здесь содержатся ключи, сертификаты пользователя и параметры подключения к удалённым серверам LXD.
Системные образы[править | править вики-текст]
Одной из ключевых задач LXD является централизованное управление образами контейнеров. В старых версиях LXC для этого использовались отдельные скрипты-темплейты, создаваемые для каждого дистрибутива. В LXD реализовано хранилище готовых образов (архивов rootfs), которые можно подготовить вручную.
Типы образов:
-
unified— объединённый образ, подходящий для распространения готового продукта; -
split— разделённые metadata и rootfs, удобно при разработке.
Конфигурация контейнера[править | править вики-текст]
Каждый контейнер имеет собственную конфигурацию, включающую имя, описание, подключаемые устройства и уровень привилегий. Для однотипных контейнеров можно использовать профили, которые подключаются при создании или позднее через команду lxc profile apply ....
Пример профиля, выполняющего специфическую настройку проекта:
name: customername
config:
linux.kernel_modules: loop,tun
raw.lxc: |
lxc.init_cmd = /bin/bash /sbin/lxcinit
lxc.mount.auto = proc:rw sys:mixed cgroup:rw
lxc.autodev = 0
# tun
lxc.cgroup.devices.allow = c 10:200 rwm
# loop for images creation
lxc.cgroup.devices.allow = b 7:* rwm
security.nesting: "true"
security.privileged: "true"
description: ""
devices:
eth0:
name: eth0
nictype: bridged
parent: lxcbr0
type: nic
modules:
path: /lib/modules
readonly: "true"
source: /lib/modules
type: disk
Пример создания контейнера[править | править вики-текст]
Создание профиля:
lxc profile create customername cat profile.yaml | lxd profile edit customername
Пример минимального файла-описания metadata.yaml:
architecture: "x86_64" creation_date: 1470920887 properties: architecture: "x86_64" description: "Custom development image" os: "fedora" release: "1.2.3" templates:
Создание образа формата split:
tar -czf custom.tar.gz metadata.yaml tar -C <путь_к_корню> -czf rootfs.tar.gz .
Импортирование образа в LXD:
lxc image import custom.tar.gz rootfs.tar.gz --alias imagename
Создание и запуск контейнера:
lxc launch imagename name -p customername
LXD в ALT Linux[править | править вики-текст]
В ALT Linux доступны пакеты со всеми необходимыми компонентами LXD. Для тестирования и образовательных целей[3] был разработан минимальный Live-сервер на основе ALT Linux.
С помощью инструмента mkimage-profiles[4] создание кастомного образа сводится к конфигурированию списка пакетов, сервисов и параметров сети для контейнеров с использованием lxd-bridge.
Исходный код сервера (ветка lxd):
[5]
Примечания и отзывы[править | править вики-текст]
- ↑ Stéphane Graber. LXC 1.0: Blog post series. [1]
- ↑ Stéphane Graber. LXD 2.0: Blog post series. [2]
- ↑ Открытый проект Linux development courses project. [3]
- ↑ Michael Shigorin. mkimage-profiles: долгая дорога в 0.9.x. [4]
Plays:161 Comments:0

