Блог ИТ склеротика. Открытая Cloud-платформа OpenStack: обзор и первые впечатления

Страницы

Расширенный поиск в статьях блога

26 января 2012 г.

Открытая Cloud-платформа OpenStack: обзор и первые впечатления




Открытая Cloud-платформа OpenStack: обзор и первые впечатления

Не так давно я писал про открытую систему для создания облачных сервисов Eucalyptus, которая лежит в основе Ubuntu Enterprise Cloud. Сегодня мы поговорим о его главном конкуренте, одним из разработчиков которой выступает агентство NASA, а среди покровителей числятся Intel, AMD, Dell еще два десятка именитых компаний.
Виртуальные серверы получили очень широкое распространение после открытия сервисаAmazon EC2, который стал эталоном для облачных сервисов уровня IaaS (когда в аренду сдается целая инфраструктура для управления виртуальными серверами, а не выделенная виртуальная машина или приложение). EC2 позволил организациям отказаться от собственных серверных и половины штата системных администраторов в пользу парка удобных в сопровождении удаленных серверов, которые можно использовать для любых нужд, увеличивая количество машин по мере надобности.
Сервис, созданный Amazon, оказался не только удобным в использовании, но и весьма технологичным, так что многие, кто пытался создать программные продукты, позволяющие поднять свой Amazon терпели неудачу: облачный сервис уровня IaaS очень труден в реализации, он требует создания умной, самоконтроллируемой инфраструктуры, которая бы умела равномерно распределять нагрузку между физическими машинами, не боялась расширения и была устойчива к сбоям оборудования. Такое было под силу только большим коммерческим организациям, которые просили за свои продукты немалых денег, а тем, кто не мог их заплатить приходилось довольствоваться тем, что есть: большим количеством разрозненных компонентов, которые приходилось собирать вместе и долго тестировать надежность работы получившейся системы.
Eucalyptus стал одним из первых Open Source проектов, нацеленных на создание комплексной инфраструктуры, позволяющей поднять cloud-сервис уровня IaaS не прибегая к дополнительным инструментам. Предлагаемая им инфраструктура действительно удобна, эффективна, устойчива и, что немаловажно, полностью совместима с клиентскими инструментами Amazon EC2. Тем не менее она оказалась недостаточно масштабируемой, а публичная версия фреймворка сильно урезанной по функциональности. Поэтому совсем скоро на рынке появился проект, призванный решить эти проблемы и, ни много, ни мало, стать стандартом в области открытых облачных решений.
OpenStack был образован путем слияния двух независимых проектов: "Cloud Files and Cloud Servers", разрабатываемой RockSpace и "Nebula Cloud Platform", созданной NASA. В результате получилась довольно интересная солянка, разделенная опять же на два почти независимых продукта: OpenStack Nova и OpenStack Swift.

Cчетная машина Nova

Главный компонент OpenStack - это Nova (Compute) - контроллер, управляющий работой виртуальных машин. Фактически Nova отвечает за все: обрабатывает запросы на создание виртуальных машин, соединяет их с внешним миром, следит за работоспособностью и распределением нагрузки на физические машины и каналы связи, реагирует на сбои и т.д. Nova основана на коде системы NASA Nebula, написана на языке программирования Python и опирается на протокол обмена сообщениями AMQP.
Система состоит из семи обособленных компонентов:
  • Контроллер облака (Cloud Controller) следит за состоянием системы и выступает в роли связующего звена всех остальных компонентов системы.
  • Сервер API (API Server) реализует web-интерфейс, позволяющий управлять контроллером облака.
  • Контроллер вычислений (Compute Controller) отвечает за запуск виртуальных машин и их связь со всей остальной инфраструктурой.
  • Хранилище (Object Store) предоставляет сервис хранения данных, совместимый с Amazon S3.
  • Менеджер аутентификации (Auth Manager) предоставляет сервисы аутентификации и авторизации.
  • Контроллер томов (Volume Controller) подключает виртуальные устройства хранения к виртуальным машинам.
  • Сетевой контроллер (Network Controller) создает виртуальные сети, позволяя виртуальным машинам взаимодействовать друг с другом и внешней сетью.
  • Планировщик (Scheduler) ответственен за выбор подходящего Контроллера вычислений для запуска новой виртуальной машины.
