Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016)

Материал из 0x1.tv

Аннотация[править | править вики-текст]

Докладчик
Денис Пынькин.jpg
Денис Пынькин
  • Обзор современного состояния проекта Linux Containers project: LXC, LXD, LXCFS.
  • Установка и настройка LXD для ALT Linux, с примером создания сервера с помощью mkimage.
  • Использование LXC/LXD в качестве легковесной замены виртуальной машины при разработке ПО.

Видео[править | править вики-текст]

on youtube

Слайды[править | править вики-текст]

Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016).pdf

Расширенные тезисы[править | править вики-текст]

Введение[править | править вики-текст]

Проект 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]

Примечания и отзывы[править | править вики-текст]

  1. Stéphane Graber. LXC 1.0: Blog post series. [1]
  2. Stéphane Graber. LXD 2.0: Blog post series. [2]
  3. Открытый проект Linux development courses project. [3]
  4. Michael Shigorin. mkimage-profiles: долгая дорога в 0.9.x. [4]
Система управления контейнерами LXD (Денис Пынькин, OSSDEVCONF-2016)!.jpg

Plays:161   Comments:0