В этой статье мы поговорим об использовании LXC в системах Oracle Linux, CentOS, RHEL 6.X/7.X (RHEL-based), с использованием кастомного ядра Oracle: Unbreakable Enterprise Kernel (UEK) 4, в режиме bridge (через мост, контейнеры будут иметь прямой выход наружу по внешнему адресу).
Предисловие. Когда передо мною встала данная задача, я сначала бросился искать мануалы в сети. Однако их нет (!), потому что любое использование LXC в системах RHEL-based было описано через костыль, гордо именованный libvirt (который признан устаревшим в RHEL 7.2). Однако нужно было адекватное, стабильное, простое и понятное решение с контейнерами, а именно сделать их доступными напрямую в сети хоста (ноды) без шаманств и танцев с бубном вокруг NAT (что особый гемор, когда речь идет о десятках портов в каждом контейнере). Именно поэтому, было решено использовать напрямую linux-bridge (далее — «белый мост») он же br0. После установки lxc выше версии 1.0.8 в систему интегрируется «серый мост» (он же lxcbr0). В нашем руководстве он попросту не нужен, имейте это ввиду. Ненужный мост, можно отключить так:
nano /etc/sysconfig/lxc-net
USE_LXC_BRIDGE="false"
Несколько слов по поводу ядра. Поскольку ядро 2.6 полноценно не поддерживает LXC (точнее так: 2.6.32 — основной lxc, 3.8 lxc-attach, 3.12 cgmanager unpriv, а 2.6 используется во всех дистрибутивах RHEL-based 6.X), то мы попросту поменяем его на UEK4, который основан на ванильном ядре 4.1 с доработками Oracle. Ядро полностью поддерживает все фичи LXC. Также мы поставим его и по всех RHEL-based 7.X. Поехали!
После установки, настройки сети и обновления вашей системы, преступайте к дальнейшей настройке, что описана ниже.
1. Подключаем rpm-репозитории Oracle
Необходимо, для установки всего софта и его обновлений:
cd /etc/yum.repos.d wget http://public-yum.oracle.com/public-yum-ol6.repo
(тут в конфиге нужно включить нужные нам репы, поставив «enabled=1» в [ol6_UEKR4], также можете включить и другие)
Далее проверяем и обновляемся:
yum repolist yum update
2. Установка специального ядра Oracle UEK4 (Unbreakable Enterprise Kernel)
Ставим нашу крутое ядро:
yum install kernel-uek-4.1.12-*
После чего несколько модификаций, чтобы оно грузилось по дефолту (только для 6.X ОС CentOS и RHEL, для Oracle Linux не нужно):
sed -i 's/default=1/default=0/' /etc/grub.conf && sed -i 's/DEFAULTKERNEL=kernel/DEFAULTKERNEL=kernel-uek/' /etc/sysconfig/kernel rm -f /boot/grub/grub.conf mv /etc/grub.conf /boot/grub/ ln -s /boot/grub/grub.conf /etc/grub.conf
А для (только для 7.X ОС CentOS и RHEL, для Oracle Linux не нужно) чуть по другому, из-за более современной версии grub (выбрать нужны номер):
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg grub2-set-default 1
После чего перезагрузка:
reboot
3. Установка необходимых утилит
Ставим утилиты, которые активируют соответствующие функции в ядре:
yum install lxc bridge-utils
4. Настройка моста
Необходимо настроить сетевые интерфейсы следующим образом (eth0 основной настроить как часть «белого» моста br0):
nano /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0" TYPE=Ethernet ONBOOT=yes BOOTPROTO=none BRIDGE=br0 DELAY=10
nano /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0" TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=1.2.3.4 NETMASK=255.255.255.0 GATEWAY=1.1.1.2 DNS1=1.1.1.10 DNS2=1.1.1.11 DELAY=0 ARPCHECK=no
После чего следует перезагрузится:
reboot
5. Проверка мостов и подготовка LXC к работе
После того как сервер загрузится, проверим его готовность и настойку мостов:
ifconfig brctl show bridge link show br0
Смонтируем что надо для LXC:
mount -t cgroup cgroup /cgroup
nano /etc/fstab ----- cgroup /cgroup cgroup defaults 0 0
6. Работа с LXC
Далее идет непосредственно работа с LXC. Принцип работы: имеется «белый мост» (br0), в него входит физический интерфейс хоста (eth0) и виртуальные интерфейсы контейнеров (vethXXX и т.д.), у каждого контейнера будет свой виртуальный интерфейс, а у каждого виртуального интерфейса будет свой «белый» IP адрес (без использования NAT и роутинга). Никакие доп.настройки iptables или firewalld не требуются. Вот список основных команд…
Версия LXC:
lxc-cgroup --version
Параметры LXC:
lxc-checkconfig
Общий список всех контейнеров:
lxc-ls
Склонировать контейнер С1, новый контейнер назвать С2:
lxc-clone -o C1 -n C2
Запустить контейнер С1:
lxc-start -n C1
Запустить контейнер С1, не входя в него:
lxc-start -d -n C1
Остановить контейнер С1:
lxc-stop -n C1
Удалить контейнер С1:
lxc-destroy -n C1
Зайти в консоль контейнера С1:
lxc-console -n C1
Поставить контейнер С1 на паузу:
lxc-freeze -n C1
Восстановить контейнер С1 из паузы:
lxc-unfreeze -n C1
Информация по контейнеру:
lxc-info -n C1
7. Эталонный контейнер
Создадим его и поправим соответствующий конфиг (в репозиториях Oracle Linux лежит версия 1.1.5, вместо обычной 1.0.8, и у нее путь нахождения контейнеров лежит тут /container/..):
lxc-create -t centos -n C1 nano /container/C1/config
Вот и он (обратите внимание, IP надо указывать в формате CIDR, сеть класса B):
# DF container ################################################ ### DF [network type] lxc.network.type = veth ### DF [link UP] lxc.network.flags = up ### DF ["white" bridge] lxc.network.link = br0 ### DF [virtual adapter in container] lxc.network.name = eth0 ### DF [IP address] lxc.network.ipv4 = 172.16.0.0/16 ### DF [gateway] lxc.network.ipv4.gateway = 172.16.0.1 ### DF [autostart yes/no] lxc.start.auto = 1 ### DF [autostart delay in seconds] lxc.start.delay = 0 ################################################ # Include common configuration lxc.include = /usr/share/lxc/config/centos.common.conf lxc.arch = x86_64 lxc.rootfs = /container/C1/rootfs lxc.utsname = C1
Текстовый вид: container
После чего включить контейнер, он сразу заработает и будет доступен по своему IP:
lxc-start -d -n C1
На тему CIDR — гугл в помощь, вместе с CIDR-калькуляторами.
8. Экспорт-импорт контейнеров
Очень просто. Достаточно просто заархивировать его содержимое (контейнер должен быть остановлен), после чего разархировать его на новом сервере. Смотрите пример (C1 — имя контейнера), выполняем на ноде1:
tar -czf front.tar.gz /container/C1
..архив будет лежать в /root, после чего копируем его на ноду2 (тоже в /root, любым удобным способом) и там распаковываем его.. правим конфиг если нужно. Все, можно сразу включать:
tar -xf ~/C1.tar.gz -C / nano /container/C1/config lxc-start -d -n C1
Вуаля! Все просто и понятно. (sic! DNS на новом сервере надо прописать вручную, можно напрямую с главной системы /container/С1/rootfs/etc/resolv.conf или /etc/resolv.conf с самого контейнера).
Выводы
Собственно это и все. В дальнейшем, мы можем понарезать клонов с эталонного контейнера, сколько душе влезет.. как колбасу. Достаточно только назначить ип IP, шлюз и сразу вперед. Очень удобно и практично. Отличие данной статьи от моей самой первой (по LXC) состоит в том, что там использовался NAT и проброшены порты одного конкретного приложения. Здесь иначе, напрямую. И так удобнее, ИМХО. Более того, работа с таким базовым инструментарием на столь низком уровне (без веб-интерфейсов и прочего), дает нам максимальную гибкость в реализации любых проектов, а также высокий уровень понимания всего происходящего на сервере.
Всем удачного полета!.)
Отличная статья. Настроил сеть, как здесь написано, только на OEL6 и с bond0 вместо eth0. Спасибо!