Архитектура Nova
На рисунке хорошо видно как эти компоненты связаны между собой. Сервер API, контроллер облака и менеджер аутентификации составляет "управляющий центр" облака, который должен работать на выделенной машине. Администратор использует утилиту nova-manage для управления характеристиками всей инфраструктуры и доступом к ней пользователей. Клиенты, желающие использовать облачный сервис, подключаются к серверу API с помощью клиентских утилит Amazon EC2 (или их свободного варианта под названием euca2ool из проекта Eucalyptus).
Еще одна выделенная машина отвечает за управление хранилищем данных (Object Store). В состав Nova включена начальная реализация S3-совместимого хранилища данных, которая может быть использована только для отладки. В реальных проектах на ее месте должен быть установлен Swift, развивающийся обособленно от Nova.
Еще одна машина - это контроллер томов, позволяющий подключать к виртуальным машинам своего рода внешние накопители данных (виртуальные флеш-брелки). Его присутствие в инфраструктуре совсем не обязательно.
Несколько машин выполняют работу сетевых контроллеров, которые отвечают за распределение IP-адресов между виртуальными машинами и могут выступать в роли шлюза, отделяющего виртуальные машины от остальных сегментов сети. Обычно на один сегмент внутренней виртуальной сети приходится один сетевой контроллер, но это скорее правило, чем требование.
Одна из машин выполняет функции планировщика, который должен следить за контроллерами вычислений и в случае поступления нового запроса на создание виртуальной машины, выбирать для этой цели наиболее подходящего кандидата (решение о пригодности может быть принято на основе загруженности контроллеров вычислений, количестве виртуальных машин, выполняемых на них и других факторов).
Контроллеры вычислений - это основной костяк облачной инфраструктуры OpenStack, обычно их количество намного превосходит количество всех остальных машин сети. Контроллеры вычислений занимаются приемом запросов на создание новой виртуальной машины, ее запуском, слежением за состоянием виртуальных машин, перезапуск и т.д. Чем больше контроллеров вычислений в инфраструктуре, тем больше клиентов может обслуживать сервис.
Обработка пользовательских запросов в такой системе выглядит следующим образом: используя клиентские инструменты пользователь инициирует запрос на создание виртуальной машины к серверу API. После аутентификации и авторизации пользователя сервер API разбирает запрос и посылает его контроллеру облака, который инициирует три новых запроса: к сетевому контроллеру, к хранилищу и к планировщику. Сетевой контроллер выделяет IP-адрес для новой виртуальной машины и возвращает его контроллеру облака. В сетевом хранилище происходит поиск подходящего образа жесткого диска для будущей виртуальной машины, адрес которого возвращается контроллеру облака. Теперь, имея все необходимое для создания новой виртуальной машины, контроллер облака посылает запрос планировщику, который выбирает наиболее подходящий контроллер вычислений и отдает ему запрос на создание ВМ. После того как новая ВМ будет запущена контроллер облака завершает свою работу и сообщает серверу API об успехе всей операции. Теперь пользователь может подключиться к ВМ, а всю работу по поддержании ее в работоспособном состоянии, выделении дискового пространства, маршрутизации сетевых пакетов и всю остальную черную работу берет на себя система.
Стоит заметить, что облачная инфраструктура на основе OpenStack получается очень гибкой и управляемой. Компоненты системы полностью обособлены друг от друга и общаются только с помощью посылки асинхронных сообщений или протокола HTTP. Уже настроенная и работающая система легко выдержит любые изменения в своем дизайне и не потребует много времени на переконфигурирование. Кроме того, OpenStack не замкнут сам в себе и везде, где это возможно, использует сторонние продукты. Для управления им можно использовать стандартные клиенты сервиса Amazon EC2, а для запуска виртуальных машин применять наиболее удобные в данном конкретном случае системы виртуализации (на данный момент поддерживаются KVM, UML, XEN, HyperV и qemu).

Безграничное хранилище Swift

Swift (OpenStack Object Storage) - это полностью распределенное, отказоустойчивое высоконадежное хранилище данных, созданное по образу и подобию Amazon S3. Swift почти полностью основан на наработках компании Rackspace. Система состоит из четырех основных компонентов:
  • Прокси-сервер (Proxy Server), объединяющий все остальные компоненты системы вместе.
  • Объектный сервер (Object Server), ответственный за хранение данных.
  • Контейнерный сервер (Container Server), ответственный за отдачу списка объектов.
  • Сервер аккаунтинга (Account Server), отдающий листинги контейнеров для конкретного аккаунта.
Типичная Swift-инфраструктура представляет собой кластер, одна из машин которого выполняет функции прокси-сервера, несколько машин работают в качестве контейнерных серверов и серверов аккаунтинга, а все остальные (сотни и тысячи машин) представляют собой контейнерные серверы.
Прокси-сервер поддерживает внешний ReST-ful API, реализованный в рамках протокола HTTP. Поэтому запрос доступа к объектам внутри хранилища выглядит очень наглядно и просто:
GET http://swift.host.com/v1/account/container/object
Здесь account - это пользовательский аккаунт, container - пространство имен, используемое для классификации данных, а object - непосредственно данные (другими словами: файл).
Прокси-сервер использует так называемые кольца (rings) для поиска реального положения данных в кластере. Это своего рода база данных, описывающая то, где на самом деле расположены данные. Она модифицируется при каждой записи новых данных в хранилище, их удаления или выходе узлов из строя. Для аккаунтов, контейнеров и объектов предусмотрены отдельные кольца.
Объектные серверы - наиболее важный компонент Swift-кластера. Они отвечают за хранение и отдачу данных. Любые объекты хранилища в конечном счете оседают на жестких дисках этих серверов, которые записывают данные в обычные файлы, сопровождая их метаданными, записываемыми в расширенные атрибуты файлов (xattr).
Надежность хранения достигается за счет дублирования данных сразу на несколько серверов, так что если один из них выйдет из строя, система сможет восстановить данные с другого сервера и вновь продублировать их. По умолчанию система создает три копии каждого объекта, так что в качестве железной составляющей кластера можно использовать даже самые дешевые машины, не снабженные RAID-контроллерами.
Один из основных плюсов системы состоит в ее прозрачной масштабируемости. Расширить хранилище можно просто подключив новый узел к кластеру, а всю остальную работу по его синхронизации с хранилищем возьмет на себя Swift.
Более всего такой кластер пригоден для хранения таких данных как образы виртуальных машин (собственно, для этого он и был создан), банки фотографий, архивы электронных писем, бэкапы и тому подобное.

