Налаштування LXD на VPS для ізоляції сервісів та запуску легковежних контейнерів
TL;DR
У цьому детальному посібнику ми налаштуємо LXD на вашому VPS, щоб створювати та керувати ізольованими, легковежними контейнерами. LXD дозволяє запускати кілька застосунків або сервісів, кожен у своєму чистому середовищі, мінімізуючи конфлікти та підвищуючи безпеку, при цьому ефективно використовуючи ресурси сервера. Ви навчитеся встановлювати LXD, конфігурувати його мережу та сховище, запускати контейнери, а також забезпечувати їх стабільну роботу та резервне копіювання.
- Встановлення та ініціалізація LXD: Детальні кроки зі встановлення LXD на Ubuntu 24.04 LTS та його базового налаштування.
- Ізоляція та безпека: Створення ізольованих контейнерів для кожного сервісу, використовуючи переваги легковежньої віртуалізації LXD.
- Керування ресурсами: Налаштування профілів для контейнерів з лімітами за CPU, RAM та дисковим простором.
- Мережева конфігурація: Налаштування мостової мережі для контейнерів, що забезпечує доступ ззовні та внутрішній зв'язок.
- Резервне копіювання: Реалізація стратегії бекапів з використанням снапшотів LXD та зовнішнього сховища.
- Обслуговування: Рекомендації щодо оновлення LXD та керування життєвим циклом контейнерів.
Що ми налаштовуємо і навіщо
У цьому посібнику ми займемося налаштуванням LXD — менеджера системних контейнерів — на вашому віртуальному приватному сервері (VPS). LXD дозволяє запускати повноцінні операційні системи (наприклад, Ubuntu, Debian, Alpine) всередині легковежних контейнерів, які, на відміну від віртуальних машин (таких як KVM), використовують ядро основної операційної системи хоста. Це забезпечує значно менші накладні витрати, швидший запуск та високу щільність розміщення сервісів на одному сервері, зберігаючи при цьому високий рівень ізоляції.
Що отримає читач у підсумку: Ви навчитеся ефективно використовувати ресурси свого VPS, запускаючи різні сервіси (веб-сервери, бази даних, ігрові сервери, ноди блокчейну) в окремих, повністю ізольованих контейнерах. Кожен контейнер матиме свою файлову систему, мережевий стек та набір процесів, що запобігатиме конфліктам залежностей та спростить керування. Це ідеальне рішення для розробників, фаундерів SaaS та ентузіастів, яким потрібна гнучкість та контроль над своєю інфраструктурою без необхідності орендувати безліч окремих VPS.
Які альтернативи існують і чому self-hosted на VPS:
- Віртуальні машини (KVM, VMware): Надають повну апаратну ізоляцію, але мають значні накладні витрати на ресурси (кожній ВМ потрібне своє ядро ОС, більше RAM та CPU). LXD ефективніший для завдань, де потрібна ізоляція на рівні ОС, а не апаратна.
- Docker: Чудовий інструмент для контейнеризації застосунків, але орієнтований на запуск окремих процесів або мікросервісів, а не повноцінних операційних систем. LXD, своєю чергою, дозволяє запускати "віртуальні машини" на рівні контейнерів, що зручніше для міграції існуючих застосунків або запуску сервісів, які вимагають повноцінної init-системи (systemd).
- Cloud-managed сервіси (AWS EC2, Google Cloud Compute): Зручні та масштабовані, але часто дорожчі та менш гнучкі для тих, хто хоче повний контроль над своїм середовищем. Самостійне налаштування LXD на VPS дає вам повний доступ до системи, дозволяє оптимізувати витрати та підлаштовувати конфігурацію під свої унікальні потреби.
Вибір self-hosted LXD на VPS виправданий, коли вам потрібна гнучкість, ізоляція, ефективне використання ресурсів, але при цьому ви хочете уникнути високих витрат та обмежень хмарних провайдерів.
Який VPS-конфіг потрібен для цього завдання
Вибір відповідного VPS для LXD залежить від кількості та типу контейнерів, які ви плануєте запускати. LXD сам по собі дуже легковежний, але кожен запущений контейнер споживає ресурси.
Мінімальні вимоги для хоста LXD (без урахування контейнерів):
- CPU: 1-2 vCPU (для хоста та кількох легковежних контейнерів). Сучасні процесори з інструкціями віртуалізації (VT-x/AMD-V) бажані, але LXD може працювати і без них, хоча й з меншою продуктивністю.
- RAM: 2 GB (для хоста та базових операцій LXD). Якщо ви плануєте запускати контейнери з базами даних або веб-серверами, знадобиться більше.
- Диск: 40-60 GB NVMe SSD. LXD може працювати з HDD, але SSD значно підвищує продуктивність вводу-виводу, що критично для контейнерів. NVMe забезпечує максимальну швидкість.
- Мережа: 1 Gbps порт (стандарт для більшості VPS).
Конкретний VPS-план для завдання (наприклад, для 3-5 контейнерів: веб-сервер, база даних, VPN-сервер):
- CPU: 4 vCPU
- RAM: 8 GB
- Диск: 160-200 GB NVMe SSD (з урахуванням місця для даних контейнерів та снапшотів)
- Мережа: 1 Gbps, без обмежень за трафіком або з великим лімітом.
Для оренди VPS із зазначеними характеристиками, переконайтеся, що провайдер пропонує NVMe SSD та достатню кількість ядер/RAM для ваших потреб. Більшість сучасних VPS-провайдерів пропонують такі конфігурації.
Коли потрібен dedicated, а не VPS:
Якщо ви плануєте запускати десятки контейнерів, високонавантажені бази даних, ігрові сервери з великою кількістю гравців, або у вас дуже специфічні вимоги до апаратного забезпечення (наприклад, GPU для машинного навчання), тоді варто розглянути виділений сервер (dedicated server). Dedicated сервери надають вам усі фізичні ресурси машини, що виключає "сусідський шум" та дає максимальну продуктивність. Також dedicated сервери часто мають більш гнучкі опції щодо дискової підсистеми (RAID, HDD+SSD).
Локація: на що впливає
Вибір локації VPS відіграє важливу роль, особливо для сервісів, критичних до затримок (latency):
- Затримка (Latency): Чим ближче сервер до вашої цільової аудиторії, тим нижча затримка та швидша відповідь. Для веб-сайтів це впливає на швидкість завантаження сторінок, для ігрових серверів — на пінг.
- Геополітичні фактори та законодавство: У деяких країнах діють суворіші закони щодо зберігання даних або цензури. Враховуйте це при виборі локації для конфіденційних даних або сервісів, що вимагають високого ступеня приватності.
- Вартість: Ціни на VPS можуть варіюватися залежно від локації через різницю у вартості електроенергії, оренди ЦОД та податків.
Завжди вибирайте локацію, яка знаходиться географічно ближче до більшості ваших користувачів або до вас, якщо ви є основним споживачем сервісу.
Підготовка сервера
Перед встановленням LXD необхідно виконати базове налаштування вашого VPS для забезпечення безпеки та стабільності. Ми будемо використовувати Ubuntu Server 24.04 LTS як основну операційну систему хоста.
1. Підключення за SSH
Підключіться до вашого сервера як користувач root або користувач, наданий провайдером:
ssh root@ВАШ_IP_АДРЕС
2. Оновлення системи
Насамперед оновіть усі пакети до актуальних версій:
sudo apt update # Оновлення списку пакетів
sudo apt upgrade -y # Оновлення встановлених пакетів без запиту підтвердження
sudo apt autoremove -y # Видалення непотрібних залежностей
3. Створення нового користувача з правами sudo (якщо ще немає)
Працювати під root небезпечно. Створіть нового користувача та надайте йому права sudo.
adduser ваш_пользователь # Створення нового користувача
usermod -aG sudo ваш_пользователь # Додавання користувача до групи sudo
Тепер вийдіть із сесії root та увійдіть під новим користувачем:
exit
ssh ваш_пользователь@ВАШ_IP_АДРЕС
4. Налаштування SSH-ключів (рекомендується)
Для підвищення безпеки рекомендується використовувати SSH-ключі замість паролів. Якщо у вас ще немає ключів, згенеруйте їх на локальній машині:
# На вашій локальній машині
ssh-keygen -t rsa -b 4096 -C "ваш[email protected]"
Потім скопіюйте публічний ключ на сервер:
# На вашій локальній машині
ssh-copy-id ваш_пользователь@ВАШ_IP_АДРЕС
Після перевірки входу за ключем, вимкніть автентифікацію за паролем у /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Знайдіть рядки та встановіть значення:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Перезапустіть SSH-сервіс:
sudo systemctl restart sshd
5. Налаштування Firewall (UFW)
Увімкніть брандмауер UFW та дозвольте лише необхідні порти (SSH, HTTP/HTTPS, а також порти, які використовуватимуться контейнерами).
sudo apt install ufw -y # Встановлення UFW
sudo ufw allow OpenSSH # Дозволити SSH (порт 22)
sudo ufw allow http # Дозволити HTTP (порт 80)
sudo ufw allow https # Дозволити HTTPS (порт 443)
sudo ufw enable # Увімкнути UFW
sudo ufw status verbose # Перевірити статус UFW
Пізніше, якщо ваші контейнери використовуватимуть інші порти, їх також потрібно буде відкрити.
6. Встановлення Fail2Ban
Fail2Ban допомагає захистити сервер від атак методом перебору паролів, блокуючи IP-адреси, з яких відбуваються численні невдалі спроби входу.
sudo apt install fail2ban -y # Встановлення Fail2Ban
sudo systemctl enable fail2ban # Увімкнення автозапуску сервісу
sudo systemctl start fail2ban # Запуск сервісу
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Створення локального конфігу
Ви можете відредагувати /etc/fail2ban/jail.local для налаштування правил, але типові налаштування для SSH вже досить хороші.
sudo systemctl restart fail2ban # Перезапуск Fail2Ban після змін
Ваш сервер тепер базово захищений та готовий до встановлення LXD.
Встановлення ПЗ — покроково
Встановлення ПЗ — покроково
Тепер, коли сервер підготовлений, переходимо до встановлення LXD. Ми будемо використовувати пакет snap, оскільки це рекомендований і найактуальніший спосіб встановлення LXD на Ubuntu.
1. Встановлення LXD через Snap
LXD на Ubuntu постачається як snap-пакет, що забезпечує його актуальність та ізоляцію. Для Ubuntu 24.04 LTS snap вже встановлений за замовчуванням.
sudo snap install lxd --channel=6.0/stable # Встановлення LXD 6.0 LTS (актуальна версія на 2026 рік)
Після встановлення додайте вашого користувача до групи lxd, щоб ви могли керувати LXD без sudo:
sudo usermod -aG lxd ваш_пользователь # Додавання користувача до групи lxd
newgrp lxd # Застосування змін групи без перелогіну (або просто перелогіньтеся)
Переконайтеся, що LXD встановлений і доступний:
lxd --version # Перевірка версії LXD
2. Ініціалізація LXD
Після встановлення LXD необхідно ініціалізувати його, задавши базові налаштування сховища та мережі. Це інтерактивний процес.
lxd init # Запуск інтерактивної ініціалізації LXD
Під час ініціалізації вам будуть задані наступні питання. Ось рекомендовані відповіді для більшості VPS-сценаріїв:
Would you like to use LXD clustering? (yes/no) [default=no]:no (для одного VPS кластер не потрібен)Do you want to setup a new storage pool? (yes/no) [default=yes]:yesName of the new storage pool [default=default]:default (або будь-яке інше ім'я)Would you like to use an existing block device? (yes/no) [default=no]:no (якщо у вас немає окремого диска)Would you like to use a new loop device? (yes/no) [default=yes]:yes (створить файл-образ для зберігання контейнерів)Size in GiB of the new loop device (minimum 4GiB) [default=100GiB]:50GiB (або більше, залежно від розміру вашого диска та планів. Залиште запас для хоста)Would you like to connect to a remote LXD daemon? (yes/no) [default=no]:noWould you like to setup a new network bridge? (yes/no) [default=yes]:yesWhat should the new bridge be called? [default=lxdbr0]:lxdbr0 (стандартна назва)What IPv4 address should be used? (CIDR format, e.g. 10.0.0.1/24) [default=10.200.200.1/24]:10.200.200.1/24 (або будь-який інший приватний діапазон, який не перетинається з вашою локальною мережею)Would you like LXD to NAT traffic on its own? (yes/no) [default=yes]:yes (для доступу контейнерів в інтернет)What IPv6 address should be used? (CIDR format, e.g. fd42:42:42:42::1/64) [default=none]:none (якщо IPv6 не потрібен)Would you like the LXD daemon to be available over the network? (yes/no) [default=no]:no (якщо ви не плануєте керувати LXD віддалено)Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:yesWould you like a YAML summary of your configuration? (yes/no) [default=yes]:yes
Після завершення ініціалізації LXD готовий до роботи. Ви можете перевірити статус мережі:
lxc network list # Перегляд налаштованих мереж LXD
3. Запуск першого контейнера
Тепер давайте запустимо наш перший контейнер. Наприклад, Ubuntu 22.04 LTS.
lxc launch ubuntu:22.04 my-first-container # Запуск контейнера з образом Ubuntu 22.04 LTS під іменем my-first-container
Перевірте статус контейнера:
lxc list # Список усіх запущених контейнерів
Ви побачите статус RUNNING та IP-адресу, присвоєну контейнеру в мережі lxdbr0.
4. Вхід у контейнер та базове налаштування
Ви можете отримати командний рядок всередині контейнера:
lxc exec my-first-container bash # Виконання команди bash всередині контейнера
Всередині контейнера можна працювати як на звичайній Ubuntu-системі. Оновіть його:
apt update && apt upgrade -y # Оновлення пакетів всередині контейнера
exit # Вихід з контейнера
5. Налаштування профілю для контейнерів (приклад)
Профілі LXD дозволяють застосовувати стандартні налаштування (ресурси, мережа) до кількох контейнерів. Створимо профіль для веб-сервера.
lxc profile copy default webserver # Копіювання дефолтного профілю в новий 'webserver'
lxc profile edit webserver # Редагування нового профілю
У YAML-файлі, що відкрився, додайте або змініть секцію limits:
config:
limits.cpu: "2" # Обмеження CPU до 2 ядер
limits.memory: "2GB" # Обмеження RAM до 2GB
limits.disk: "50GB" # Обмеження диска до 50GB (якщо використовуєте pool з квотами)
user.user-data: | # Приклад cloud-init для початкового налаштування
#cloud-config
runcmd:
- echo "Hello from cloud-init!" > /root/cloud-init-test.txt
packages:
- nginx
users:
- name: myuser
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC... your_public_key_here
Збережіть та закрийте файл. Тепер ви можете запускати контейнери з цим профілем:
lxc launch ubuntu:22.04 my-web-server --profile webserver # Запуск контейнера з профілем webserver
Це забезпечує стандартизацію та спрощує керування ресурсами.
6. Прокидання портів на хості для доступу до контейнерів
За замовчуванням контейнери мають приватні IP-адреси. Щоб зробити сервіс всередині контейнера доступним з інтернету, потрібно прокинути порт з хоста на контейнер. Наприклад, якщо Nginx у контейнері my-web-server слухає порт 80, а ви хочете, щоб він був доступний за портом 80 вашого VPS:
lxc config device add my-web-server myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:10.200.200.X:80 # Прокидання порту 80 з хоста на контейнер
Замініть 10.200.200.X на реальну IP-адресу вашого контейнера (можна дізнатися через lxc list). Не забудьте відкрити порт 80 в UFW хоста, якщо він ще не відкритий.