- PVSM.RU - https://www.pvsm.ru -

Управление контейнерами с LXD

LXD Containers

Продолжаем наш цикл статей о контейнеризации. Если первые две статьи (1 [1] и 2 [2]) были посвящены теории, то сегодня мы поговорим о вполне конкретном инструменте и об особенностях его практического использования. Предметом нашего рассмотрения будет LXD [3] (сокращение от Linux Container Daemon), созданный канадцем Стефаном Грабе [4] из компании Canonical.

Имя создателя LXD хорошо известно в профессиональном сообществе: он также является одним из авторв другого популярного контейнерного решения — LXC. Собственно, LXD представляет собой надстройку над LXC, которая упрощает работу с контейнерами и добавляет широкий спектр новых возможностей.

В рамках этой статьи мы ограничимся лишь кратким введением в LXD: сравним его с Docker, приведём инструкцию по установке и настройке, а также продемонстрируем базовые возможности управления контейнерами.

LXD и Docker

LXD — инструмент относительно новый: первая версия вышла в свет в 2014 году, когда Docker уже получил широкое распространение и хорошо зарекомендовал себя на практике.
Как и Docker, LXD функционирует на базе LXC.

При этом cфера применения у двух инструментов совершенно разная: если Docker предназначен для запуска в контейнерах приложений, то LXD — для запуска полноценных операционных систем.

С помощью LXD можно создавать даже не контейнеры в буквальном смысле этого слова, а легковесные виртуальные машины. Чтобы подчеркнуть этот момент и одновременно указать на отличие от других инструментов контейнеризации, авторы многих публикаций называют LXD словом lightvisor (на русский язык его уже переводят [5] как «легковизор»).

В публикациях Canonical [6]отмечается, что LXD-контейнеры могут работать в 10 раз быстрее, чем традиционные виртуальные машины на базе KVM.

В LXD предпринята попытка решить целый ряд проблем, с которыми приходится сталкиваться при работе с другими инструментами контейнеризации: продуман механизм динамического управления ресурсами, расширены возможности миграции контейнеров (в том числе и в режиме реального времени), устранены проблемы безопасности. По сравнению с Docker у LXD гораздо шире возможности переконфигурации контейнеров.

LXD оснащён открытым API; имеются клиенты для различных языков программирования. Создан плагин для OpenStack [7], позволяющий управлять контейнерами с помощью клиента Nova.

.

Установка и настройка

Здесь и далее мы будем описывать особенности работы c LXD на материале Ubuntu 16.04. В этой ОС LXD включён в официальные репозитории и устанавливается стандартным способом:

apt-get install lxd

Стефан Грабе в своей статье [8] рекомендует в качестве бэкенда для хранения контейнеров использовать файловую систему ZFS. Чтобы работать с ZFS, нужно установить соответствующие пакеты:

apt-get install zfsutils-linux

Если ZFS вам по тем или иным причинам не подходит, вы можете воспользоваться BTRFS или LVM (подробнее об этом см. здесь [8]).
По завершении установки выполним команду:

lxd init

Программа настройки задаст несколько простых вопросов, после чего всё будет сконфигурировано автоматически. Подробнее об особенностях настройки LXD можно прочитать в этой статье [9].

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

Все контейнеры в LXD создаются на базе образов. Образы можно получить как из локального, так и из удалённого репозитория. Просмотрим список доступных репозиториев:

 lxc remote list

+-----------------+------------------------------------------+---------------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+--------+--------+
| images          | https://images.linuxcontainers.org       | lxd           | YES    | NO     |
+-----------------+------------------------------------------+---------------+--------+--------+
| local (default) | unix://                                  | lxd           | NO     | YES    |
+-----------------+------------------------------------------+---------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams | YES    | YES    |
+-----------------+------------------------------------------+---------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams | YES    | YES    |
+-----------------+------------------------------------------+---------------+-------

Для первого знакомства с LXD вполне подойдёт локальный репозиторий (local). Запустим в контейнере ОС Ubuntu 16.04:

