Управління контейнерами з LXD

LXD Containers

Продовжуємо наш цикл статей про контейнеризації. Якщо перші дві статті (1 і 2) були присвячені теорії, то сьогодні ми поговоримо про цілком конкретному інструменті і про особливості його практичного використання. Предметом нашого розгляду буде LXD (скорочення від Linux Container Daemon), створений канадцем Стефаном Ґрабе компанії Canonical.


Ім'я творця LXD добре відомо в професійному співтоваристві: він також є одним з авторв іншого популярного контейнерного рішення   LXC. Власне, LXD являє собою надбудову над LXC, яка спрощує роботу з контейнерами і додає широкий спектр нових можливостей.

У в рамках цієї статті ми обмежимося лише коротким введенням в LXD: порівняємо його з Docker, наведемо інструкцію по встановлення і налаштуванні, а також продемонструємо базові можливості управління контейнерами.

LXD і Docker

LXD   інструмент відносно новий: перша версія вийшла в світло 2014 році, коли Docker вже отримав широке поширення і добре зарекомендував себе на практиці.
Як і Docker, LXD функціонує на базі LXC.

При цьому сфера застосування у двох інструментів абсолютно різна: якщо Docker призначений для запуску в контейнерах додатків, то LXD — для запуску повноцінних операційних систем.

З допомогою LXD можна створювати навіть не контейнери в буквальному сенсі цього слова, а легковагі віртуальні машини. Щоб підкреслити цей момент і одночасно вказати на відміну від інших інструментів контейнеризації, автори багатьох публікацій називають LXD словом lightvisor (на російська мова його вже переводять як «легковизор»).

У публікаціях Canonical наголошується, що LXD-контейнери можуть працювати у 10 разів швидше, ніж традиційні віртуальні машини на базі KVM.

У LXD зроблена спроба вирішити цілий ряд проблем, з якими доводиться стикатися при роботі з іншими інструментами контейнеризації: продуманий механізм динамічного управління ресурсами, розширені можливості міграції контейнерів (в тому числі і в режимі реального часу), усунуті проблеми безпеки. &Nbsp;порівняно з Docker у LXD набагато ширше можливості переконфігурації контейнерів.

LXD оснащений відкритим API; є клієнти для різних мов програмування. Створений плагін для OpenStack, що дозволяє управляти контейнерами з допомогою клієнта Nova.

.

Установка і налаштування

Тут і далі ми будемо описувати особливості роботи c LXD на матеріалі Ubuntu 16.04. У цієї ОС LXD включений в офіційні репозиторії і встановлюється стандартним способом:

apt-get install lxd


Стефан Ґрабе  своїй статті рекомендує якості бекенду для зберігання контейнерів використовувати файлову систему ZFS. Щоб працювати у ZFS, потрібно встановити відповідні пакети:

apt-get install zfsutils-linux


Якщо ZFS вам за тим чи іншим причинам не підходить, ви можете скористатися BTRFS або LVM (докладніше про  див. тут).
&Nbsp;завершення встановлення виконаємо команду:

lxd init


Програма налаштування задасть кілька простих запитань, після чого все буде автоматично конфігурований. Детальніше про особливості налаштування LXD можна прочитати  цієї статті.

Створення контейнера

Всі контейнери в 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 [контейнер]/[шлях]


Основні команди для створення і запуску контейнерів ми вже розглянули; бажаючих дізнатися більше відсилаємо до докладної статті Стефана Ґрабе.

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

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

У 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


Більш детально почитати про управління ресурсами можна статті.

Переглянути статистику споживання ресурсів для контейнера можна з допомогою простої команди:

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.88 MB
Memory (peak): 163.26 MB
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:

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


Після цього запустимо в ньому в ньому командну оболонку:

lxc exec container -- bash
I have no [email protected]:~#


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

lxc restore container1 new


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

lxc exec container1 -- bash
[email protected]:#


Все працює так само, як раніше!

У наведеному вище прикладі ми розглянули так звані stateless-снапшоти В LXD є й інший тип снапшотов    stateful, в яких зберігається поточний стан всіх процесів в контейнері. З stateful-снапшоти пов'язані ряд цікавих і корисних функцій.

Щоб створювати stateful-снапшоти, нам знадобиться встановити програму CRIU(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-снапшотов реалізований механізм «живий» міграції контейнерів, який поки що знаходиться в кілька «сирому» стані.

Висновок

LXD являє собою зручну систему управління контейнерами, що володіє цілим рядом корисних функцій. Сподіваємося, що   проект LXD буде успішно розвиватися і займе гідне місце в ряду сучасних інструментів контейнеризації.
Якщо у вас є практичний досвід використання LXD   ласкаво просимо до коментарі.
Якщо ви з тих чи інших причин не можете коментувати пости тут — ласкаво просимо в наш корпоративний блог.

Природно, в рамках однієї статті розповісти про всі функції LXD навряд чи можливо. Для бажаючих дізнатися більше наводимо кілька корисних посилань:
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.