LXC

Контейнерная виртуализация выполняется на уровне операционной системы — обычно это Docker или LXC, она выгодно отличается, например от KVM тем, что не требует перекомпиляции ядра. LXC о котором пойдет речь может работать с «ванильным ядром», т.е. ядром в которое специально не вносилось каких-либо изменений.

LXC контейнер — гостевая система, которая создается в рамках хоста и создается, а затем администрируем выполнением команд с хоста, который после запуска на нем гостевых систем становится мастер-сервером .

 

 

LXC контейнер и виртуализация в Ubuntu

Для создания виртуальных машин на базе LXC удобно использовать Ubuntu, при подготовке данного материала использовалась серверная Ubuntu 16.04. ВСе команды кроме тех, что вводятся в консоли гостевой системы выполяняются от имени root или с sudo.

 

Обновляем информацию о подключенных репозиториях

apt-get update

 

Устанавливаем необходимые пакеты

apt-get install lxc systemd-services lxc-templates cgroup-bin \
bridge-utils debootstrap

 

После того как процесс завершится (будет занято около 60 Мб места на диске) сервер нужно перезагрузить поскольку в процессе установки вносились изменения в сетевые настройки — был добавлен интерфейс, на котором будут работать гостевые системы

 

После перезагрузки можно создавать первый контейнер, именем виртуальной машины будет container. Создавать машину будем из шаблона (ubuntu), все доступные шаблоны находятся в каталоге /usr/share/lxc/templates/ (туда можно загружать свои шаблоны)

 

lxc-create -n container -t ubuntu

 

 

Список существующих LXC контейнеров можно вывести выполнив

lxc-ls -f

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

lxc-start -n container

Останавливается виртуальная машина идентичным способом

lxc-stop -n container

 

Данные конкретном контейнере можно посмотреть

lxc-info -n container

 

 

 

Контейнер является полноценной виртуальной машиной с которой можно работать по SSH

С мастер хоста можно попасть внутрь выполнив:

lxc-console -n container

 

Оказавшись внутри гостевой системы из нее не так просто выйти, при вводе стандартной комбинации CTRL+D вновь возникнет диалог авторизации, выйти из которого нельзя. Самым распространенным способом является работы с виртуальными машинами является использование screen или, более простое решение — при необходимости покинуть сервер можно зайти на мастер другой консолью и сказать  lxc-stop -n container

 

После того как заданы сетевые настройки гостевой системе можно выделить белый IP адрес и заходить на нее как на любой другой сервер. О настройках сети говорится в заключающей части статьи.

 

Поскольку LXC контейнер создавался из шаблона логин и пароль стандартные — ubuntu. Оказавшись в системе пароль нужно сменить, иначе сервер будет быстро взломан ботами, подбирающими пароли.

 

Ненужный больше контейнер можно удалить

lxc-destroy -n container

 

 

 

Дополнительные возможности при работе с LXC

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

LXC контейнер можно склонировать

lxc-clone -o container -n container-clone

 

Можно создать точный снимок системы, затем восстановиться из него в любой удобный момент (этот функционал идентичен другим системам виртуализации)

 lxc-snapshot -n container

Восстановление выполняется так

  lxc-snapshot -n container -r snap1

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

lxc-snapshot -n container -L

 

Настройка автозапуска гостевых систем

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

Они вносятся в /var/lib/lxc/CONTAINERNAME/config и заключаются в добавлении трех строк, значения второй и третьей директив можно варьировать

lxc.start.auto = 1
lxc.start.delay = 10
lxc.start.order = 40

 

Выделение виртуальной машине указанного количества серверных ресурсов

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

 

Все корректировки применимы к существующим машинам, однако они в обязательном порядке должны быть перезагружены для того чтобы изменения в конфигах вступили в силу (можно задавать и для работающих, в таком случае они будут актуальны до перезагрузки — lxc-cgroup -n container memory.limit_in_bytes 512M, после перезагрузки начнут использоваться заданные в конфигурационных файлах).

 

Ограничение по CPU

Перед внесением изменений останавливаем тестовый LXC контейнер.

mcedit /var/lib/lxc/container/config

lxc.cgroup.memory.limit_in_bytes = 512M

 

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

lxc-cgroup -n container memory.limit_in_bytes

 

Также можно использовать дебаг

lxc-start -d -n container -l debug -o container.log

Затем можно выбрать из лога все упоминания о «memory» используя grep

 

Настройки по ограничению памяти можно задать очень тонко, но на практике они применимы для специальных случаев в которых лучше всего обратиться к документации LXC

 

Ограничение по диску

Ограничить количество пространства на диске хост машины который может использовать LXC контейнер можно несколькими способами: для этого можно использовать LVM или выделить отдельный раздел в /var/lib/lxc/CONTAINAME, примонтировать его, добавить в /etc/fstab. Второй способ применим чаще, но предполагает ограничение в .img файле, на основе которого создается машина, поэтому поменять объем диска существующей вирт. машины будет сложнее, чем с LVM.

На этапе создания машины нужно выполнить такие действия:

Ограничиваем размер файла при помощи truncate до 1 Гб

truncate -s 1G /var/lib/lxc/container.img

 

Создаем файловую систему ext4

mkfs.ext4 -F /var/lib/lxc/container.img

 

Каталог непосредственно под LXC контейнер

 mkdir /var/lib/lxc/container

И монтируем раздел

 mount -t ext4 -o loop /var/lib/lxc/container.img \
/var/lib/lxc/container

 

В /etc/fstab допишем строку для автоматического монтирования раздела после перезагрузки:

mcedit /etc/fstab

/var/lib/lxc/container.img /var/lib/lxc/container ext4 loop 0 0

 

Теперь при создании контейнера система увидит, что заданное имя container совпадает с именем каталога и раздела и разместит данные в нем, авторизовавшись на виртуальной машине по SSH и выполнив команду df -h можно будет увидеть, что объем файловой системы составляет 1 Гб

 lxc-create -t ubuntu -n container

 

 

LXC контейнераизация и настройки сети

Виртуальные машины по умолчанию получают адреса из приватной сети, создано их может быть сколько угодно много, все машины будут иметь доступ во внешний мир через NAT заданный автоматически при установке в iptables. Во внешней сети все виртуальные сервера при этом будут видны как один белый адрес, который на самом деле принадлежит хост машине.

Проверить адрес можно выполнив команду

curl ip.server-gu.ru

 

Чтобы каждая гостевая система (или некоторые из них) была доступна по белому IP адресу — если хост машине выделено несколько таких адресов — можно настроить виртуальный бридж, однако проще добавить правило в таблицу NAT цепочки PREROUTING iptables

 

iptables -t nat -A PREROUTING -d 123.123.123.123/32 -j DNAT —to-destination 10.0.3.112

 

После добавления правила, все запросы на внешний адрес будут маршрутизироваться на локальный адрес 10.0.3.112, в сети таким образом сервер будет виден как полностью самостоятельная машина (за исключением того, что IP адрес будет резолвиться в имя хост машины)