LXC: Установка и настройка на Oracle Linux 7



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

План следующий:
0. Постановка задачи
1. Выбор платформы (другими словами — ОС);
2. Подготовка платформы для развертывания системы контейнеризации LXC;
3. Установка и настройка системы LXC;
4. Создание первого контейнера и его настройка для работы во внешней или внутренней сети.
Поехали!

0. Постановка задачи
Первое что необходимо отметить — не стоит выбирать систему LXC для очень серьезных (mission critical) задач, поскольку данная технология до сих пор пока не зарекомендовала себя как надежная и безотказная. Если нужна безопасность в ущерб перформансу — выбирайте полноценную виртуализацию (kvm, esxi); если стоит задача выжать максимум из железа с минимумом накладных ресурсов — имеет смысл читать дальше.
Задачи следующие:
— создание полноценных контейнеров с максимальной изоляцией между контейнер-контейнер и контейнер-нода;
— управление ресурсами контейнера — ядра, ОЗУ, диск, сеть, ввод-вывод.
И сразу минусы — в LXC вы не сможете:
— при использовании LVM в качестве дискового пространства контейнера менять размеры диска контейнера «на лету», без даунтайма (про LVM будет идти речь дальше);
— маунтить устройства / работать напрямую с девайсами (только через костыльные пробросы через ноду в контейнер);
Пожалуй, это все требования, которые я предъявлял к LXC. Дальше идет информация, на которую я потратил очень много времени и гигабайтов интернет-соединения, а именно..

1. Выбор платформы
Это отправная точка всей системы, это тот корабль, который выберешь и он поплывет. Если не тратить время впустую, то мой выбор остановился на Oracle Linux 7.5 с ядром UEKR5 (хотя и дефолтный UEKR4 тоже работает исправно).
Почему такой выбор?
Enterprise Linux’ы де-факто стандарт операционных систем для серверов. Поддержка в 10 лет позволяет снизить нагрузку на обслуживание парка серверов (Ops) и заниматься более важными и сложными задачами. По моим наблюдениям очень хорошая поддержка LXC организована в Ubuntu (там он и посвежее), но для меня критериями выбора платформы всегда являются надежность, стандартизация и длительный срок поддержки. Итого — Ubuntu нет.
Другой кандидат, стандарт среди бесплатных EL — CentOS. При тестовом использовании данной платформы замечен один огромный минус — не работает ограничение ресурсов CPU в LXC (настройка есть, а вот работать она не работает). LXC ставится из EPEL.
В итоге выбор пал на Oracle Linux. Тот же RHEL, бесплатный, поддержка LXC заявлена производителем и им же поддерживается, очень хорошее качество дистрибутива и надежность работы. Хоть LXC на нем, судя по версии, не самый свежий (версии 1.x), из опыта тестирования и работы собран он очень добротно и продуманно.
Замечена такая же история, что и с CentOS — если загружать ядро RHEL, то ограничения CPU в LXC не работают. На ядре UEK все работает исправно.
Итого: Oracle Linux 7 + UEK (R4 или R5).

2. Подготовка платформы
Предполагается, что имеется пустой сервер (железка) без установленной ОС.
Диск LVM: установить OL7 на том LVM (это крайне важно, иначе не сможете реализовать нормальное ограничение диска). Пример: диск 4ТБ в аппаратном RAID1. При установке OL7 создаем LVM на весь диск (но при этом раздел /boot на отдельном разделе; получается sda1 это /boot, sda2 это swap, а sda3 уже LVM PV). В LVM создаем том размером в 30ГБ (к примеру) для хост ос, а остальное место будет занято логическими разделами контейнеров.

Bridge. После установки OL7 в качестве хост ос необходимо создать сетевой мост на внешний интерфейс (чтобы снаружи был прямой доступ по внешнему IP контейнера). Так удобно в большинстве случаев. Инструкцию по созданию сетевого моста напишу как-нибудь позже.
Далее по тексту мостом будет br0, который смотрит во внешний интерфейс eth0.

3. Установка и настройка LXC
Установка выполняется легко:

# yum install lxc

установится lxc, lxc-net, dnsmasq и пара библиотек. Все довольно быстро.
А далее не совсем логичный ход: необходимо поставить lxcfs. Поскольку он отсутствует в репозиториях, да и в бинарном виде его мало где встретишь, то приходится «костылить» и устанавливать сразу rpm-пакет:

# yum install https://copr-be.cloud.fedoraproject.org/results/iavael/lxd-epel/epel-7-x86_64/00683242-lxcfs/lxcfs-2.0.8-0.1.el7.centos.x86_64.rpm

Он очень важен. Дело в том, что по-умолчанию информация в /proc в контейнере отображается с характеристиками хоста, что не корректно в случае ограничения оперативной памяти и процессора. Задача lxcfs — управление служебными файлами в /proc внутри контейнера, чтобы приложения внутри контейнера видели объем ОЗУ и процессора с учетом ограничений.
Для завершения установки необходимо включить службу lxcfs:

# systemctl enable lxcfs

и перезагрузить хост ос для создания виртуальной сети LXC внутри хоста. После перезагрузки если все сделано верно, то нужно обратить внимание на сетевые настройки:

