Система управления контейнерами 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

