Запрягаем LXC на Ubuntu Server 14.04

CargoContainer4

 

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

LXC – новейшая технология, полноценный релиз ее версии 1.0 был всего 3-и месяца назад. Итак, это наименее требовательная к ресурсам технология виртуализации из существующих сегодня. В отличие от уже привычного варианта, когда виртуализируется оборудование, а не только среда, тут нет гипервизора и не производится эмуляция аппаратного обеспечения. Все экземпляры ОС – контейнеры, используют единое ядро хост-системы и напрямую обращаются к одному и тому же физическому оборудованию. За счет отсутствия слоя виртуализации достигаются максимальная производительность и наивысшая плотность виртуальных серверов на одном физическом. Контейнеры работают независимо, как друг от друга, так и от хост-системы. В нашей случае, будет рассмотрена возможность запуска неограниченного количества LXC контейнеров с сервером приложений geronimo на борту каждого из них. По ходу статьи будут описаны все преимущества данного решения.

Данное изображение иллюстрирует различие между стандартной виртуализацией и LXC:

lxc-vm

В качестве ОС мы будем использовать Ubuntu 14.04 LTS. За что мы любим Ubuntu? За элегантность, простоту и красоту предлагаемых решений. Сейчас вы сами убедитесь в этом на практике.

I. Подготовка ОС хоста

В данном разделе статьи мы рассмотрим такие вещи, как настройка сети, обновление системы и установка необходимого ПО. Убедитесь, что у сервера есть прямой доступ в интернет, до завершения процесса установки и настройки системы. Предварительное условие: на железо должен быть установлен Ubuntu Server 14.04 LTS с компонентом OpenSSH server. Все остальные действия после п.1 выполняются удаленно.

 

1) Настройка сети

