Панель Cloudstack предоставляет отличные средства по управлению виртуальными машинами в ручном режиме с помощью графического интерфейса пользователя. Данный механизм подходит для большинства случаев, когда виртуальная машина создается для продолжительного существования, однако, облако предоставляет Вам гораздо большие возможности. В этом цикле статей мы рассмотрим современный, иной подход к вычислениям, который позволит Вам создавать более гибкие и функциональные решения с использованием средств облачных вычислений.Весь маршрут цикла статей будет выглядеть следующим образом:
- Программное управление выделением и удалением виртуальных машин (cloudmonkey);
- Автоматизированное управление конфигурациями виртуальных машин (ansible, vagrant).
В этой статье мы рассмотрим как с помощью системы виртуализации Cloudstack возможно создавать и удалять виртуальные машины в автоматическом режиме с помощью API.
Традиционно, хостинг-провайдеры предлагают виртуальные машины на сроки от месяца, что согласуется с традиционными телематическими услугами, однако суть облачных услуг «доступность ресурса тогда, когда он нужен и освобождение сразу, как он больше не требуется» в данной модели не реализуется. Данный «облачный» подход принципиально меняет модель обслуживания клиентов, провоцируя использовать средства для горизонтального масштабирования и снижать степень «жесткой» связности систем.
Цель
Сначала, перед тем как приступить к изложению, давайте определимся с модельными ситуациями и что мы хотим добиться. Допустим, что у нас имеется задача конвертирования видео, причем мы точно не знаем сколько видеозаписей и какой длины у нас будет. При этом мы хотим при поступлении видеозаписи выполнить конвертирование видео, для чего в традиционном подходе мы добавляли видео в очередь конвертирования, а в новом облачном подходе мы можем сделать следующие действия:
- создать виртуальную машину;
- установить на нее необходимые средства для конвертирования;
- загрузить видео на виртуальную машину;
- выполнить конвертирование;
- скачать видео с виртуальной машины;
- удалить виртуальную машину.
Для каждой видеозаписи мы будем выполнять данные действия. По этому поводу можно сделать три замечания:
- пункт 2 можно опустить, внеся в начальный шаблон виртуальной машины необходимые программные средства, но здесь мы его рассмотрим для того, чтобы видеть полную картину;
- во многих ситуациях пункты 2-5 могут многократно повторяться для каждой виртуальной машины, то есть нет необходимости каждый раз ее создавать и удалять. Создание и удаление новых экземпляров можно осуществлять при увеличении (росте) очереди или при увеличении времени обработки заявки (например, для HTTP сервера);
- с точки зрения стоимости затрат нет никакой разница в том брать одну машину и добавлять видео в очередь или для каждого видео создавать экземпляр VM, где производить обработку (при условии быстрого создания VM), при этом второй подход обеспечивает большую производительность и уменьшает время ожидания.
Представленные выше шаги 1-6 позволяют реализовать масштабируемую обработку в самых различных областях, начиная от разработки и сборки ПО, заканчивая высокодоступными сервисами. Итак, начнем с того, что разберемся как осуществлять выделение и удаление виртуальных машин с помощью API Cloudstack. Cloudstack предоставляет RESTful API, которое обрабатывает запросы как в формате AWS так и в формате встроенного API. Мы будем использовать специальную утилиту Cloudmonkey, которая позволяет взаимодействовать с API упрощенно с помощью интерфейса командной строки. Для начала нам необходимо установить Cloudmonkey. Мы будем рассматривать установку для OS Debian Linux.
# apt-get install python-pip # pip install cloudmonkey
Больше нам права суперпользователя не потребуются. Первое, что необходимо сделать — настроить Cloudmonkey для взаимодействия с сервером Cloudstack. Для этого необходимо составить конфигурационный файл следующего вида:
[core] cache_file = /home/user/.cloudmonkey/cache log_file = /home/user/cloudmonkey_logs asyncblock = true paramcompletion = false history_file = /home/user/cloudmonkey_history [ui] color = true prompt = > display = [user] secretkey = aa9AavyLs2xeR6NAj2E9ZwNMmfhvsrv1EtykaVcIIwVbd3NpivmzqRtOjZtD6tSU7BSrNNFA2-u_NYvIWBY_HB6g username = bitworks1375 password = apikey = -xxFkwCHbo8KjIDf9S8NqH3SJQQcU-guTbSGTddsewGtryNSfYPytRzt6vdsdkgd7fdssb7eDly_G0RQ-dyWQ__gNW53ig [server] protocol = http expires = 600 host = cs1.netpoint-dc.com timeout = 3600 path = /client/api port = 8080
и сохранить его как ~/.cloudmonkey/config. Давайте разберем содержимое конфигурационного файла. В секции [core] находятся глобальные настройки, которые Вы можете оставить неизменными, только измените пути хранения логов, кэша и истории на те, которые подходят Вам. В секции [ui] находятся настройки консоли cloudmonkey. Здесь интересен параметр display, который можно выставить как json, что позволит получать ответы не в форме key=value, а в форме json объекта, что может быть предпочтительнее. Однако, для ознакомительного этапа лучше всего оставить как есть, то есть в форме key=value. Color определяет будет ли вывод в цветном или черно-белом виде. В цветном симпатичнее, поэтому ставим как true. Секция [user] представляет для нас интерес. В качестве user указываем пользователя Cloudstack, пароль (password) оставим пустым. Теперь два поля secretkey и apikey, которые как раз отвечают за взаимодействие с API Cloudstack. Для того, чтобы получить эти строки необходимо сделать следующее: Воити в Cloudstack и перейти в учетные записи:Далее выбираем учетную запись и переходим в Вид Пользователи:Выбираем пользователя:Генерируем для него ключи:Копируем содержимое полей Ключ API, Секретный ключ в текстовый файл себе на компьютер. Данную информацию необходимо хранить в секрете и не передавать третьим лицам. При ее наличии возможно управлять всем функционалом Cloudstack вашего аккаунта, например, удалять виртуальные машины. Итак, ключи у нас есть, теперь можно указать их в конфигурационном файле Cloudmonkey (apikey, secretkey). Секция [server] тоже, на мой взгляд, очевидно, комментировать не буду. Проверяем Cloudmonkey в работе:
ivan@work-notebook:~/Загрузки$ cloudmonkey > sync 220 APIs discovered and cached
Команда sync определяет доступные вызовы API Cloudstack. Собственно ее вывод показывает, что соединение с Cloudstack прошло успешно. Теперь разберемся как создать виртуальную машину из шаблона. В данном примере будет использоваться представленный шаблон debian7-x64-10GB-lvm-passwd-RU. Для создания виртуальной машины нам потребуется узнать следующие данные:
- GUID шаблона;
- GUID предложения;
- GUID зоны.
Узнаем GUID шаблона:
> list templates templatefilter=featured | grep -B2 debian7-x64-10GB-lvm-passwd-RU================================================================================ id = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 name = debian7-x64-10GB-lvm-passwd-RU
Узнаем GUID зоны, в которой будет размещаться VM (у нас в настоящее время одна зона):
> list zones count = 1 zone: name = Zone 1 / No security id = 860117f1-c815-4f0d-bb6f-04955f7de56f allocationstate = Enabled dhcpprovider = VirtualRouter domain = z1.netpoint-dc.com localstorageenabled = True networktype = Basic securitygroupsenabled = True tags: zonetoken = af4b4d69-d20b-3309-bf89-e5364efa8a6a
Теперь узнаем GUID вычислительного предложения, например, vm.large.sh:
> list serviceofferings | grep -F1 vm.large.sh ================================================================================ name = vm.large.sh id = f49918d3-abe1-47b3-b9b6-53e9839d4fb4
Теперь у нас есть все необходимые данные для создания VM:
> deploy virtualmachine serviceofferingid=f49918d3-abe1-47b3-b9b6-53e9839d4fb4 templateid=fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 zoneid=860117f1-c815-4f0d-bb6f-04955f7de56f accountid = c5d977cb-cc82-45ec-9713-64b7396f2730 cmd = org.apache.cloudstack.api.command.user.vm.DeployVMCmd created = 2014-07-03T16:47:51+0700 jobid = 6e93fa11-438d-4fbd-93e9-4a122df4f13a jobprocstatus = 0 jobresult: virtualmachine: id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06 name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06 account = bitworks1375 affinitygroup: cpunumber = 8 cpuspeed = 1000 created = 2014-07-03T16:47:51+0700 displayvm = True domain = ROOT domainid = 13627c9c-4922-11e3-bb87-0017087e602c guestosid = 19dcfd2d-4922-11e3-bb87-0017087e602c haenable = True hypervisor = KVM isdynamicallyscalable = False jobid = 6e93fa11-438d-4fbd-93e9-4a122df4f13a jobstatus = 0 memory = 8192 nic: id = a669225b-3e19-4eef-b661-b266d7a09daf broadcasturi = vlan://untagged gateway = 176.120.25.1 ipaddress = 176.120.25.144 isdefault = True isolationuri = ec2://untagged macaddress = 06:09:e8:00:01:7a netmask = 255.255.255.0 networkid = 4cfb157a-1805-43dc-a9f3-74726526ec6a networkname = defaultGuestNetwork traffictype = Guest type = Shared password = yI8qdsaan passwordenabled = True rootdeviceid = 0 rootdevicetype = ROOT securitygroup: serviceofferingid = f49918d3-abe1-47b3-b9b6-53e9839d4fb4 serviceofferingname = vm.large.sh state = Running tags: templatedisplaytext = Debian7 x64 with password reset/LVM RU templateid = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 templatename = debian7-x64-10GB-lvm-passwd-RU zoneid = 860117f1-c815-4f0d-bb6f-04955f7de56f zonename = Zone 1 / No security jobresultcode = 0 jobresulttype = object jobstatus = 1 userid = 1b6f676c-3e61-4ae5-a4f8-34443bfe901d
Все, виртуальная машина создана, теперь для создания VM типа (Debian7 x64/4C/4GB/10GB) вы можете просто использовать команду deploy:
$ cloudmonkey deploy virtualmachine serviceofferingid=f49918d3-abe1-47b3-b9b6-53e9839d4fb4 templateid=fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 zoneid=860117f1-c815-4f0d-bb6f-04955f7de56f
Все, виртуальная машина создана, теперь для создания VM типа (Debian7 x64/4C/4GB/10GB) вы можете просто использовать команду deploy и создать столько VM, сколько Вам необходимо. Кстати, в команде deploy можно указать еще параметр name. Обратите внимание, что в ответе системы есть такие данные как ipaddress, password, которые содержат IP и пароль для root к VM (в данном случае наш шаблон включает средства интеграции и пароль устанавливается в виртуальную машину панелью Cloudstack). Вторая часть процесса (шаг 6) — удаление VM. Выполняется оно достаточно просто:
> set color false > list virtualmachines | egrep -EB1 '^name' id = 9c45cffe-5f25-485a-a9e0-78c6228da85d name = test -- id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06 name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06
Получили идентификаторы VM, можно удалять:
> destroy virtualmachine id=10d388b3-8b30-4d0f-8c23-5587b37e2f06 cmd = org.apache.cloudstack.api.command.user.vm.DestroyVMCmd created = 2014-07-03T17:00:51+0700 jobid = 9f48eacc-8a73-4cbe-ba40-d75a6b669024 jobprocstatus = 0 jobresult: virtualmachine: id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06 name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06 account = bitworks1375 affinitygroup: cpunumber = 8 cpuspeed = 1000 cpuused = 0,01% created = 2014-07-03T16:47:51+0700 diskioread = 11 diskiowrite = 106 diskkbsread = 68 diskkbswrite = 684 displayvm = True domain = ROOT domainid = 13627c9c-4922-11e3-bb87-0017087e602c guestosid = 19dcfd2d-4922-11e3-bb87-0017087e602c haenable = True hypervisor = KVM isdynamicallyscalable = False jobid = 9f48eacc-8a73-4cbe-ba40-d75a6b669024 jobstatus = 0 memory = 8192 networkkbsread = 103 networkkbswrite = 5 nic: id = a669225b-3e19-4eef-b661-b266d7a09daf broadcasturi = vlan://untagged gateway = 176.120.25.1 ipaddress = 176.120.25.144 isdefault = True isolationuri = ec2://untagged macaddress = 06:09:e8:00:01:7a netmask = 255.255.255.0 networkid = 4cfb157a-1805-43dc-a9f3-74726526ec6a networkname = defaultGuestNetwork traffictype = Guest type = Shared passwordenabled = True rootdeviceid = 0 rootdevicetype = ROOT securitygroup: serviceofferingid = f49918d3-abe1-47b3-b9b6-53e9839d4fb4 serviceofferingname = vm.large.sh state = Destroyed tags: templatedisplaytext = Debian7 x64 with password reset/LVM RU templateid = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 templatename = debian7-x64-10GB-lvm-passwd-RU zoneid = 860117f1-c815-4f0d-bb6f-04955f7de56f zonename = Zone 1 / No security jobresultcode = 0 jobresulttype = object jobstatus = 1 userid = 1b6f676c-3e61-4ae5-a4f8-34443bfe901d
Все, на этом виртуальная машина удалена. В следующей части мы разберемся с тем, как взаимодействовать с вновь созданной VM с помощью SSH и ключей PKI.