[root@lxcnode12 ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether b8:70:f4:80:07:a7 brd ff:ff:ff:ff:ff:ff
3: br0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b8:70:f4:80:07:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.40/26 brd 192.168.1.63 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba70:f4ff:fe80:7a7/64 scope link
       valid_lft forever preferred_lft forever
4: lxcbr0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 26:10:6c:fb:22:05 brd ff:ff:ff:ff:ff:ff
    inet 10.132.92.1/24 scope global lxcbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::2410:6cff:fefb:2205/64 scope link
       valid_lft forever preferred_lft forever

главное — br0 (мост на внешний интерфейс) и lxcbr0 (мост для виртуальной сети lxc). lxcbr0 обеспечивает сетевое соединение между контейнерами на одной ноде, а также подключение с ноды в контейнер (если lxc-console не удобен, а это именно так).
Настройка LXC. Главный конфиг: /etc/lxc/default.conf, его и будем редактировать. Из него получаются конфиги контейнеров. Ниже приведено его содержимое с комментариями:

# скрипты для работы lxcfs
# взято из rpm -ql lxcfs,
# а именно /usr/share/lxc/config/common.conf.d/00-lxcfs.conf
lxc.hook.mount = /usr/share/lxcfs/lxc.mount.hook
lxc.hook.post-stop = /usr/share/lxcfs/lxc.reboot.hook

# настройки ВНЕШНЕЙ сети
# цепляемся к br0
# внутри контейнера отображаемся как eth1
lxc.network.type = veth
lxc.network.link = br0
lxc.network.name = eth1
lxc.network.flags = up
lxc.network.hwaddr = 00:00:01:xx:xx:xx

# настройки ВНУТРЕННЕЙ сети
# цепляемся к lxcbr0
# внутри контейнера отображаемся как eth0
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:00:00:xx:xx:xx

# Настройки ресурсов:
# Какой процессор использовать
lxc.cgroup.cpuset.cpus = 0,2-3
# Приоритет если несколько контейнеров
# Требуют один и тот же процессор
# 1024 - максимальный
# 1 - минимальный
lxc.cgroup.cpu.shares = 512
# Лимит оперативной памяти в МБ
lxc.cgroup.memory.limit_in_bytes = 512M
# Лимит оперативной памяти + своп
# В данном конфиге своп 256МБ (768 - 512)
lxc.cgroup.memory.memsw.limit_in_bytes = 768M
# Приоритет дисковой подсистемы
# Аналогично с приоритетом процессора
lxc.cgroup.blkio.weight = 200

Основные настройки окончены. Пора переходит к созданию первого контейнера.

4. Создание контейнера LXC
Контейнеры создаются скриптами-шаблонами LXC. Поскольку создание различных контейнеров сильно не отличается, то для установки контейнера с Oracle Linux 7 используется команда:

lxc-create -t oracle -n backend12 -B lvm --vgname lxcnode12 --fssize 12G --fstype ext4 -- --release=7.latest

А для установки контейнера с CentOS команда выглядит немного иначе:

lxc-create -t centos -n backend12 -B lvm --vgname lxcnode12 --fssize 12G --fstype ext4 -- --release=7

Необходимо разобрать ключи:
-t centos — template centos — имя шаблона;
-n backend12 — имя контейнера;
-B LVM — дисковая подсистема контейнера — LVM;
—vgname lxcnode12 — имя группы томов LVM;
—fssize 12G — 12ГБ размер диска контейнера;
—fstype ext4 — ФС контейнера
— —release=7 — после «—» идут ключи для скрипта установки контейнера.
—release=7 — установить в контейнер CentOS версии 7.
ВАЖНО: В конце выводу процесса установки пишется о том, как можно получить пароль от root контейнера. При шаблоне oracle пароль root, при шаблоне centos пароль содержится в /container/$имя_контейнера$/root_tmp_pass. Об этом пишется в выводе в конце установки!
Конфиг контейнера лежит по /container/backend12/config.
После создания контейнера можно посмотреть логический раздел LVM:

[root@lxcnode12 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert backend12 lxcnode12 -wi-a----- 12.00g root lxcnode12 -wi-ao---- 30.00g

Запускаем контейнер:

# lxc-start -n backend12

ждем несколько секунд, и смотрим информацию:

[root@lxcnode12 ~]# lxc-info -n backend12 Name: client State: RUNNING PID: 1370 IP: 10.132.92.153 CPU use: 6.03 seconds Memory use: 47.40 MiB KMem use: 4.06 MiB Link: vethHOW3RR TX bytes: 656 bytes RX bytes: 1.40 KiB Total bytes: 2.04 KiB Link: vethOTSTLY TX bytes: 1.43 KiB RX bytes: 1.53 KiB Total bytes: 2.96 KiB

Как видим, внутренний IP на интерфейсе контейнера eth0 получился по dhcp, и по нему можно уже пройти:

# ssh root@10.132.92.153

Чтобы остановить контейнер, используется lxc-stop. Также внутри контейнера можно перезагружаться (reboot) и останавливаться (poweroff). Для удаления контейнера используется lxc-destroy.
Настройки сети внутри контейнера такие же, как и всегда — редактирование /etc/sysconfig/network-scripts/ifcfg-* классическое. По умолчанию в данном мануале сделано так, что контейнер имеет доступ только в виртуальную сеть LXC внутри ноды, поскольку по-умолчанию контейнер настроен на получение адреса по dhcp на интерфейсе eth0. Чтобы получить доступ в контейнер снаружи, необходимо внутри контейнера настроить параметры для eth1 (который подключен к мосту внешнего интерфейса хоста).
И в общем-то все.

[root@backend12 ~]# free -m total used free shared buff/cache available Mem: 512 13 458 16 39 458 Swap: 256 0 256 [root@backend12 ~]# top top - 23:49:43 up 7 min, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 15 total, 1 running, 14 sleeping, 0 stopped, 0 zombie %Cpu0 : 3.6 us, 3.6 sy, 0.0 ni, 92.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 524288 total, 469196 free, 14132 used, 40960 buff/cache KiB Swap: 262144 total, 262144 free, 0 used. 469196 avail Mem

Ждите серию статей про управление контейнерами LXC — онлайн добавление памяти / процессора, а также изменение размера диска.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s