среда, 10 августа 2016 г.

Пишем свой биллинг для Windows Azure Pack.
Часть 1: Реализация возможности использования различных типов хранилища.


С тех пор, как у нас появилась облако с порталом Azure Pack, меня всегда мучил вопрос - почему разработчики на дали нам возможность использовать различные типы хранилищ для дисков? Ведь этот функционал есть во всех продуктах конкурентов, причем очень давно. Примеров реализации для WAP, в настоящий момент, по крайней мере в открытом доступе, нет. Придется построить свой лунапарк со всеми необходимыми мне опциями. В общем - поехали!

Первоначально решение данного вопроса кажется простым и очевидным. Создаем скрипт, который раз в заданный промежуток времени проверяет jobs VMM, смотрит, какие диски были добавлены и задает лимиты. Но, при ближайшем рассмотрении, идея уже не кажется столь простой. Вот примерный список возникших у меня вопросов:

1. В период времени между временем отработки скрипта лимиты не меняются
2. Надо контролировать работу планировщика на сервере, где выполняем скрипт.
3. Как вести учет данных ресурсов для биллинга

В итоге скрипт уверенно перерос в SMA Runbook, а задача по реализации различных типов хранилищ в  написание своего аналога WAP-Usage. Буду откровенен, то решение, которое предоставляет Windows Azure Pack, мне не нравилось никогда. Оно сложное, громоздкое, его легко поломать и тяжело поддерживать. Про возможность кастомизации и внесения утерянных данных (если, например, были проблемы с сервером SCOM) я вообще скромно промолчу. В общем, приступим.

Azure Pack. Операции с дисками.


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

1. Добавление диска к ВМ [Вносим информацию по диску в базу данных, устанавливаем лимит MaxIopsLimit]
2. Удаление диска ВМ [Удаляем информацию о диске из базы данных]
3. Создание ВМ [Вносим информацию по системному диску ВМ в базу данных, устанавливаем лимит MaxIopsLimit]
4. Удаление ВМ [Удаляем информацию о всех дисках ВМ из базы данных]
5. Удаление подписки WAP [Удаляем информацию о всех дисках подписки из базы данных]

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

Как видим, все очень просто.

Создание базы данных MsSQL.


Как первый шаг, нам необходимо создать базу данных, в которую мы будем заносить информацию по дискам. Она нам потребуется далее, чтобы написать биллинг.

1. Создаем базу данных. Назовем ее "BillingDB"

2. Создадим в ней таблицу "Disks":

 ID timestamp NULL,
DiskID text NULL,
DiskName text NULL,
VMID text NULL,
VMNAME text NULL,
Owner text NULL,
 Subscription text NULL,
StorageType text NULL,
JobID text NULL,
Date text NULL

Далее для этой базы данных надо создать ЛОКАЛЬНОГО пользователя и дать ему права owner. Он потребуется нам для подключения из runbook. Для примера, назовем пользователя 'BillingDBsa'.

Создание пользователя для работы Runbook.


Теперь нам надо создать пользователя, с данными которого мы будем подключаться к серверу VMM а так же к хостам Hyper-V (в нашем конкретном случае). Назовем его "CONTOSO\RBuser" и дадим ему права администратора VMM, а так же права на подключение к хостам и выполнение коммандлетов Hyper-V.

Создание Assets в Azure Pack.


Необходимо создать следующие Assets:

Name Type Data
VmmConnection VirtualMachineManager CONTOSO\Rbuser,
Password,
VMMclusterName
MsSQL-BillingDB PowerShell Credential BillingDBsa,
Password
MsSQL-Billing-Server String SQlServerName
MsSQL-Billing-Database String BillingDB
iops-defaults String 150:300:1500*

* Через двоеточие указываем ограничения iops для разных типов хранилища (standard:fast:ultra).

Создание дисков в VMM для Azure Pack.


Теперь необходимо создать диски VHDX, доступные пользователю в WAP для подключения к ВМ. Можете присваивать им любые имена. Главное - задать параметр Tag. Необходимо установить одно из следующих значений: Standard, Fast, Ultra. Именно по нему ранбук будет определять, что делать с диском и на какие ограничения устанавливать.

SMA Runbook.


Теперь нам осталось скачать Runbook и прилинковать его к событиям. Но, для начала, я коротко расскажу, как вообще это работает.

Наш ранбук состоит из двух основных частей:

1. Workflow. Рабочее пространство, тело runbook. Он принимает значения (param), выполняет необходимые нам действия и запускает inlinescript. Командлеты выполняются на сервере SMA.
2. Inlinescript. Открывает сессию Powershell на удаленном сервере (в нашем случае, это сервер VMM). Далее работа ведется именно через нее. В нем можно использовать переменные из Workflow, для этого надо вызывать ее используя $using. Например:  $SQLserver = $USING:MsSQLServer.

Результатом выполниния Inline блока является одно из трех действий:

1. Добавление диска в базу данных SQL и установление лимитов MaxIOPS. Так же можно выполнить любое другое действие, например, миграцию на другое хранилище.
2. Удаление диска из базы данных (при удалении диска ВМ).
3. Удаление из базы данных всех дисков, привязанных к виртуальной машине.

В итоге получилось так:



Осталось выполнить его привязку к событиям:
VMM VirtualDiskDrive (Create/Delete)
VMM VirtualMachine (Create/Delete)

Событие "Subscription Delete" вынесем в отдельный ранбук (опубликую в одной из следующих статей), так как надо будет не только удалять данные в базе, но и удалять виртуальные машины и сети клиента.

Данный ранбук является лишь первой частью проекта. Как видим, я присвоил ему версию 0.8, так как он еще проходит доработку и тестирование. Теперь необходимо:

1. Написать скрипт для сбора информации по изменениям виртуальных машин на всех подписках (создание/удаление, стоп/старт, изменение ресурсов). Это позволит получить информацию по занимаемым подпиской ресурсам на любой момент времени.
2. Разработать процедуру внесения данных в БД в случае сбоя в работе скриптов
3. Внести в БД информацию о текущих подписках (ограничения по дисковой подсистеме для старых машин клиентов должны оставаться прежними).






Комментариев нет:

Отправить комментарий