lxc launch ubuntu:16.04 container1

В результате выполнения этой команды LXD создаст на базе указанного образа контейнер и запустит его.

Запустить в этом контейнере командную оболочку можно с помощью команды:

lxc exec container1 /bin/bash

Если нужно просто создать контейнер, но не запускать его, достаточно выполнить команду:

lxc init ubuntu:16.04 container1

Для последующего запуска и остановки контейнера используются команды lxc start и lxc stop.

LXC предоставляет хорошие возможности для управления контейнерами «на лету». Вот так, например, можно поместить созданный на основном хосте файл внутрь контейнера:

lxc file push [путь к файлу на основном хосте] [контейнер]/[путь]

Можно совершить и обратную операцию — загрузить файл из контейнера на основной хост:

$ lxc file pull [контейнер]/[путь]

Можно и редактировать файлы в контейнере напрямую:

lxc edit [контейнер]/[путь]

Основные команды для создания и запуска контейнеров мы уже рассмотрели; желающих узнать больше отсылаем к подробной статье [10] Стефана Грабе.

Управление ресурсами

Управление изолированными окружениями немыслимо без контроля ресурсов: мы должны предоставить контейнеру достаточное количество ресурсов для работы и в то же время быть уверенными в том, что контейнер не будет потреблять лишних ресурсов, нарушая тем самым работу остальной системы.

В LXD можно выделять контейнерам ресурсы при помощи специального набора команд:

# устанавливаем лимит памяти
lxc config set container1 limits.memory 512M

# привязываем контейнер к ядрам CPU
lxc config set container1 limits.cpu 1,3

# ограничиваем потребление ресурсов CPU
lxc config set container1 cpu.allowance 10%

# ограничиваем объём используемого контейнером дискового пространства(работает только с ZFS или btrfs)
lxc config set container1 root size 10GB

Более подробно почитать об управлении ресурсами можно в этой статье [11].

Просмотреть статистику потребления ресурсов для контейнера можно с помощью простой команды:

lxc info container1

Name: container1
Architecture: x86_64
Created: 2016/08/16 07:55 UTC
Status: Running
Type: persistent
Profiles: default
Pid: 4110
Ips:
lo: 	inet 	127.0.0.1
lo: 	inet6 	::1
eth0:	inet6 	fe80::216:3eff:fe18:faa9 	vethA2SCMX
Resources:
Processes: 24
Memory usage:
Memory (current): 48.88MB
Memory (peak): 163.26MB
Network usage:
eth0:
Bytes received: 648 bytes
Bytes sent: 648 bytes
Packets received: 8
Packets sent: 8
lo:
Bytes received: 264 bytes
Bytes sent: 264 bytes
Packets received: 4
Packets sent: 4

Работа со снапшотами

В LXD имеется возможность создания снапшотов и восстановления контейнеров из снапшотов. Посмотрим, как это работает на практике (пример взят из интерактивного туториала LXD [12]).

Внесём некоторые изменения в уже созданный нами контейнер container1:

lxc exec container1 -- apt-get update
lxc exec container1 -- apt-get dist-upgrade -y
lxc exec container1 -- apt-get autoremove —purge -y

Сделаем снапшот этого контейнера и назовём его, например, new:

lxc snapshot container1 new

Попробуем что-нибудь «поломать» в нашем первом контейнере:

lxc exec container1 -- rm -Rf /etc /usr

Поcле этого запустим в нём в нём командную оболочку:

lxc exec container -- bash
I have no name!@container1:~#

Выполним команду exit и вернёмся на основной хост. Восстановим работу контейнера container1 из снапшота:

lxc restore container1 new

Запустим командную оболочку в восстановленном контейнере:

lxc exec container1 -- bash
root@container1:#

Всё работает так же, как раньше!

