Pull to refresh

Переход с виртуальных машин на контейнеры LXC: причины, преимущества и готовая инструкция к применению

Reading time 4 min
Views 23K
О чем мы расскажем:

— Почему мы решили перейти на LXC контейнеры?
— Как создать контейнер и запустить на нем хост на базе Битрикс?

Для кого это будет полезно:

Для всех, кто хочет попробовать новое решение, при этом используя меньше ресурсов.

Преимущества LXC перед виртуальными машинами


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

  1. Меньше потерь производительности CPU, дисковых операций и оперативной памяти. Почти всё, что доступно в контейнере, работает со скоростью сервера.
  2. Не нужно выделять оперативную память под ядро ОС, видеопамять, дисковые буферы и т.д.
  3. Быстрый запуск. Фактически запускаются только те приложения, которые необходимы для работы контейнера.
  4. Поддерживается запуск в контейнере отдельных приложений, а не полной системы. Удобно, что доступы можно выдавать простым добавлением пользователя, (а не chroot), так как у нас только один проект в контейнере (на виртуалках было несколько).
  5. Возможность управлять ресурсами каждого контейнера.
  6. Быстро и легко перемещать контейнеры между серверами.

Мы пользуемся rsync. Просто создаем на новом сервере контейнер с таким же названием и копируем:

rsync -alvz старыйСервер:/var/lib/lxd/container/test/ /var/lib/lxd/container/test/

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

Посмотреть статистику потребления ресурсов можно командой: lxc info test

Remote: unix://
Архитектура: x86_64
Создано: 2018/12/04 14:27 UTC
Status: Running
Type: persistent
Профили: default
Pid: 28317
IPs:
eth0:	inet	172.27.2.204	vethF91F2U
Resources:
Процессы: 56
CPU usage:
Использование ЦП (в секундах): 20583
Memory usage:
Memory (current): 1.03GB
Memory (peak): 3.11GB
Network usage:
eth0:
Получено байтов: 17.45GB
Отправлено байтов: 9.93GB

По этой статистике можно отследить, сколько ресурсов потребляет контейнер и, при необходимости, ограничить их потребление при помощи специальных команд:

  • lxc config set test limits.memory 2048M # устанавливаем лимит памяти.
  • lxc config set test limits.cpu 1,2,3,8 # привязываем контейнер к ядрам CPU.
  • lxc config set test cpu.allowance 10% # ограничиваем потребление ресурсов CPU.
  • lxc config set test root size 50GB # ограничиваем объём используемого контейнером дискового пространства(работает только с ZFS или btrfs).
  • lxc config get test limits.memory – просматриваем установленное значение лимита

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

Настраиваем сервер и переносим стандартный хост с Bitrix из виртуалки на контейнер


1. Настройка сервера

1.1 Устанавливаем на сервер последнюю версию Ubuntu 18.04 server. В ней уже есть LXD. LXD это надстройка над LXC, гипервизор, который упрощает взаимодействие с системой контейнеризации.
1.2 apt install bridge-utils # установим bridge-utils
1.3 lxd init # инициализируем lxd
1.4 lxc profile edit default # редактируем файл профиля:

devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
root:
path: /
pool: default
type: disk
name: default

1. 5 lxc launch ubuntu:18.04 test # создаем контейнер с названием test. Он сам скачает образ, создаст и запустит его. На этом настройка и создание контейнера закончены, дальше переходим к настройке контейнера и переносу хоста на него.

2. Настройка контейнера для хоста и перенос сайта

2.1 lxc exec test /bin/bash # Заходим в созданный контейнер.
2.2 add-apt-repository ppa:ondrej/php # Добавляем репозиторий.
2.3 apt update # Обновляем репозиторий.
2.4 apt install
php7.1{fpm,bcmath,bz2,cli,common,curl,dev,enchant,fpm,gd,gmp,imap,intl,json,
ldap,mbstring,mcrypt,mysql,odbc,opcache,phpdbg,pspell,readline,recode,soap,
tidy,xml,xmlrpc,xsl,zip} #
Устанавливаем php и все нужные модули для битрикса.
2.5 apt install nginx # Устанавливаем nginx.
2.6 vim /etc/netplan/50-cloud-init.yaml # Делаем ip статичным:

network:
version: 2
ethernets:
eth0:
addresses: [172.27.2.108/16]
gateway4: 172.27.0.1
nameservers:
addresses: [172.27.1.1]
dhcp4: false

2.7 Копируем конфиги php и nginx с нашей виртуалки, проверяем, что все запускается и работает.
2.8 Переносим весь сайт с нашей виртуалки. Например:

rsync -alvz стараяВиртуалка:/var/www/ /var/www/

3. Создание отдельного контейнера для базы данных

3.1 Повторим шаги 1.5, 2.1 и 2.6, назвав контейнер к примеру test-db.
3.2 apt install mysql-server # установим БД
3.3 apt install pv # Установим PV, чтобы видеть прогресс, когда будем заливать БД.

4. Настройка нового сервера БД

Для начала соберем информацию со старого сервера:

4.1 Нам понадобится user и pass от нужной базы.
4.2 mysql -u test -p'test' -e «show create database testDB;» # Узнаем как создана БД (то, что нам понадобится выделено):

mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+--------------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------------+
| demoshop | <b>CREATE DATABASE `demoshop` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */ |</b>
+----------+--------------------------------------------------------------------------+

4.3 mysqldump -ER --single-transaction --quick testDB | gzip > testDB.sql.gz # Выполним эту команду на сервере, где лежит наша БД. Она сделает дамп и сожмет его в архив.

Зайдем в нашу новую базу и выполним следующие действия:

4.4 rsync -alvz стараяБД:/root/ testDB.sql.gz /root/ # перенесем архив с дампом на наш контейнер.
4.5 mysql # Зайдем в нашу базу
4.5.1 CREATE USER 'user'@'%' IDENTIFIED BY 'pass'; # создадим такого же пользователя и пароль.
4.5.2 Из пункта 4.2 введем команду: CREATE DATABASE `имяБД` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */;
4.5.3 GRANT ALL PRIVILEGES ON имяБД .* TO 'user'@'%' IDENTIFIED by 'pass'; # Дадим права нашей базе.
4.6 Выйдем из базы и из консоли контейнера выполним: pv testDB.sql.gz |zcat | mysql testDB # Заливаем дамп в нашу базу

5. Проверка

5.1 Меняем параметры подключения к БД, указываем новый IP нашей базы.
5.2 После этого сайт должен открываться по IP или DNS, это зависит от вашей конфигурации.

Заключение


Таким образом, LXC контейнеры помогают нам уменьшить потребление ресурсов тестовых серверов и уместить больше хостов на одном сервере, при этом сохраняя возможность удобно управлять потребляемыми ресурсами каждого хоста. Теперь у вас есть готовая инструкция, показывающая, как просто это реализовать.
Tags:
Hubs:
+10
Comments 29
Comments Comments 29

Articles