Управление контейнерами с LXD
Продолжаем наш цикл статей о контейнеризации. Если первые две статьи (1 и 2) были посвящены теории, то сегодня мы поговорим о вполне конкретном инструменте и об особенностях его практического использования. Предметом нашего рассмотрения будет LXD (сокращение от Linux Container Daemon), созданный канадцем Стефаном Грабе из компании Canonical.
Имя создателя LXD хорошо известно в профессиональном сообществе: он также является одним из авторв другого популярного контейнерного решения — LXC. Собственно, LXD представляет собой надстройку над LXC, которая упрощает работу с контейнерами и добавляет широкий спектр новых возможностей.
В рамках этой статьи мы ограничимся лишь кратким введением в LXD: сравним его с Docker, приведём инструкцию по установке и настройке, а также продемонстрируем базовые возможности управления контейнерами.
LXD и Docker
LXD — инструмент относительно новый: первая версия вышла в свет в 2014 году, когда Docker уже получил широкое распространение и хорошо зарекомендовал себя на практике.
Как и Docker, LXD функционирует на базе LXC.
При этом cфера применения у двух инструментов совершенно разная: если Docker предназначен для запуска в контейнерах приложений, то LXD — для запуска полноценных операционных систем.
С помощью LXD можно создавать даже не контейнеры в буквальном смысле этого слова, а легковесные виртуальные машины. Чтобы подчеркнуть этот момент и одновременно указать на отличие от других инструментов контейнеризации, авторы многих публикаций называют LXD словом lightvisor (на русский язык его уже переводят как «легковизор»).
В публикациях Canonical отмечается, что LXD-контейнеры могут работать в 10 раз быстрее, чем традиционные виртуальные машины на базе KVM.
В LXD предпринята попытка решить целый ряд проблем, с которыми приходится сталкиваться при работе с другими инструментами контейнеризации: продуман механизм динамического управления ресурсами, расширены возможности миграции контейнеров (в том числе и в режиме реального времени), устранены проблемы безопасности. По сравнению с Docker у LXD гораздо шире возможности переконфигурации контейнеров.
LXD оснащён открытым API; имеются клиенты для различных языков программирования. Создан плагин для OpenStack, позволяющий управлять контейнерами с помощью клиента Nova.
Установка и настройка
Здесь и далее мы будем описывать особенности работы c LXD на материале Ubuntu 16.04. В этой ОС LXD включён в официальные репозитории и устанавливается стандартным способом:
Стефан Грабе в своей статье рекомендует в качестве бэкенда для хранения контейнеров использовать файловую систему ZFS. Чтобы работать с ZFS, нужно установить соответствующие пакеты:
Если ZFS вам по тем или иным причинам не подходит, вы можете воспользоваться BTRFS или LVM (подробнее об этом см. здесь).
По завершении установки выполним команду:
Программа настройки задаст несколько простых вопросов, после чего всё будет сконфигурировано автоматически. Подробнее об особенностях настройки LXD можно прочитать в этой статье.
Создание контейнера
Все контейнеры в LXD создаются на базе образов. Образы можно получить как из локального, так и из удалённого репозитория. Просмотрим список доступных репозиториев:
Для первого знакомства с LXD вполне подойдёт локальный репозиторий (local). Запустим в контейнере ОС Ubuntu 16.04:
В результате выполнения этой команды LXD создаст на базе указанного образа контейнер и запустит его.
Запустить в этом контейнере командную оболочку можно с помощью команды:
Если нужно просто создать контейнер, но не запускать его, достаточно выполнить команду:
Для последующего запуска и остановки контейнера используются команды lxc start и lxc stop.
LXC предоставляет хорошие возможности для управления контейнерами «на лету». Вот так, например, можно поместить созданный на основном хосте файл внутрь контейнера:
Можно совершить и обратную операцию — загрузить файл из контейнера на основной хост:
Можно и редактировать файлы в контейнере напрямую:
Основные команды для создания и запуска контейнеров мы уже рассмотрели; желающих узнать больше отсылаем к подробной статье Стефана Грабе.
Управление ресурсами
Управление изолированными окружениями немыслимо без контроля ресурсов: мы должны предоставить контейнеру достаточное количество ресурсов для работы и в то же время быть уверенными в том, что контейнер не будет потреблять лишних ресурсов, нарушая тем самым работу остальной системы.
В LXD можно выделять контейнерам ресурсы при помощи специального набора команд:
Более подробно почитать об управлении ресурсами можно в этой статье.
Просмотреть статистику потребления ресурсов для контейнера можно с помощью простой команды:
Работа со снапшотами
В LXD имеется возможность создания снапшотов и восстановления контейнеров из снапшотов. Посмотрим, как это работает на практике (пример взят из интерактивного туториала LXD).
Внесём некоторые изменения в уже созданный нами контейнер container1:
Сделаем снапшот этого контейнера и назовём его, например, new:
Попробуем что-нибудь «поломать» в нашем первом контейнере:
Поcле этого запустим в нём в нём командную оболочку:
Выполним команду exit и вернёмся на основной хост. Восстановим работу контейнера container1 из снапшота:
Запустим командную оболочку в восстановленном контейнере:
Всё работает так же, как раньше!
В приведённом выше примере мы рассмотрели так называемые stateless-снапшоты В LXD есть и другой тип снапшотов — stateful, в которых сохраняется текущее состояние всех процессов в контейнере. Со stateful-снапшотами связаны ряд интересных и полезных функций.
Чтобы создавать stateful-снапшоты, нам понадобится установить программу CRIU(CheckPoint/Restore in Userspace). C её помощью можно сохранить текущее состояние всех процессов, а затем восстановить их хоть на текущей, хоть на другой машине.
В Ubuntu 16.04 утилита CRIU устанавливается при помощи стандартного менеджера пакетов:
После этого можно переходить к созданию снапшотов:
В некоторых ситуациях такие снапшоты могут оказаться очень полезными. Представим себе, например, что нам нужно перезагрузить сервер, на котором запущены один или несколько контейнеров. Чтобы после перезагрузки не запускать всё заново, а продолжить с прерванного места, достаточно выполнить:
На базе stateful-снапшотов реализован механизм «живой» миграции контейнеров, который пока что находится в несколько «сыром» состоянии.
Заключение
LXD представляет собой удобную систему управления контейнерами, обладающую целым рядом полезных функций. Надеемся, что проект LXD будет успешно развиваться и займёт достойное место в ряду современных инструментов контейнеризации.
Если у вас есть практический опыт использования LXD — добро пожаловать в комментарии.
Если вы по тем или иным причинам не можете комментировать посты здесь — добро пожаловать в наш корпоративный блог.
Естественно, в рамках одной статьи рассказать обо всех функциях LXD вряд ли возможно. Для желающих узнать больше приводим несколько полезных ссылок:
Введение.
Последние 6 месяцев Серж Халлин (Serge Hallyn), Тихо Андерсен (Tycho Andersen), Чак Шорт (Chuck Short), Райн Харпер (Ryan Harper) и Стефан Грабе (Stéphane Graber) активно работали над проектом LXD.
Ubuntu 15.04, который выйдет 23 апреля 2015 года, будет обладать в своих репозиториях LXD 0.7. Хоть это и первые шаги данной технологии, но для экспериментов она готова. Для производственного использования ещё нужно потрудиться над ней.
Что такое LXD?
Последний бесшовно интегрируется в инфраструктуру OpenStack и позволяет управлять контейнерами подобно виртуальным машинам.
Почему LXD?
LXC за 7 лет своего развития превратилась из кучки ограниченных инструментов для изоляции чуть лучше чем chroot в стабильный набор инструментов, стабильную библиотеку и активное сообщество пользователей и разработчиков.
За эти годы было добавлено много дополнительных фичей безопасности в ядро линукс и LXC их поддерживает. Всё это время разработчики видели интерес людей к данной технологии и решили создать LXD на плечах LXC, с открытым API и набором привязок для языков программирования (bindings).
Разработчики давно хотят сделать несколько больших изменений:
Как LXD соотносится с LXC, Docker, Rocket и другими проектами?
LXD базируется на LXC и находится на его вершине. Используется LXC API, чтобы с помощью REST API скрыть детали работы и дать пользователю более простой и надёжный механизм. LXD фокусируется на контейнерах с системами (system container managers), то есть внутри работает полноценная операционная система на базе линукс. С точки зрения дизайна LXD не волнует что работает в контейнере.
Это отличает LXD от Docker или Rocket, которые позиционируют себя как менеджеры приложений-в-контейнере (application container managers). Но нет ничего плохого в использовании LXD для создания полноценного контейнера, который будет ограничен в ресурсах по вашему требованию и в рамках безопасности, а потом использовать любой механизм дистрибьюции приложений.
Начало работы с LXD.
Самый простой способ попробовать LXD на своём ноутбуке или десктопе это использование инструмента командной строки.
Команда lxc позволит взаимодействовать с одним или несколькими LXD, но по умолчанию идёт работа только с локальными. Для упрощения первого старта вы можете добавить публичный LXD сервер https://images.linuxcontainers.org:8443
Это сервер, хранящий только образы и доступный только для чтения. Вы можете получить список образов, хранящиеся на нём, скопировать себе интересующий вас образ и запустить его в контейнере.
lxc remote add images images.linuxcontainers.org
lxc image list images:
lxc launch images:ubuntu/trusty/i386 ubuntu-32
«remote» начинает указывать на «images» сервера images.linuxcontainers.org. Затем вы смотрите список на сервере, который выведет ASCII таблицу
Затем запускаете локально контейнер ubuntu-32, так как он будет скачан и запущен. Последующие старты контейнера будут мгновенными, так как образ уже будет храниться локально. Синтаксис » :» используется повсеместно в lxc, если его не указывать, то будет подразумеваться local.
Так как есть запущенный контейнер с Убунту, то можно посмотреть статус и IP: lxc list
Что дальше?
Вышеописанное не является полным руководством, так как простой старт показан на единственной машине. LXD раскрывается, когда вы удалённо манипулируете контейнерами на разных узлах: создаёте, перемещаете, копируете и так далее. LXD поддерживает живую миграцию, снимки, профили конфигурации, прокидывание устройств внутрь контейнера и многое другое. Вскоре будет по аналогии с циклом статей про LXC написан цикл статей о возможностях LXD. LXD очень юный проект, но его поддерживают разработчики LXC.
Адреса, пароли, явки.
Теперь пару слов от меня лично.
Разработчик Тихо Андерсен рассказывает о LXD.
ИТ База знаний
Полезно
— Онлайн генератор устойчивых паролей
— Онлайн калькулятор подсетей
— Руководство администратора FreePBX на русском языке
— Руководство администратора Cisco UCM/CME на русском языке
— Руководство администратора по Linux/Unix
Навигация
Серверные решения
Телефония
FreePBX и Asterisk
Настройка программных телефонов
Корпоративные сети
Протоколы и стандарты
LXC, LXD и LXCFS – в чем разница?
О LXC
Важные характеристики
Текущая версия LXC задействует ряд функций ядра, чтобы обеспечить контейнеризацию следующих процессов:
Как правило, контейнеры LXC обычно воспринимаются пользователями как нечто усредненное между Chroot и VM. Эта технология нацелена на то, чтобы создать среду, аналогичную стандартно установленной Linux, но сделать это без необходимости в дополнительном ядре.
Компоненты
Ниже в списке, несколько актуальных компонентов LXC:
LXD (Linux Container Daemon) является базирующимся на LXC гипервизором контейнеров.
Основные части LXD:
REST API предоставляется демоном в локальном или сетевом режиме. Эффективная утилита управления, клиент командной строки, отличается своей интуитивностью и простотой. Именно с помощью него реализовано управление каждым контейнером. Клиент обрабатывает подключение одновременно к разному количеству контейнеров, отображает уже созданные и создает новые. Есть возможность их перемещения в процессе функционирования.
Упомянутый плагин “превращает” все LXD-host в вычислительные узлы, которые работают для поддержки контейнеров, а не VM.
Преимущества
Основные преимущества LXD:
Связь с LXC
LXCFS: настройка контейнеризации
LXCFS включает в себя:
Так в чем же разница?
Сравнивать LXC, LXD, LXCFS не имеет смысла, так как они не представляют из себя 3 разных продукта с одинаковым функционалом. Грубо можно описать их как программу, дополнение к ней и патч, который позволяет среде пользователя адаптироваться под ее нужды.
LXD 2.0: Введение в LXD [1/12].
Первая, вводная статья от Стефана Грабера, который расскажет о диковинном звере LXD. Рекомендуется тем, кто отличает контейнер от виртуальной машины.
Что такое LXD?
Как LXD соотносится с Docker/Rkt?
LXD фокусируется на системных контейнерах, которые ещё называют инфраструктурные контейнеры. То есть LXD манипулирует контейнерами с полноценной Linux системой внутри так же, как вы бы работали с системой, поставленной на чистое железо или в виртуальную машину. Традиционные системы управления конфигурациями и развёртывания приложений могут использовать LXD так же, как и в обычном использовании на физическом оборудовании, виртуальной или облачных средах.
В противоположность этому, Docker фокусируется на минималистичных, мимолётных контейнерах, которые обычно не обновляют или переконфигурируют, а вероятнее всего будут заменены целиком. Это делает Docker и подобные проекты ближе к механизму развёртывания приложений, чем к инструментам управления машинами.
Эти две модели не являются взаимоисключающими. Вы можете использовать LXD для предоставления полноценной Linux системы и ваши пользователи внутри контейнера могут с помощью Docker ставить нужный им софт.
Почему LXD?
Работа с LXC показала, что он обеспечивает прекрасным набором низкоуровневого инструментария и библиотеками для создания и управления контейнерами. Однако, такой инструмент не всегда дружественен к пользователю и требует от него много первоначальных знаний для понимания как это всё работает. Поддержание обратной совместимости со старыми контейнерами и методами развёртывания так же не даёт использовать некоторые настройки безопасности LXC по умолчанию и требует от пользователя ручной правки.
Основные компоненты LXD.
Есть целый ряд компонент, из которых состоит LXD и они видны в структуре каталогов, в клиенте командной строки и в самом API.
Контейнеры. Containers.
Снимки. Snapshots.
Снимки контейнера неизменны в том смысле, что их нельзя вам модифицировать, кроме переименования, уничтожения или восстановления. Стоит отметить, что поскольку сохраняется всё состояние контейнера, то фактически вы обладаете концепцией ‘stateful’ снимков. Это даёт возможность откатить контейнер, включая состояние его CPU и памяти.
Образы. Images.
LXD основан на использовании образов. Все контейнеры созданы из образов. Образы обычно представляют собой какой-либо чистый Linux дистрибутив, подобно тем что вы используете в виртуальной машине или в облачных средах.
Возможно публиковать (publish) контейнер, делая из него образ, который уже используется локальными или удалёнными LXD хостами.
Образы однозначно идентифицируются своими sha256 хэшами и вы можете ссылаться, используя его целиком или часть. Так как набирать длинные хэши не удобно для пользователя, то каждый образ имеет свойства, помогающее его легко найти в хранилище. Псевдоним (alias) из уникальной строки пользователя может быть дан хэшу образа.
LXD идёт с 3 преднастроенными удалёнными хранилищами образов:
Образы с удалённых серверов автоматически кэшируются демоном LXD и хранятся некоторое время, по умолчанию 10 дней. Дополнительно LXD автоматически обновляет используемые вами образы, если не указано иное, так что самая свежая версия образа доступна вам локально.
Профили. Profiles.
Профили предоставляют механизм определения конфигурации контейнера и доступных ему устройств в одном месте и возможность применять профиль к любому количеству контейнеров.
Контейнеры могут иметь несколько профилей, применённых к нему. При построении окончательной конфигурации, известной как expanded, профиля применяются в порядке определения, перекрывая-перезаписывая совпадающие опции и устройства. Любая локальная конфигурация применяется в конце, затирая абсолютно всё, что шло из профиля.
LXD идёт с 2 преднастроенными профилями:
Удалёнка. Remotes.
По умолчанию определены:
Можно добавлять любое количество удалённых LXD хостов: анонимных в случае публичных серверов с образами или с аутентификацией для управления контейнерами.
Безопасность. Security.
Одним из аспектов при построении LXD было создание безопасных контейнеров, позволяющих запуск современных, немодифицированных Linux дистрибутивов.
Основные функции безопасности:
Вместо того чтобы заставлять пользователя напрямую заниматься безопасностью через параметры, как это делается в LXC, в LXD реализован «конфигурационный язык», который абстрагирует большинство параметров, делая дружественный шаг к пользователю. Для примера, можно легко попросить LXD пробросить устройство хоста внутрь контейнера, без ручного вмешательства при создании major/minor номеров устройства и обновлении политик cgroup.
Связь в LXD защищается TLS 1.2 с ограниченным набором шифров.
REST API.
Всё в LXD делается через REST API. Нет других способов взаимодействия между клиентом и демоном. REST API может быть доступен через локальный unix сокет, требуя только членства в группе для проверки подлинности, или через HTTPS, используя сертификат при аутентификации.
Структура REST API соответствует описанным выше компонентам, проста и понятна.
Когда требуется сложная схема взаимодействия, LXD может разговаривать через websockets. Это используется в интерактивной консоли, миграции контейнера и при уведомлениях о событии.
С LXD 2.0 идёт стабильный API 1.0, в рамках которого не будет нарушаться обратная совместимость. В будущем будут добавлены дополнительные расширения API.
Масштабирование.
LXD предоставляет хороший инструмент командной строки, но он не предназначен для управления тысячами контейнеров на множестве хостов. Для таких случаев используйте плагин nova-lxd в OpenStack, чтобы управлять контейнерами подобно виртуальными машинами. Это позволит вам воспользоваться уже OpenStack API для управления сетью, хранилищами, балансировкой нагрузкой и т.д.
Управление контейнерами с LXD: краткое введение
Продолжаем наш цикл статей о контейнеризации. Если первые две статьи (1 и 2) были посвящены теории, то сегодня мы поговорим о вполне конкретном инструменте и об особенностях его практического использования. Предметом нашего рассмотрения будет LXD (сокращение от Linux Container Daemon), созданный канадцем Стефаном Грабе из компании Canonical.
Имя создателя LXD хорошо известно в профессиональном сообществе: он также является одним из авторв другого популярного контейнерного решения — LXC. Собственно, LXD представляет собой надстройку над LXC, которая упрощает работу с контейнерами и добавляет широкий спектр новых возможностей.
В рамках этой статьи мы ограничимся лишь кратким введением в LXD: сравним его с Docker, приведём инструкцию по установке и настройке, а также продемонстрируем базовые возможности управления контейнерами.
LXD и Docker
LXD — инструмент относительно новый: первая версия вышла в свет в 2014 году, когда Docker уже получил широкое распространение и хорошо зарекомендовал себя на практике.
Как и Docker, LXD функционирует на базе LXC.
При этом cфера применения у двух инструментов совершенно разная: если Docker предназначен для запуска в контейнерах приложений, то LXD — для запуска полноценных операционных систем.
С помощью LXD можно создавать даже не контейнеры в буквальном смысле этого слова, а легковесные виртуальные машины. Чтобы подчеркнуть этот момент и одновременно указать на отличие от других инструментов контейнеризации, авторы многих публикаций называют LXD словом lightvisor (на русский язык его уже переводят как «легковизор»).
В публикациях Canonical отмечается, что LXD-контейнеры могут работать в 10 раз быстрее, чем традиционные виртуальные машины на базе KVM.
В LXD предпринята попытка решить целый ряд проблем, с которыми приходится сталкиваться при работе с другими инструментами контейнеризации: продуман механизм динамического управления ресурсами, расширены возможности миграции контейнеров (в том числе и в режиме реального времени), устранены проблемы безопасности. По сравнению с Docker у LXD гораздо шире возможности переконфигурации контейнеров.
LXD оснащён открытым API; имеются клиенты для различных языков программирования. Создан плагин для OpenStack, позволяющий управлять контейнерами с помощью клиента Nova.
Установка и настройка
Здесь и далее мы будем описывать особенности работы c LXD на материале Ubuntu 16.04. В этой ОС LXD включён в официальные репозитории и устанавливается стандартным способом:
Стефан Грабе в своей статье рекомендует в качестве бэкенда для хранения контейнеров использовать файловую систему ZFS. Чтобы работать с ZFS, нужно установить соответствующие пакеты:
Если ZFS вам по тем или иным причинам не подходит, вы можете воспользоваться BTRFS или LVM (подробнее об этом см. здесь ).
По завершении установки выполним команду:
Создание контейнера
Все контейнеры в LXD создаются на базе образов. Образы можно получить как из локального, так и из удалённого репозитория. Просмотрим список доступных репозиториев:
Для первого знакомства с LXD вполне подойдёт локальный репозиторий (local). Запустим в контейнере ОС Ubuntu 16.04:
В результате выполнения этой команды LXD создаст на базе указанного образа контейнер и запустит его.
Запустить в этом контейнере командную оболочку можно с помощью команды:
Если нужно просто создать контейнер, но не запускать его, достаточно выполнить команду:
Для последующего запуска и остановки контейнера используются команды lxc start и lxc stop.
LXC предоставляет хорошие возможности для управления контейнерами «на лету». Вот так, например, можно поместить созданный на основном хосте файл внутрь контейнера:
Можно совершить и обратную операцию — загрузить файл из контейнера на основной хост
Можно и редактировать файлы в контейнере напрямую:
Основные команды для создания и запуска контейнеров мы уже рассмотрели; желающих узнать больше отсылаем к подробной статье Стефана Грабе.
Управление ресурсами
Управление изолированными окружениями немыслимо без контроля ресурсов: мы должны предоставить контейнеру достаточное количество ресурсов для работы и в то же время быть уверенными в том, что контейнер не будет потреблять лишних ресурсов, нарушая тем самым работу остальной системы.
В LXD можно выделять контейнерам ресурсы при помощи специального набора команд:
Просмотреть статистику потребления ресурсов для контейнера можно с помощью простой команды:
Работа со снапшотами
В LXD имеется возможность создания снапшотов и восстановления контейнеров из снапшотов. Посмотрим, как это работает на практике (пример взят из интерактивного туториала LXD ).
Внесём некоторые изменения в уже созданный нами контейнер container1:
Сделаем снапшот этого контейнера и назовём его, например, new:
Попробуем что-нибудь «поломать» в нашем первом контейнере:
Поcле этого запустим в нём в нём командную оболочку:
Выполним команду exit и вернёмся на основной хост. Восстановим работу контейнера container1 из снапшота:
Запустим командную оболочку в восстановленном контейнере:
Всё работает так же, как раньше!
В приведённом выше примере мы рассмотрели так называемые stateless-снапшоты В LXD есть и другой тип снапшотов — stateful, в которых сохраняется текущее состояние всех процессов в контейнере. Со stateful-снапшотами связаны ряд интересных и полезных функций.
Чтобы создавать stateful-снапшоты, нам понадобится установить программу CRIU (CheckPoint/Restore in Userspace). C её помощью можно сохранить текущее состояние всех процессов, а затем восстановить их хоть на текущей, хоть на другой машине.
В Ubuntu 16.04 утилита CRIU устанавливается при помощи стандартного менеджера пакетов:
После этого можно переходить к созданию снапшотов:
В некоторых ситуациях такие снапшоты могут оказаться очень полезными. Представим себе, например, что нам нужно перезагрузить сервер, на котором запущены один или несколько контейнеров. Чтобы после перезагрузки не запускать всё заново, а продолжить с прерванного места, достаточно выполнить:
На базе stateful-снапшотов реализован механизм «живой» миграции контейнеров, который пока что находится в несколько «сыром» состоянии.
Заключение
LXD представляет собой удобную систему управления контейнерами, обладающую целым рядом полезных функций. Надеемся, что проект LXD будет успешно развиваться и займёт достойное место в ряду современных инструментов контейнеризации.
Если у вас есть практический опыт использования LXD — добро пожаловать в комментарии.
Естественно, в рамках одной статьи рассказать обо всех функциях LXD вряд ли возможно. Для желающих узнать больше приводим несколько полезных ссылок:






