LXD - це гипервизор контейнерів, який базується на LXС [1]. Основна відмінність від LXC полягає в тому, що LXD вводить поняття образу контейнера, і будує інфраструктуру навколо цих двох понять. Простіше кажучи, LXD - це Docker для віртуальних ОС. Принцип такий же: образ ОС можна скачувати з репозиторіїв і розгортати екземпляри на хості як контейнери. Один образ можна «клонувати» на кілька віртуальних машин.
Дана інструкція містить покроковий алгоритм установки і настройки LXD. Інструкція розглядає наступні теми:
Відмінності від Docker:
Інші можливості LXD:
- Можна інтегрувати з OpenStack через плагін nova-lxd.
- Є можливість сплячого режиму (гібернація) контейнера.
- Є API управлінням контейнерами [4].
- Можна запускати Docker всередині LXD [5].
LXD на поточний момент нормально працює на Ubuntu 16.04 LTS. Можна запустити і на інших системах, але можуть виникнути складності або щось буде працювати не так як треба. Наприклад, на Centos 7 контейнери запускаються тільки в привілейованому режимі, відсутні готові збірки lxd і потрібно їх компілювати вручну.
У свіжої Ubuntu версії, за замовчуванням, вже вбудований lxd. Якщо він не встановлений, то поставити можна так:
aptitude install lxd
Оновлення систему і встановіть необхідні для роботи пакети:
aptitude update aptitude upgrade aptitude install lxd zfs zfsutils-linux
ініціалізація LXD
Ініціалізацію LXD потрібно робити до того як ви почнете користуватися контейнерами.
Перед тим як робити ініціалізацію потрібно вирішити, яке backend сховище буде використовуватися. Backend сховищ - це місце, де знаходяться всі контейнери і образи. Виділяють два основних типів сховища: ZFS і Dir.
- ZFS дозволяє моментально створювати і відновлювати знімки контейнерів, створювати контейнери з образів. Завдяки ZFS, знімки LXD займають значно менше місця, ніж сам контейнер.
- Dir зберігає образи звичайним способом на диску. Кожен знімок буде займати стільки ж, як і сам контейнер.
ZFS монтується в файл як loop device, тому потрібно стежити за розміром сховища і збільшувати місце, якщо його мало залишилося. ZFS має сенс використовувати, якщо у вас є приватне віддалене сховище образів, куди ви відправляєте, час від часу, знімки контейнерів в якості резервних копій, а потім завантажуєте їх від туди для установки нових версій або для відновлення контейнерів з резервних копій.
Я на продакшн сервер вирішив поставити Dir. ZFS протестують у себе на локалке. Бекапи буду робити звичайними скриптами - упаковувати їх в tar і відправляти їх на Amazon S3.
Після того як ви вирішили яке backend сховище використовувати, починайте процес ініціалізації. Робиться це командою:
Утиліта буде задавати питання, на які вам потрібно буде відповісти. Першим питанням утиліта запитає: який тип сховища використовувати?
Name of the storage backend to use # 40; dir or zfs # 41 ;. dir
Якщо ваша відповідь Dir, то утиліта відразу перейде до налаштування мережі. Якщо ваша відповідь ZFS, то система буде задавати такі питання:
Create a new ZFS pool # 40; yes / no # 41 ;. yes Name of the new ZFS pool: lxd Would you like to use an existing block device # 40; yes / no # 41 ;. no Size in span> GB of the new loop device # 40; 1GB minimum # 41 ;. 10
«Size in GB of the new loop device» - це розмір сховища ZFS. Всі образи і контейнери будуть зберігатися в цьому сховищі, тому якщо ви збираєтеся зберігати багато образів або контейнерів, то потрібно збільшити це число.
Потім утиліта запитає: чи потрібно відкривати доступ до LXD із зовні? Відповідаємо «ні». Якщо ви хочете створити публічний або приватний репозиторій, то потрібно відповісти «так».
Would you like LXD to be available over the network # 40; yes / no # 41 ;. no
Налаштування LXD bridge
Після настройки типу сховища, утиліта запитає: «Чи бажаєте ви сконфігурувати LXD bridge?». Відповідаємо «так».
Do you want to configure the LXD bridge # 40; yes / no # 41 ;. yes
Запуститися інтерфейс настройки мережі. Відповідайте на питання наступним чином:
Would you like to setup a network bridge for span> LXD containers now? Yes Bridge interface name: lxdbr0 Do you want to setup an IPv4 subnet? Yes IPv4 address: 10.200.0.1 IPv4 CIDR mask: 16 First DHCP address: 10.200.100.1 Last DHCP address: 10.200.255.254 Max number of DHCP clients: 25399 Do you want to NAT the IPv4 traffic? Yes Do you want to setup an IPv6 subnet? No
Для мережі буде використовуватися міст з інтерфейсом lxdbr0.
Запустити повторно утиліту настройки LXD bridge можна командою:
dpkg-reconfigure -p medium lxd
Установка статичного IP для контейнера
nano / etc / default / lxd-bridge
Раськоментіруйте рядок LXC_DHCP_CONFILE і пропишіть:
LXD_CONFILE = "/etc/lxd-dnsmasq.conf" span>
nano / etc / lxd-dnsmasq.conf
dhcp-host = test span> ,10.200.1.1
Після кожної зміни файлу /etc/lxd-dnsmasq.conf потрібно буде перезавантажувати lxd-bridge командою:
service lxd-bridge restart
Якщо це не допомагає, то потрібно зупинити контейнери з невірними IP, видалити файл dnsmasq.lxdbr0.leases, а потім перезавантажити lxd-bridge:
lxc stop test span> rm / var / lib / lxd-bridge / dnsmasq.lxdbr0.leases service lxd-bridge restart
Налаштування NAT
Для того, щоб запрацював NAT, виконавши команди:
echo span> 1> / proc / sys / net / ipv4 / ip_forward echo span> "Net.ipv4.ip_forward = 1" span>>> / etc / sysctl.conf
Налаштування Grub
nano / etc / default / grub
GRUB_CMDLINE_LINUX = "Swapaccount = 1 quiet" span>
Без цього рядка у мене при запуску lxd виходив warning про те що cgroup swap account не працюватиме. Я вирішив включити опцією swapaccount = 1. quiet - це тиха завантаження системи (опціонально)
Додавання LXD в автозапуск
systemctl enable span> lxd
перезапуск системи
Додайте репозиторій (опціонально, за замовчуванням images вже доданий):
lxc remote add images images.linuxcontainers.org: 8443
centos-image - синонім образу, щоб легше було до нього звертатися
lxc launch local span> : Centos-image test span>
test - назва майбутнього контейнера
Можна запускати образи в дві команди:
lxc init local span> : Centos-image test span>
lxc start test span>
Перша команда створить контейнер, а друга його запустить. Перша команда корисна, якщо ви хочете просто створити контейнер, але не запускати його.
Подивіться статус запущених контейнерів
Команда повинна показати наступну інформацію:
Монтування папок не змінює вміст папок / var / lib / lxd / containers / test, а монтується в окрему папку / var / lib / lxd / devices / test. Тому бекапи і знімки контейнера не міститимуть примонтировать папки і файли. Оновлення контейнера з резервної копії або образу не буде зачіпати вміст примонтировать папок.
lxc config span> show span> test
Підключення до віртуальної машини
Зайдіть в запущений контейнер test:
lxc exec span> test span> -- / Bin / bash
Даний метод створює бекапи контейнерів як LXD образи, готові до імпорту. В ідеалі потрібно створювати знімки і відправляти їх в приватний репозиторій LXD. Але іноді, цього зробити не можна. Наприклад, у невеликій компанії немає можливості купувати ще один сервер. В цьому випадку можна обійтися простим рішенням tar + Amazon S3.
Скачайте готові скрипти для створення і відновлення резервних копій:
wget https: // github.com / vistoyn / lxd_backup / raw / 1.1 / scripts / lxc-backup -O "/ Usr / local / bin / lxc-backup" span>
wget https: // github.com / vistoyn / lxd_backup / raw / 1.1 / scripts / lxc-restore -O "/ Usr / local / bin / lxc-restore" span>
Встановіть прапорець виконання для скриптів:
chmod + x / usr / local span>/ Bin / lxc-restore
chmod + x / usr / local span>/ Bin / lxc-backup
Перед створенням і відновленням бекапов потрібно зупинити працює контейнер. Можна, в принципі, робити бекап на працюючому контейнері, але при створенні бекапа можлива втрата деяких даних (залежить від встановлених програм в контейнері).
Дана команда створить бекап контейнера test, стисне файл в архів і збереже його на диску в папці / backup / lxc / test:
lxc stop test span>
lxc-backup test span>
Відновлення бекапа зі знімка:
Для ZFS після імені контейнера потрібно додавати «.zfs»
lxc stop test span>
Відновлення бекапа зі знімка:
lxc-stop test span>
На новому хості іноді потрібно створити контейнер з резервної копії. Для цього потрібно спочатку імпортувати образ, а потім його запустити як контейнер.
Команда імпорту бекапа як способу LXD:
Команда запуску образу як контейнера:
lxc launch me-new-image test span> 2