MyTetra Share
Делитесь знаниями!
LXD
Время создания: 09.03.2020 13:12
Автор: alensav
Текстовые метки: LXD
Раздел: !!LXD
Запись: alensav/MyTetra2/main/base/1583748774yvbycruag8/text.html на raw.githubusercontent.com

LXD

====================================

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

Андрей Емельянов 16 августа 2016 Время чтения: 6 мин.
Теги: 
контейнеры Комментарии ( 2 )

Продолжаем наш цикл статей о контейнеризации. Если первые две статьи (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 включён в официальные репозитории и устанавливается стандартным способом:

?

1

apt-get install lxd

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


1

apt-get install zfsutils-linux

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

?

1

lxd init

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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:

?

1

lxc launch ubuntu:16.04 container1

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

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

?

1

lxc exec container1 /bin/bash

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

?

1

lxc init ubuntu:16.04 container1

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

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

?

1

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

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

?

1

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

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

?

1

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

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

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

# устанавливаем лимит памяти

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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 ).

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

?

1

2

3

lxc exec container1 -- apt-get update

lxc exec container1 -- apt-get dist-upgrade -y

lxc exec container1 -- apt-get autoremove —purge -y

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

?

1

lxc snapshot container1 new

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

?

1

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

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

?

1

2

lxc exec container1 -- bash

I have no name!@container1:~#

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

?

1

lxc restore container1 new

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

?

1

2

lxc exec container1 -- bash

root@container1:#

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

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

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

?

1

apt-get install criu

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

?

1

lxc snapshot container1 snapshot1 --stateful

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

?

1

2

3

4

5

# перед перезагрузкой

lxc stop container1 --stateful

 

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

lxc start container1

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

Заключение

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

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

  • https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/  — цикл статей об LXD в блоге Стефана Грабе;
  • http://vasilisc.com/lxd-2-0-series  — перевод всех статей по предыдущей ссылке на русский язык;
  • https://insights.ubuntu.com/2016/04/19/directly-interacting-with-the-lxd-api/  — статья-введение в LXD API;
  • https://www.openstack.org/summit/vancouver-2015/summit-videos/presentation/lxd-vs-kvm  — видеозапись доклада о перспективах использования LXD в OpenStack.

Андрей Емельянов 16 августа 2016 Теги: контейнеры

Прикрепленные файлы:
Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования