LXC/LXD-контейнеры в продакшене: кластеры, сети, снапшоты и миграция для серьёзных инсталляций
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет работы с линукс-инфраструктурой я прошёл путь от OpenVZ начала 2010-х через голый LXC до промышленных LXD-кластеров на Ubuntu Server LTS. В дата-центре МТС у нас стоят два узла на Dell Xeon Platinum 8280 с 40G Mellanox, связанные в LXD-кластер и держащие больше сотни контейнеров клиентских сервисов. И это работает стабильнее, чем многие K8s-инсталляции сопоставимого размера.
LXC, LXD, Incus — что именно ставить в 2026 году
Ландшафт немного перетряхнулся после перехода LXD под крыло Canonical. В 2023 году сообщество форкнуло LXD в проект Incus под управлением Linux Containers. Оба проекта живут, оба совместимы по большей части CLI, но расходятся в деталях.
- LXC — низкоуровневые утилиты (lxc-start, lxc-ls). Подходит, если нужна максимальная гибкость и вы готовы писать конфиги руками.
- LXD (Canonical) — стабильный выбор на Ubuntu 22.04/24.04 LTS, тесная интеграция с MAAS и Juju.
- Incus — форк сообщества, быстрее добавляют фичи, работает без snap.
Я всегда на новых проектах ставлю LXD из snap на Ubuntu Server 22.04 LTS — это стандарт, обкатан на миллионах инсталляций.
Установка и первичная инициализация
# Ubuntu 22.04 LTS
sudo apt update
sudo snap install lxd --channel=5.21/stable
sudo usermod -aG lxd $USER
newgrp lxd
# Инициализация
lxd init
# Ключевые вопросы lxd init:
# - Configure the storage pool: zfs
# - Pool device: /dev/sdb (отдельный диск под данные)
# - Configure a new local network bridge: yes, lxdbr0
# - Subnet: 10.100.0.0/24
# - IPv6: none
После завершения init у вас есть готовая инсталляция: storage pool на ZFS, дефолтный профиль и сетевой бридж. На продакшене я всегда отделяю rootfs хоста от storage pool физически — rootfs на SSD, контейнеры на отдельном пуле из NVMe или SAS-дисков в raidz.
Создание контейнеров и запуск
# Список доступных образов
lxc remote list
lxc image list ubuntu: | head -20
# Создать контейнер
lxc launch ubuntu:22.04 web01
lxc launch ubuntu:22.04 web02
# Запустить команду внутри
lxc exec web01 -- apt update
lxc exec web01 -- apt install -y nginx
# Получить оболочку
lxc shell web01
# Список, статус, сеть
lxc list
lxc info web01 --show-log
Профили: правильный способ управления конфигурацией
Профиль в LXD — это набор настроек (сеть, диск, лимиты, security), который можно применить к любому контейнеру. Это главный инструмент DRY в LXD. У нас на практике я создаю профили под типовые роли: web, db, mail-relay, worker — и новые контейнеры получают настройки мгновенно.
# Создать профиль
lxc profile create web
# Задать лимиты через YAML
cat <<EOF | lxc profile edit web
config:
limits.cpu: "2"
limits.memory: 2GB
limits.memory.swap: "false"
boot.autostart: "true"
security.nesting: "false"
devices:
eth0:
type: nic
network: lxdbr0
root:
type: disk
pool: default
path: /
size: 10GB
EOF
# Применить профиль
lxc profile add web01 web
lxc launch ubuntu:22.04 web03 -p default -p web
Сети: bridge, macvlan, OVN
LXD предлагает три модели сетей. Выбор зависит от требований.
| Тип | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| bridge (lxdbr0) | Дефолт, dev-среды | Простота, NAT, DHCP | Нужен проброс портов |
| macvlan | Контейнер в сети офиса | Прямой IP, видно по L2 | Нельзя с хостом общаться |
| OVN | Кластеры, overlay | L3-сегменты, ACL, VRF | Сложность настройки |
# macvlan
lxc network create officenet --type=macvlan parent=eno1
lxc config device add web01 eth0 nic nictype=macvlan parent=eno1
# OVN (требует предустановленного OVN-кластера)
lxc network create ovn1 --type=ovn network=UPLINK
lxc network set ovn1 ipv4.address=10.200.0.1/24
Кластеризация: объединяем три узла
LXD cluster — киллер-фича для серьёзных инсталляций. Один набор команд управляет всеми узлами, контейнеры распределяются автоматически, ZFS-снапшоты доступны для миграции.
# На первом узле
lxc cluster enable node01
# На втором и третьем — повторить lxd init,
# указав "Are you joining an existing cluster? yes"
# и введя trust token, полученный через
lxc cluster add node02
# Скопировать join-token и вставить при инициализации
# Посмотреть узлы
lxc cluster list
# Создать контейнер с выбором узла
lxc launch ubuntu:22.04 db01 --target node02
Важный момент: в кластере storage pool типа dir или zfs должен быть локальным на каждом узле. Для общего хранилища используйте ceph или remote storage.
Снапшоты и бэкапы
ZFS-снапшоты в LXD — копеечные операции. Я всегда настраиваю автоматическую ротацию перед апдейтами.
# Создать снапшот
lxc snapshot web01 before-upgrade-2026-04-17
# Откатиться
lxc restore web01 before-upgrade-2026-04-17
# Автоматические снапшоты через профиль
lxc config set web01 snapshots.schedule "0 3 * * *"
lxc config set web01 snapshots.expiry "14d"
# Экспорт контейнера в tar.gz
lxc export web01 /backup/web01-$(date +%F).tar.gz
# Импорт на другой узел
lxc import /backup/web01-2026-04-17.tar.gz
Миграция между узлами
# Stopped-миграция между узлами кластера
lxc move web01 --target node03
# Cross-cluster с другим LXD
lxc remote add remote-hq 192.168.50.10 --password SECRET
lxc copy web01 remote-hq:web01-copy
# Live migration (экспериментально, нужен CRIU)
lxc move web01 --target node02 --mode=pull
Кейс: консолидация 22 сервисов на двух-узловой кластер
Осенью 2025 к нам пришёл клиент — проектное бюро, 65 рабочих мест, 22 разрозненных линукс-сервиса на старом железе (HP DL360 G7, 8 штук). Цель — собрать всё на двух свежих узлах и дать запас для роста. Мы взяли два Dell Xeon Platinum 8280, по 256 ГБ DDR4 и 8 NVMe U.2 в raidz2, связали 40G Mellanox в кросс, поставили Ubuntu 22.04 LTS и LXD 5.21.
Архитектура:
- ZFS storage pool 24 ТБ под контейнеры.
- OVN overlay-сеть для изоляции прод/стейдж.
- 8 профилей: web, db, worker, ci, monitoring, mail, dev, legacy.
- Автоматические ежедневные снапшоты + репликация через zfs send на третий узел-бэкап.
Итог: 22 сервиса переехали за 6 рабочих дней, uptime при миграциях не падал ниже 99,8%. Экономия электричества 140 000 руб/год, освобождение 8 юнитов стойки, цикл развёртывания нового сервиса сократился с 2 дней до 20 минут. Стоимость проекта — 320 000 руб.
Мониторинг и типовые грабли
- Подключайте Prometheus node_exporter внутри каждого контейнера + кастомный lxd-exporter на хосте.
- Следите за inotify watches:
sysctl fs.inotify.max_user_watches=524288. - Если nginx в контейнере жрёт CPU — проверьте
worker_rlimit_nofile, контейнеры получают свой ulimit. - При апдейте LXD через snap убедитесь, что
snap refreshне идёт в кластере одновременно на всех узлах. - ZFS ARC ест память — ограничьте
zfs_arc_maxв /etc/modprobe.d/zfs.conf, иначе отожмёт у контейнеров.
Развёртывание LXD-кластеров под ключ
Проектирую и настраиваю LXD/Incus-кластеры на Ubuntu Server LTS с ZFS и OVN, миграцию с виртуалок, интеграцию с системой бэкапов. Работа с хостингом в дата-центре МТС или на собственном железе клиента.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — LXC/LXD в продакшене
- Чем LXD отличается от LXC?
- LXC — низкоуровневая библиотека. LXD — демон поверх LXC с REST API, кластеризацией, профилями и удобной CLI.
- Какой storage pool выбрать?
- Для продакшена ZFS — снапшоты, сжатие, репликация.
- Сколько контейнеров помещается на узел?
- На Dell Xeon Platinum 8280 с 256 ГБ RAM — до 180 рабочих контейнеров. Узкое место — лимиты ядра.
- Работает ли live migration?
- Да, через CRIU, но с ограничениями. Для stateful-сервисов надёжнее stopped-миграция с репликацией ZFS.
- Можно ли Windows внутри LXD?
- Нет, только Linux. Для Windows используйте LXD Virtual Machines (KVM под управлением LXD).