Пробуем

OpenStack - сложная система, для описания установки и использования которой потребовалась бы ни одна статья, поэтому мы не будем углубляться в детали, а просто посмотрим насколько быстро можно развернуть облачный сервис на локальной машине.
С помощью Nova сделать это довольно просто. Нам даже не понадобится помощь Swift, мы просто установим все компоненты системы на одну машину и посмотрим как они функционируют вместе. В дальнейшем инфраструктуру можно будет расширить до нескольких машин, добавив к ней распределенное хранилище данных, но это тема для отдельной статьи.
Несмотря на свою молодость, Nova и Swift уже успели попасть в официальные репозитории некоторых дистрибутивов, поэтому для установки нужных нам компонентов можно использовать стандартный менеджер пакетов:
$ sudo apt-get install rabbitmq-server redis-server $ sudo apt-get install nova-api nova-objectstore nova-compute \     nova-scheduler nova-network euca2ools unzip
Фактически уже после установки система полностью готова к работе, остается только завести учетную запись суперпользователя:
$ sudo nova-manage user admin vasya
И создать новый проект, в рамках которого мы будем производить все дальнейшие эксперименты:
$ sudo nova-manage project create experiments vasya
Далее просим систему запаковать данные, необходимые для доступа к проекту, в zip-архив:
$ sudo nova-manage project zipfile experiments vasya
Теперь эти данные можно использовать чтобы управлять работой облака с помощью EC2-совместимых инструментов. Для этого распакуем архив и выполним команды, прописанные в файле novarc:
$ unzip nova.zip $ . novarc
Чтобы протестировать работу сервиса нам понадобится EC2-образ виртуальной машины. Минимальный Linux-образ можно получить на сайте Rackspace:
$ wget http://c2477062.cdn.cloudfiles.rackspacecloud.com/images.tgz
Распаковываем:
$ tar -xzf images.tgz
Образ необходимо зарегистрировать в облаке, поэтому делаем следующее:
1 Создаем манифесты для ядра и рамдиска:
$ euca-bundle-image -i images/aki-lucid/image \     -p kernel --kernel true $ euca-bundle-image -i images/ari-lucid/image \     -p ramdisk --ramdisk true
2 Заливаем ядро и рамдиск в облако:
$ euca-upload-bundle -m /tmp/kernel.manifest.xml -b mybucket $ euca-upload-bundle -m /tmp/ramdisk.manifest.xml -b mybucket
3 Регистрируем ядро и рамдиск:
$ euca-register mybucket/kernel.manifest.xml $ euca-register mybucket/ramdisk.manifest.xml
Эти комнады должны выдать на экран идентификаторы ядра и рамдиска внутри облака. Их нужно запомнить или скопировать.
4 Создаем манифест для образа машины, использующей зарегистрированные в прошлом шаге ядро и рамдиск:
$ euca-bundle-image -i images/ami-tiny/image -p machine \     --kernel ID-ядра --ramdisk ID-диска
5 Загружаем образ машины в облако:
$ euca-upload-bundle -m /tmp/machine.manifest.xml -b mybucket
6 Регистрируем образ машины и запоминаем ее идентификатор:
$ euca-register mybucket/machine.manifest.xml
Теперь мы можем запустить виртуальную машину на исполнение, но сначала мы должны получить SSH-ключ для доступа к ней:
$ euca-add-keypair mykey > mykey.priv $ chmod 600 mykey.priv
Запускаем виртуальную машину:
$ euca-run-instances ID-машины --kernel ID-ядра\     --ramdisk ID-рамдиска -k mykey
Смотрим состояние машины:
$ euca-describe-instances
Проверяем, была ли она корректно запущена:
$ virsh list
Подключаемся к машине по SSH:
$ euca-authorize -P tcp -p 22 default $ ssh -i mykey.priv root@10.0.0.3
Убиваем машину:
$ uca-terminate-instances ID-машины
Вот и все. Но это только вершина айсберга под названием OpenStack. Чтобы описать систему полностью понадобилась бы целая книга и огромное количество свободного времени. Но я надеюсь что и эта небольшая порция информации поможет вам начать освоение этого, без сомнения, грандиозного продукта, который в скором времени вполне может стать стандартом в среде открытых облачных сервисов.

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free