Использование LXC (без libvirt) через bridge на Oracle Linux, CentOS, RHEL 6.X/7.X

lxc

В этой статье мы поговорим об использовании 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 и проброшены порты одного конкретного приложения. Здесь иначе, напрямую. И так удобнее, ИМХО. Более того, работа с таким базовым инструментарием на столь низком уровне (без веб-интерфейсов и прочего), дает нам максимальную гибкость в реализации любых проектов, а также высокий уровень понимания всего происходящего на сервере.

Всем удачного полета!.)

Использование LXC (без libvirt) через bridge на Oracle Linux, CentOS, RHEL 6.X/7.X: Один комментарий

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