Что делать, когда нужна куча маленьких и дешевых серверов для тестирования разных версий разных сайтов? Можно прикупить дедик и поставить на него OpenVZ. Хотя, OpenVZ будет как-то мелковато — памяти-то много. Лучше поставим XEN. Или KVM. Или даже VMWare.
И начнем всё это админить? — Конечно же, нет.
Виртуализация, любовь моя
Начну издалека, первый пост же. Больше шести лет назад я таки поменял один здоровенный и дорогущий железный сервер на несколько маленьких виртуальных. В то время мастерхост был еще торт, и виртуалки были у него только под Virtuozzo (впрочем, как и сейчас). Так и познакомились. Шло время, технология контейнеров очаровывала меня своей простотой: файловая система в простой папке, полные бекапы одним кликом, стабильные ядра от хостера и, главное, никаких заморочек с железом. Сбывшаяся мечта человека, никогда не собиравшего сервер.
Но когда появляется необходимость выйти за ограничения твух-трёх удобных хостеру тарифов, начинаются огорчения. В моём случае понадобилась масса создаваемых на лету маленьких серверов, которые запускают разные версии сайта для каждой ветки в репозитории. Памяти требуется чуть, диска тоже немного, процессор и сеть используются изредка. А главное, сервер надо уметь создавать из скрипта. И, лучше всего, быстро.
И с этим возникают сложности. Во-первых, серьёзные парни со своими API (Linode, Amazon) используют XEN от 20 баксов за сервер с кучей всего лишнего. Это не вариант. Во-вторых, дешевые хостинги постоянно лагают и отваливаются, даже если и научиться автоматом создавать у них серверы. Тоже не вариант. И всё это логично, ведь дорогие хостеры оттого и дорогие, что всё умеют и работают стабильно.
А что, если завести дешевые контейнеры на дорогом apt-get
ов, маленький патч, перезагрузка и 300 Мб места.
Ванильное ядро
Начнем:
sudo apt-get update && sudo apt-get upgrade
Поставим скрипты LXC:
sudo apt-get install lxc
И проверим поддержку Linux Containers в ядре:
sudo lxc-checkconfig
Сегодняшнее дофолтное ядро у линоды поддерживает контейнеры очень частично. Поставим ванильное ядро от убунты:
sudo apt-get install linux-virtual
virtual
потому, что нужна поддержка XEN.
Дальше двигаемся согласно кусочку инструкции по PV-GRUB:
sudo apt-get install grub-legacy-ec2
Когда установщик граба задавал вопрос «куда ставить», я выбирал xvda.
Далее пачим `/boot/grub/menu.lst` (ближе к концу файла):
- # defoptions=console=hvc0
+ # defoptions=console=hvc0 rootflags=nobarrier
и обновляем конфиг граба:
sudo update-grub-legacy-ec2
Всё, контейнер готов к загрузке ванильного ядра. Осталось только попросить наш linode загружаться в соответствии с конфигом граба. Для этого надо зайти в редактор профиля виртуального сервера, посмотреть там битность ядра (у меня Latest 32 bit
) и выбрать там соответствующий pv-grub-*
(у меня pv-grub-x86_32
). Далее сохраняем профиль и перезагружаем сервер.
Контейнер
Теперь можно проверить поддержку LXC в ядре:
sudo lxc-checkconfig
и насладиться всеми зелененькими пунктами.
В системе появится новый сетевой интерфейс:
ifconfig | grep lxc
который будет объединять все контейнеры и выпускать их в интернет.
Наконец-то, создаем первый контейнер:
sudo lxc-create -t ubuntu -n demo1
В первый раз этот процесс затянется минут на пять, так как lxc-create
соберёт новенькую убунту в папке /var/cache/lxc/
, а потом скопирует ее в папку /var/lib/lxc/demo1/rootfs/
, где и будет жить наш новый контейнер.
Запустить контейнер и попасть в его консоль можно вот так (логин и пароль ubuntu
):
sudo lxc-start -n demo1
Выходить, предлагают, нажав Ctrl+A Q
. Из lxc-start
так выйти не удаётся, но можно просто закрыть окно терминала. В дальнейшем открыть консоль контейнера можно вот так (логин и пароль те же):
sudo lxc-console -n demo1
Осталось только настроить запуск контейнера при старте:
sudo ln -s /var/lib/lxc/demo1/config /etc/lxc/auto/demo1.conf
Окно в контейнер
Надо же как-то попасть на сайт внутри контейнера. Тут всё предельно просто. На главный виртуальный сервер ставим nginx и проксируем запросы к соответствующим внутренним IP. По сути у вас появляется свой маленький приватный кластер.
Глубокие выводы
Круто же!
Ах, да. Солярис и фря, сто лет уже как, умеют это из коробки. И то же самое можно сделать на OpenVZ (даже внутри LXC).
Автор: JPEG