В приведённом выше примере мы рассмотрели так называемые stateless-снапшоты В LXD есть и другой тип снапшотов  — stateful, в которых сохраняется текущее состояние всех процессов в контейнере. Со stateful-снапшотами связаны ряд интересных и полезных функций.

Чтобы создавать stateful-снапшоты, нам понадобится установить программу CRIU [13](CheckPoint/Restore in Userspace). C её помощью можно сохранить текущее состояние всех процессов, а затем восстановить их хоть на текущей, хоть на другой машине.
В Ubuntu 16.04 утилита CRIU устанавливается при помощи стандартного менеджера пакетов:

apt-get install criu

После этого можно переходить к созданию снапшотов:

lxc snapshot container1 snapshot1 --stateful

В некоторых ситуациях такие снапшоты могут оказаться очень полезными. Представим себе, например, что нам нужно перезагрузить сервер, на котором запущены один или несколько контейнеров. Чтобы после перезагрузки не запускать всё заново, а продолжить с прерванного места, достаточно выполнить:

# перед перезагрузкой
lxc stop container1 --stateful

#после перезагрузки
lxc start container1

На базе stateful-снапшотов реализован механизм «живой» миграции [14] контейнеров, который пока что находится в несколько «сыром» состоянии.

Заключение

LXD представляет собой удобную систему управления контейнерами, обладающую целым рядом полезных функций. Надеемся, что &nbsp проект LXD будет успешно развиваться и займёт достойное место в ряду современных инструментов контейнеризации.
Если у вас есть практический опыт использования LXD — добро пожаловать в комментарии.
Если вы по тем или иным причинам не можете комментировать посты здесь — добро пожаловать в наш корпоративный блог [15].

Естественно, в рамках одной статьи рассказать обо всех функциях LXD вряд ли возможно. Для желающих узнать больше приводим несколько полезных ссылок:

Автор: Селектел

Источник [20]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/selectel/177102

Ссылки в тексте:

[1] 1: https://habrahabr.ru/company/selectel/blog/279281/

[2] 2: https://habrahabr.ru/company/selectel/blog/303190/

[3] LXD: https://linuxcontainers.org/lxd/

[4] Стефаном Грабе: https://www.stgraber.org/

[5] уже переводят: http://vasilisc.com/lxd-lightervisor

[6] публикациях Canonical : https://insights.ubuntu.com/2015/05/18/lxd-crushes-kvm-in-density-and-speed/

[7] плагин для OpenStack: https://insights.ubuntu.com/2015/05/06/introduction-to-nova-compute-lxd/

[8] в своей статье: https://www.stgraber.org/2016/03/15/lxd-2-0-installing-and-configuring-lxd-212/

[9] в этой статье: https://bayton.org/2016/05/lxd-zfs-and-bridged-networking-on-ubuntu-16-04-lts/

[10] подробной статье: https://www.stgraber.org/2016/03/19/lxd-2-0-your-first-lxd-container-312/

[11] в этой статье: https://www.stgraber.org/2016/03/26/lxd-2-0-resource-control-412/

[12] интерактивного туториала LXD: https://linuxcontainers.org/lxd/try-it/

[13] CRIU: http://criu.org

[14] механизм «живой» миграции: https://www.stgraber.org/2016/04/25/lxd-2-0-live-migration-912/

[15] корпоративный блог: https://blog.selectel.ru/upravlenie-kontejnerami-s-lxd-kratkoe-vvedenie/

[16] https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/: https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/

[17] http://vasilisc.com/lxd-2-0-series: http://vasilisc.com/lxd-2-0-series

[18] https://insights.ubuntu.com/2016/04/19/directly-interacting-with-the-lxd-api/: https://insights.ubuntu.com/2016/04/19/directly-interacting-with-the-lxd-api/

[19] https://www.openstack.org/summit/vancouver-2015/summit-videos/presentation/lxd-vs-kvm: https://www.openstack.org/summit/vancouver-2015/summit-videos/presentation/lxd-vs-kvm

[20] Источник: https://habrahabr.ru/post/308208/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best