В Ubuntu всегда все просто и красиво! В отличии от того же Debian`a, здесь вся сеть настраивается в одном месте. Итак, сначала мы настроим сеть стандартно (сетевые параметры подставляйте свои):

sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.253
netmask 255.255.248.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1

 

2) Полное обновление системы

Как всегда, все очень просто! Обновляем список репозиториев, обновляем все ПО и чистим систему от мусора! И все это одной командой…

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y && sudo apt-get autoclean -y

 

 

3) Установка дополнительного ПО

Ставим все что нужно. Одной командой:

sudo apt-get install lxc bridge-utils

 

4) Дополнительная настройка сети

Такс, и вот теперь нам нужное кое что донастроить. Проверяем список сетевых интерфейсов:

ifconfig -a

 

Там добавится интерфейс lxcbr0 – это по сути NAT, т.е. шлюз и DHCP для внутренней сети контейнеров. Он имеет сетевой адрес по умолчанию: 10.0.3.1. Следующий шагом мы создадим большой мост под названием br0, который объединит eth0 и lxcbr0. Это даст контейнерам, которые стоят за lxcbr0 доступ во внешний мир. В работу lxcbr0 – лезть не надо, там все работает как часы автоматически. Итак, поехали:

sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.0.253
netmask 255.255.248.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1
bridge_ports eth0 lxcbr0

 

И перезагружаемся:

sudo reboot

 

II. Настройка LXC

В данном разделе, мы создадим первый (эталонный) контейнер, добавим пользователя к нему, установим Java и geronimo и настроим работу веб-интерфейса в внешней сети.

 

5) Создание пользователя

На данном этапе, мы создадим универсального пользователя darkfess. Он будет иметь обычные (user) права на хост системе и админские (sudo) права во всех контейнерах. По сути, это будет администратор внутри контейнера, из-под его имени и будут работать и запускаться все сервера приложений во всех контейнерах.1-я команда – создание пользователя, 2-я – его пароля.

sudo useradd darkfess -m -s /bin/bash
sudo passwd darkfess

 

6) Создание и настройка первого контейнера

Далее, мы создаем наш первый контейнер с именем (к примеру) – С1. Наш пользователь darkfess будет обладать там правами администратора.

sudo lxc-create -t ubuntu -n C1 -- -b darkfess

 

Первый контейнер создается довольно долго, минут 15. Со всеми последующими будет проще. Далее, правим данный конфиг, выставляя там 2-а параметра (до параметров сети, в первой колонке)…. 1-й это автозапуск после перезагрузки хоста, 2-й это задержка в секундах перед стартом именно этого контейнера (когда их будет много, можно поставить интервал секунд в 10 для каждого последующего):

sudo nano /var/lib/lxc/C1/config
lxc.start.auto = 1
lxc.start.delay = 0

 

Запуск контейнера производится командой:

sudo lxc-start -d -n C1

 

Проверка статуса контейнеров (там можно увидеть статус и внутренний IP контейнера):

sudo lxc-ls --fancy

running

А сейчас мы создадим хранилище для скриптов и сам скрипт, который откроет доступ к контейнеру из-вне, а именно к веб-интерфейсу geronimo и SSH (посредством маршрутизации):

sudo mkdir /opt/bin
sudo nano /opt/bin/df_access.sh

Скопируем содержимое скрипта: df_access.sh

 

Данный скрипт работает с вводом параметров, т.е. в будущем надо будет вводить так: ./df_access.sh п1 п2 п3 п4, где:

п1 – 1-й параметр.. реальный IP сервера;
п2 – 2-й параметр.. порт на хосте, на который будет привязан внутренний порт определенного контейнера;
п3 – 3-й параметр… это IP адрес целевого контейнера;
п4 – 4-й параметр… это порт на контейнере, который мы пробрасываем в п2 (22 – для SSH, 8080 – для сервера приложений).

 

Даем права на скрипт, делаем его исполняемым и real-only. Потом заходим в нашу новую директорию со скриптами:

sudo chmod 555 /opt/bin/*.sh
cd /opt/bin

 

Далее, непосредственно используем наш скрипт по назначению.

sudo ./df_access.sh 192.168.0.253 40022 10.0.3.22 22
sudo ./df_access.sh 192.168.0.253 48080 10.0.3.22 8080

 

Что он означает, описано выше. А в результате мы получим:
SSH: 192.168.0.253:40022 = 10.0.3.22:22
Веб-интерфейс: 192.168.0.253:48080 = 10.0.3.22:8080

 

Добавим это как правило, в автозапуск (не забывайте оставлять там для себя комментарии к командам):

sudo nano /etc/rc.local
sh /opt/bin/df_access.sh 192.168.0.253 40022 10.0.3.22 22
sh /opt/bin/df_access.sh 192.168.0.253 48080 10.0.3.22 8080

 

6.1) Контейнер с CentOS

В дополнение к п.6 давайте создадим контейнер на CentOS, вместо контейнера Ubuntu. RHEL-подобные дистрибутивы более распространены среди корпоративных клиентов.. Итак, добавим необходимое ПО на хост:

sudo apt-get install yum

 

Создадим контейнер с CentOS 6.5:

sudo lxc-create -t centos -n C1

 

Зададим пароль от root:

sudo chroot /var/lib/lxc/C1/rootfs passwd

 

Далее, внутри контейнера, добавим необходимое ПО и обновимся:

yum update
yum install nano tar untar

Все, контейнер готов. Все остальные действия стоит выполнить как описано в п.6. Просто имейте ввиду, что можно использовать в контейнерах и CentOS. Но дальнейшая настройка в этой статье будет показана на примере контейнера с Ubuntu.

 

7) Установка geronimo в первый контейнер

На этом этапе мы установим в наш эталонный контейнер все необходимое ПО, Java и geronimo. Итак, зайдем в консоль контейнера C1 (дальнейшие действия мы проводим от имени пользователя darkfess внутри контейнера):

sudo lxc-console -n C1

 

Установим необходимое ПО:

sudo apt-get install openjdk-7-jdk nano

 

Даем права на папку /opt:

sudo chown -R darkfess:darkfess /opt

 

Далее мы будем использовать инсталлятор geronimo с их офф. сайта. Качаем его и закидываем по sftp в нашу папку home. Когда все будет лежать на месте, распаковываем архив с сервером приложений:

tar -xvf geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz -C /opt

 

Дадим права на папку:

sudo chmod 775 -R /opt

 

Старт сервера приложений выполняется командой:

sudo /opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/bin/geronimo start

 

Остановка сервера приложений выполняется командой:

sudo /opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/bin/geronimo stop --user system --password manager

 

Добавляем наш сервер приложений в автозапуск:

sudo nano /etc/rc.local
/opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/bin/geronimo start

 

Вот и все :)  Теперь просто запустим его и насладимся результатом нашей работы:

sudo /opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/bin/geronimo start

 

Результат: http://192.168.0.253:48080/

geronimo_interface

III. Администрирование LXC

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

 

8) Основные команды

Проверить статус всех контейнеров:

sudo lxc-ls --fancy

 

Общий список всех контейнеров:

sudo lxc-ls

 

Склонировать контейнер С1, новый контейнер назвать С2:

sudo lxc-clone -o C1 -n C2

 

Запустить контейнер С1:

sudo lxc-start -n C1

 

Запустить контейнер С1, не входя в него:

sudo lxc-start -d -n C1

 

Остановить контейнер С1:

sudo lxc-stop -n C1

 

Удалить контейнер С1:

sudo lxc-destroy -n C1

 

Зайти в консоль контейнера С1:

sudo lxc-console -n C1

 

Поставить контейнер С1 на паузу:

sudo lxc-freeze -n C1

 

Восстановить контейнер С1 из паузы:

sudo lxc-unfreeze -n C1

 

9) Создание клона контейнера

Итак, у нас есть эталонный контейнер C1. Создавать новый контейнер с нуля не нужно. Остановим его и сделаем из него клон, назовем его C2:

sudo lxc-stop -n C1
sudo lxc-clone -o C1 -n C2

 

Клонируется контейнер максимум минуту (зависит от загруженности дисковой подсистемы сервера). Далее, запустим оба контейнера (С1 + С2) и проверим их статус:

sudo lxc-start -d -n C2
sudo lxc-start -d -n C1
sudo lxc-ls --fancy

fancyc1c2

Вот и все! Все красиво, вон наши оба красивых контейнера. Смотрим IP и используем скрипт, чтобы открыть доступ извне для второго контейнера (С2):

cd /opt/bin
sudo ./df_access.sh 192.168.0.253 40023 10.0.3.97 22
sudo ./df_access.sh 192.168.0.253 48081 10.0.3.97 8080

 

В результате мы получим:
SSH: 192.168.0.253:40023 = 10.0.3.97:22
Веб-интерфейс: 192.168.0.253:48081 = 10.0.3.97:8080

 

Добавим это в автозапуск:

sudo nano /etc/rc.local
sh /opt/bin/df_access.sh 192.168.0.253 40023 10.0.3.97 22
sh /opt/bin/df_access.sh 192.168.0.253 48081 10.0.3.97 8080

 

Делов то :)  2-й контейнер готов к работе. Все очень просто, не правда ли?

 

IV. Дополнительные возможности

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

 

10) Централизованный доступ к файловым системам всех контейнеров (обновление сразу всех серверов приложений)

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

Давайте посмотрим, как это сделать (создаем группу lxc, даем ей право на папку и добавляем туда нашего пользователя):

sudo groupadd lxc
sudo usermod -G lxc -a darkfess
sudo chgrp -R lxc /var/lib/lxc
sudo chmod -R 775 /var/lib/lxc
sudo reboot

Вот и все. Папка hotbundles, в контейнерах, находится тут:
C1: /var/lib/lxc/C1/rootfs/opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/hotbundles
C2: /var/lib/lxc/C2/rootfs/opt/geronimo/geronimo-tomcat7-javaee6-3.0.1/hotbundles

Ниже будет пример скрипта, который обновляет сервера приложений в контейнерах С1 и С2 (останавливает, обновляет и запускает их).. но для начала, создадим папку для обновлений, распространим на нее права группы lxc и уровняем их (/opt/updates):

sudo mkdir /opt/updates
sudo chgrp -R lxc /opt/updates
sudo chmod -R 775 /opt/updates

 

Создадим сам скрипт:

sudo nano /opt/bin/all_update.sh

Скопируем содержимое скрипта: all_update.sh

 

Выставим на него права:

sudo chmod 555 /opt/bin/*.sh

 

Закидываем наше обновление в папку /opt/updates (через sftp) и потом используем скрипт:

cd /opt/bin
sudo ./all_update.sh

 

Вот и все :)  Мы можем одним махом обновлять все наши сервера приложений в контейнерах, модифицируя данный скрипт в любую сторону.

 

11) Веб-интерфейс LXC Web Panel (экспериментально!)

Данный инструментарий является экспериментальным и его настоятельно не рекомендуется использовать в промышленной эксплуатации. Только для тестирования! Краткая предыстория…. Стабильная версия LXC Web Panel работала с LXC 0.7-0.9, а с выходом версии 1.0 (в которой было многое переработано) она уже была не актуальна. На данный момент есть форк LXC Web Panel, который мы сейчас и поставим. Внимание! В результате моего тестирования было замечено, что данный форк меняет конфигурационные файлы LXC, из-за чего потом ломаются внутренние мосты (невозможно достучатся из контейнера из вне). Поэтому использовать его, по сути, нельзя. Но добавлю, что данный веб-интерфейс очень удобен и практичен, мне он лично очень понравился. С ним – работа с LXC одно удовольствие. Поэтому мы дружно будем ждать стабильной версии родного LXC Web Panel для новых версий LXC! LXC Web Panel рассчитан на то, чтобы быть установленным на уже работающую и отлаженную инфраструктуру, поэтому “присаживать” его можно уже в самую последнюю очередь.

 

Установка с помощью скрипта:

wget https://raw2.github.com/claudyus/LXC-Web-Panel/master/tools/install.sh -O - | sudo bash

 

Далее, создадим конфиг:

sudo nano /etc/lwp/lwp.conf

Скопируем содержимое конфига: lwp.conf

 

В конфиге не забудьте подредактировать поле с IP адресом сервера (поле address). После, перезапускаем сервис:

sudo service lwp restart

 

Вот и все! Веб-интефейс будет доступен по адресу (в нашем случае): http://192.168.0.253:5000/ (логин/пароль: admin/admin) Не забывайте, что LXC Web Panel разрабатывается силами энтузиастов и не имеет прямого отношения к разработчикам главного проекта LXC.

Несколько скриншотов веб-интерфейса LXC Web Panel (С1 и С2 уже с geronimo на борту, С3 и С4 – “голые” контейнеры):

lxcwp1lxcwp2lxcwp3lxcwp5

И пусть использовать его сейчас и нельзя… но задел на будущее – прекрасный!

 

V. Работа с LXC

Данный раздел статьи посвящен эксплуатационным особенностям и непосредственной работе с контейнерами LXC. Здесь мы поговорим об безопасности, обновлении серверов приложений geronimo и сопровождении контейнеров (регламенты и правила работы с ними).

 

12) Безопасность

В LXC безопасность организована должным образом. Все контейнеры изолированы друг от друга и не нарушают при этом работу хоста. Говоря про безопасность в работе, можно сказать следующее – она бывает двух видов. На уровне контейнера и на уровне хоста. Т.е. 2-й уровень – это администратор контейнера, а 1-й администратор хоста. Иными словами, администратор хоста – это наивысшая привилегия, с ней нужно быть очень аккуратным (т.е. по незнанию можно банально все сломать). Распределяйте права по своему усмотрению.

 

Заключение

В заключение мне хотелось бы сказать следующее… Данное технологическое решение является одним из самых инновационных и свежих на рынке. В данной статье мы использовали исключительно свободное и открытое ПО, так что тут никаких проблем с лицензиями – все можно свободно использовать в любых, в т.ч. коммерческих целях. А администрировать его – так это одно удовольствие!

Будущее за LXC! :)

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