Любой системный администратор слышал
об Amazon EC2, удобнейшей системе облачных вычислений, которая позволяет
получить любое количество серверов любой конфигурации с помощью одного
клика мышью и тут же зайти на них, используя SSH. Достоинства сервиса
очевидны, как и его цена. Но стоит ли платить, когда такую же систему
можно поднять на своих машинах за каких-нибудь 30 минут?
По правде говоря, модель облачных вычислений
уровня IAAS (Infrastructure As A Service) достаточна примитивна. Это
просто зоопарк машин, объединенных в общий кластер и подключенных к
головному серверу, выставленному во внешний мир. На каждой машине
установлен Linux с поддержкой Xen или KVM (сама машина также должна
поддерживать аппаратную виртуализацию). Пользователь делает запрос к
головному серверу о выделении новой виртуальной машины с указанной ОС и
другими параметрами. Сервер обрабатывает запрос, выбирает наименее
загруженную машину (возможны и другие варианты, например, RoundRobin),
предоставляет ей образ указанной ОС и дает указание на старт. Машина
запускает образ, а пользователю возвращается IP-адрес его виртуального
сервера. Именно так работает инфраструктура Amazon EC2, а также ее
OpenSource-аналог под названием Eucalyptus.
Эвкалиптовое облако
Eucalyptus представляет собой инфраструктуру
для реализации модели облачных вычислений уровня IAAS, к особенностям
которого можно отнести совместимость интерфейса управления с Amazon EC2 и
простоту развертывания и конфигурирования. Eucalyptus версии 1.5.2
обладает следующими характеристиками:
Интерфейс, совместимый с EC2 и S3 (Webсервисы и интерфейс Query/REST).
Поддержка Xen и KVM.
Простота установки и развертывания.
Поддержка большинства дистрибутивов Linux (бинарные пакеты и исходники).
Безопасное взаимодействие компонентов с использованием SOAP и WS-security.
Минимальная модификация Linux-окружения.
Инструменты администратора облака для управления системой и аккаунтинга пользователей.
Возможность объединения множества кластеров, каждый из которых располагается в отдельном сегменте сети, в единое облако.
Eucalyptus состоит из трех компонентов:
-
Контроллер узла (Node Controller, NC). Запускается на каждом узле,
вовлеченном в облако, и отвечает за запуск, работу и остановку
виртуальных машин.
-
Контроллер кластера (Cluster Controller, CC). Управляет контроллерами
узлов, принимает решение, на каких узлах будут запущены виртуальные
машины.
-
Контроллер облака (Cloud Controller, CLC).
-
Устанавливается на машине, имеющей доступ к внешней сети, выступает в
роли головного интерфейса для доступа к облаку. Обрабатывает
пользовательские запросы на запуск виртуальных машин и собирает данные о
загруженности узлов от контроллеров кластеров.
Подготовка к установке
Я буду устанавливать Eucalyptus в Ubuntu
Linux, поэтому все последующие инструкции приведены для этой
операционной системы. Если вы хотите использовать другой дистрибутив,
обратитесь к руководству Eucalyptus Administrator Guide
для систем CentOS 5.3, OpenSUSE 11, Debian Lenny 5.0 и Debian
Squeeze/sid. Там же описан метод сборки системы из исходников и приведен
список всех зависимостей.
Итак, приступим:
1 Часы фронтенда, узлов и клиентских машин
должны быть синхронизированы, поэтому на каждой из них необходимо
выполнить следующие команды:
$ sudo ntpdate-debian -s
$ sudo apt-get install openntpd
2 Компоненты Eucalyptus должны иметь
возможность свободно общаться друг с другом. Для этого порты 8443, 8773 и
8774 на машине-фронтенде и порт 8775 на узлах должны быть открыты.
3 Контроллер облака и узлы общаются, используя
протокол SSH, поэтому между ними должен быть произведен взаимный обмен
ключами пользователей root или eucalyptus.
4 Узлы должны быть сконфигурированы так, чтобы
использовать bridge в качестве основного сетевого интерфейса. Для этого
отключите или удалите NetworkManager (если вы работаете с десктопной
редакцией Ubuntu), а затем установите пакет bridge-utils:
$ sudo apt-get install bridge-utils
Теперь откройте файл /etc/network/interfaces, закомментируй все имеющиеся настройки интерфейсов и добавьте строки:
auto br0
iface br0 inet dhcp
bridge_ports all
Если в сети нет DHCP-сервера, добавьте настройки внешнего сетевого интерфейса прямо в файл:
auto br0
iface br0 inet static
address 192.168.12.20
netmask 255.255.255.0
network 192.168.12.0
broadcast 192.168.12.255
gateway 192.168.12.1
dns-nameservers 192.168.12.1
dns-search foobar foobar.com
bridge_ports eth0
Запустите следующую команду, чтобы заставить систему перечитать сетевые настройки:
$ sudo /etc/init.d/network restart
Установка
Компоненты eucalyptus разбиты на несколько пакетов:
-
Контроллер облака (пакет -cloud).
-
Контроллер кластера (пакет -cc).
-
Контроллер узла (пакет -nc).
Все они упакованы в один тарболл, для установки которого необходимо проделать следующее:
1 Загрузить тарболл со странички http://open.eucalyptus.com/downloads.
2 Распаковать его во временный каталог и добавить путь до него в /etc/apt/sources.list:
$ tar zxvf eucalyptus-1.5.2-*.tar.gz
$ cd eucalyptus-1.5.2-*
$ sudo sh -c "echo deb file://${PWD} ./ >> /etc/apt/sources.list"
$ sudo apt-get update
3 Установить пакеты -cloud и -cc на машину-фронтенд (та, которая будет использоваться в качестве контроллера облака и кластера):
$ sudo apt-get install eucalyptus-cc eucalyptus-cloud eucalyptus-common
4 Установить контроллер узла на каждый узел, входящий в облако:
$ sudo apt-get install eucalyptus-nc eucalyptus-common
Все эти компоненты вытянут зависимостей на 140
Мб. Также понадобятся утилиты управления облаком Euca2ools, которые
можно скачать с той же странички и установить на любую машину (возможно,
фронтенд), следуя этим инструкциям:
$ tar zxvf euca2ools-1.0-*.tar.gz
$ cd euca2ools-1.0-*
$ sudo sh -c "echo deb file://${PWD} ./ >> /etc/apt/sources.list"
$ sudo apt-get update
$ sudo apt-get install euca2ools
Настройка фронтенда
Скрипт настройки Eucalyptus изменяет
конфигурационный файл $EUCALYPTUS/etc/eucalyptus/eucalyptus.conf,
поэтому мы должны присвоить переменной EUCALYPTUS правильное значение.
Для Debian/Ubuntu оно будет равно «/»:
$ export EUCALYPTUS=/
Перед началом конфигурирования убедитесь, что контроллер облака запущен и функционирует:
$ ps aux | grep euca
Если это не так, запустите его:
$ sudo $EUCALYPTUS/etc/init.d/eucalyptuscloud start
$ sudo $EUCALYPTUS/etc/init.d/eucalyptus-cc start
В случае возникновения ошибок обратитесь к журнальным записям:
$ sudo less $EUCALYPTUS/var/log/eucalyptus
Чтобы создать облако, необходимо зарегистрировать кластер и каждый подчиненный узел. Для этого выполните команду:
$ sudo $EUCALYPTUS/usr/sbin/euca_conf -addcluster имя_кластера имя_хоста
Замените имя_кластера на произвольное имя, а имя_хоста на DNS-имя машины или ее IP-адрес. Для регистрации узлов выполните:
$ sudo $EUCALYPTUS/usr/sbin/euca_conf -addnode "хост1 хост2 хост3 ..."
Укажите в аргументе опции -addnode адреса всех узлов, которые должны быть вовлечены в облако.
Конфигурирование web-интерфейса
Откройте страничку https://localhost:8443
в web-браузере, заменив localhost на имя машины, исполняющей роль
контроллера облака. Eucalyptus использует самоподписанные сертификаты,
поэтому нужно указать браузеру принять сертификат. Далее введите
admin/admin в качестве имени пользователя и пароля. После этого система
проведет вас через три процедуры:
-
Обязательная смена пароля администратора.
-
Ввод email-адреса администратора.
-
Подтверждение адреса сервиса Walrus. По умолчанию он запускается на контроллере облака.
Клиентские утилиты Euca2ools, совместимые с
интерфейсом EC2, используют x509-сертификаты для доступа к контроллеру.
Чтобы их сгенерировать, перейдите на страничку Credentials и скачайте
сертификаты с помощью клика по кнопке "Download certificates". Затем
создайте каталог $HOME/.euca и распакуйте в него сертификаты. Выполните
следующую команду:
$ . $HOME/.euca/eucarc
Ее придется выполнять каждый раз, когда вы
захотите использовать клиентские утилиты из пакета Euca2ools, поэтому
лучше поместить эту строку в $HOME/.bashrc.
Конфигурирование узлов
Eucalyptus предлагает четыре различных сетевых режима для гостевых ОС.
По умолчанию выбран режим SYSTEM, при котором
ОС получают произвольные адреса от DHCP-сервера. Второй режим называется
STATIC и позволяет назначать каждой инстанции ОС свой собственный
IP-адрес с помощью внутреннего DHCP-сервера. Режим MANAGED размещает ОС в
обособленных подсетях, подчиняющихся специальным правилам, заданным
пользователем (например, запрет PING, открытие SSH-доступа к ОС,
присвоение ВМ публичного IP и т.д.) Режим MANAGED-NOVLAN предоставляет
все то же самое, за исключением сетевой изоляции подсетей.
Для изменения сетевого режима достаточно
открыть файл $EUCALYPTUS/etc/eucalyptus/eucalyptus.conf и изменить
значение опции VNET_MODE и значения других, зависимых от режима, опций.
Файл хорошо прокомментирован, так что операция не должна вызвать
проблем. Для более подробного изучения этого вопроса, обратись к
руководству: http://open.eucalyptus.com/wiki/EucalyptusNetworking_v1.5.2.
Создание образов ОС
За хранение образов операционных систем
отвечает сервис Walrus, обращаясь к которому, контроллеры узлов получают
образы и кэшируют их на собственных машинах.
ВМ-образ Eucalyptus состоит из следующих
компонентов: образ диска, ядро и RAM-диск (опциональный). Все их
необходимо загрузить в Walrus и зарегистрировать в Eucalyptus. Ниже
показано, как это сделать для дистрибутива Ubuntu 9.04, уже
подготовленного для использования в Eucalyptus и доступного со странички
http://open.eucalyptus.com/wiki/EucalyptusUserImageCreatorGuide_v1.5.2.
Распаковываем архив:
$ tar zxvf euca-ubuntu-9.04-x86_64.tar.gz
Добавляем ядро в Walrus и регистрируем его в Eucalyptus:
$ euca-bundle-image -i euca-ubuntu-9.04-x86_64/kvm-kernel/vmlinuz-2.6.28-11-generic \
--kernel true
$ euca-upload-bundle -b ubuntu-kernel-bucket \
-m /tmp/vmlinuz-2.6.28-11-generic.manifest.xml
$ euca-register ubuntu-kernel-bucket/vmlinuz2.6.28-11-generic.manifest.xml
Последняя команда напечатает уникальный идентификатор ядра (eki), который нужно присвоить переменной $EKI.
Добавляем и регистрируем RAM-диск:
$ euca-bundle-image -i euca-ubuntu-9.04x86_64/kvm-kernel/initrd.img-2.6.28-11generic \
--ramdisk true
$ euca-upload-bundle -b ubuntu-ramdiskbucket \
-m /tmp/initrd.img-2.6.28-11-generic.manifest.xml
$ euca-register ubuntu-ramdisk-bucket/initrd.img-2.6.28-11-generic.manifest.xml
На этот раз euca-register выведет на экран
идентификатор RAM-диска, который необходимо присвоить переменной $ERI.
Добавляем и регистрируем образ диска:
$ euca-bundle-image -i euca-ubuntu-9.04x86_64/ubuntu.9-04.x86-64.img \
--kernel $EKI --ramdisk $ERI
$ euca-upload-bundle -b ubuntu-image-bucket \
-m /tmp/ubuntu.9-04.x86-64.img.manifest.xml
$ euca-register ubuntu-image-bucket/ubuntu.9-04.x86-64.img
Используя web-интерфейс (страница
Configuration), можно указать идентификаторы RAM-диска и ядра, которые
будут использованы по умолчанию в том случае, если их ID не указаны в
предыдущих командах. Для удаления образа сначала необходимо его
«разрегистрировать»:
$ euca-deregister <emi-XXXXXXXX>
Затем удалить файлы из Walrus (указанные переменные устанавливаются командой ". $HOME/.euca/eucarc"):
$ euca-delete-bundle -a $EC2_ACCESS_KEY -s $EC2_SECRET_KEY --url $S3_URL \
-b <bucket> -p <file prefix>
Управление
После того, как облако будет создано и настроено, администратор сможет добавлять и удалять узлы:
$ $EUCALYPTUS/usr/sbin/euca_conf -addnode <имя_узла>
$ $EUCALYPTUS/usr/sbin/euca_conf -delnode <имя_узла>
– а также добавлять и удалять образы
виртуальных машин (как было показано в предыдущем разделе),
конфигурировать облако, используя утилиту euca_conf или через
редактирование файла $EUCALYPTUS/etc/ eucalyptus/eucalyptus.conf, плюс
управлять пользователями.
Пользователи, желающие пользоваться услугами облака, должны перейти на страницу https://адрес-контроллера-облака:8443/
и зарегистрироваться. После этого администратору будет выслан email,
содержащий две ссылки, первая из которых приведет к принятию заявки,
вторая — к отклонению. После перехода по первой ссылке пользователю
будет выслан email, содержащий инструкции для активации аккаунта.
В любой момент администратор может отключить
или удалить пользователя, используя страницу "Users" web-интерфейса. Там
же он может сам добавлять пользователей через самостоятельное
заполнение формы, результатом чего, опять же, станет отправка
«активационного письма» на адрес пользователя.
Использование
Теперь у нас есть собственное облако, и мы
хотим его использовать, а именно — запрашивать ресурсы и получать их. В
этом разделе рассказано, как это делать с точки зрения пользователя.
Открываем в браузере страничку https://адрес-контроллера-облака:8443.
На экране появится окно входа. Жмем кнопочку
"Apply", заполняем форму и жмем "Sign up". В этот момент администратору
отправляется сообщение, получив которое, он решит, стоит ли одобрять наш
аккаунт или его лучше отклонить. В случае успеха на наш email придет
сообщение с просьбой подтвердить аккаунт путем перехода по ссылке. После
подтверждения аккаунта входим в сервис и попадаем на личную страничку.
Жмем кнопку Download certificate, чтобы получить сертификаты. Распаковываем их в каталог $HOME/.euca (можно и в другой):
$ mkdir ~/.euca; cd ~/.euca
$ unzip name-of-the-key-zip.zip
$ chmod 0700 ~/.euca
$ chmod 0600 ~/.euca/*
И запускаем скрипт eucarc, который установит правильные значения переменных, необходимых для работы Euca2ools:
$ . ~/.euca/eucarc
Скачиваем и устанавливаем Euca2ools (адрес приведен выше).
Перед запуском виртуальных машин мы должны
создать пару ключей, которые будут использоваться для доступа к ОС по
протоколу SSH. Ниже мы используем mykey в качестве имени ключей, но ты
можешь выбрать любое другое имя:
$ euca-add-keypair mykey > mykey.private
$ chmod 0600 mykey.private
Теперь узнаем, какие образы есть на сервере и их emi (идентификатор образа):
$ euca-describe-images
И — запустим нужное количество ВМ с указанным emi:
$ euca-run-instances -k mykey -n <количество инстанций> <emi-id>
Проверим, запустились ли запрошенные ВМ:
$ euca-describe-instances
Если вы используете облако только в личных
целях, то можете просто подключиться к SSH-сервису нужной ВМ, используя
внутренний IP-адрес. Если же пользователи должны обращаться к услугам
облака из внешней сети, то узлы Eucalyptus необходимо настроить для
использования сетевого режима MANAGED или MANAGED-NOVLAN, которые
позволяют назначать внешние IP-адреса для виртуальных машин, а
пользователь должен выполнить следующие шаги для подключения к ВМ:
1 Разрешить коннекты к SSH из внешней сети:
$ euca-authorize -P tcp -p 22 -S 0.0.0.0/0 default
2 Сделать запрос на выделение публичного IP:
$ euca-allocate-address
3 Ассоциировать IP с ВМ (ID возвращает команда euca-describe-instances):
$ euca-associate-address <IP> -i <ID виртуальной машины>
4 Подключиться к ВМ:
$ ssh -i mykey.private root@<IP>
Для остановки ВМ следует использовать команду:
$ euca-terminate-instances <ID ВМ>
Выводы
Eucalyptus не самая простая в использовании
система, но один раз настроив облако вы получите в распоряжение свой
собственный Amazon, который может месяцами работать, не требуя вашего
вмешательства.
Статья написана для журнала Хакер.