Шаблоны кластера

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

Нотация конфигурации

Все шаблоны кластеров Azure CycleCloud могут иметь один или несколько разделов [[конфигурация]], принадлежащих узлу или nodearray. В этих разделах указаны параметры конфигурации программного обеспечения для узлов, запускаемых CycleCloud. Пунктирная нотация используется для указания атрибутов, которые требуется настроить:

[[node scheduler]]
  [[[configuration]]]
  cycle_server.admin.name = poweruser
  cycle_server.admin.pass = super_secret
  cycle_server.http_port = 8080
  cycle_server.https_port = 8443

Можно также указать раздел конфигурации с помощью prefix нотации для сохранения ввода. Ту же конфигурацию можно также записать следующим образом:

[[node scheduler]]
  [[[configuration cycle_server]]]
  admin.name = poweruser
  admin.pass = super_secret
  http_port = 8080
  https_port = 8443

При необходимости узел или nodearray может содержать несколько разделов конфигурации:

[[node scheduler]]
  [[[configuration]]]
  run_list = role[sge_scheduler_node]

  [[[configuration cycle_server.admin]]]
  name = poweruser
  pass = super_secret

Параметры шаблона кластера

Шаблоны кластера могут содержать параметры, изменяющие значения определенных частей кластера, не изменяя сам шаблон. Это особенно полезно в тех случаях, когда требуется множество похожих кластеров с незначительными различиями, например развертывание сред разработки и рабочей среды. Синтаксис для указания параметра в шаблоне кластера — префикс переменной с символом $. Базовый пример шаблона (нефункциональный) с некоторыми параметрами может выглядеть следующим образом:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

Этот шаблон определяет два параметра: $machine_type и $slots. С помощью этого шаблона можно определить текстовые файлы, содержащие значения параметров в средах разработки и prod. Файл параметров может быть в формате JSON или в формате файла свойств Java:

# dev-params.json
{
  "machine_type": "H16r",
  "slots": 2
}

# prod-params.properties
machine_type = Standard_D4v3
slots = 8

При этом будет создан JSON-файл, содержащий параметры для разработки и PROPERTIES-файл, содержащий значения для рабочей среды.

Примечание

Суффикс имени файла параметров важен! При использовании JSON имя файла должно быть присвоено.foo.json Если используются свойства Java, файл должен заканчиваться на .properties. Неправильно именованные файлы параметров импортируются неправильно.

Теперь шаблон можно импортировать с помощью файла параметров для заполнения отсутствующих элементов:

cyclecloud import_cluster gridengine-dev -f template.txt -p dev-params.json -c gridengine

cyclecloud import_cluster gridengine-prod -f template.txt -p prod-params.properties -c gridengine

Также можно определить некоторые или все параметры в самом шаблоне кластера:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

[parameters]
  [[parameter machine_type]]
  DefaultValue = Standard_D4v3

  [[parameter slots]]
  DefaultValue = 2

Значения по умолчанию для каждого параметра определяются в шаблоне (мы использовали значения dev в качестве значений по умолчанию).

Теперь можно импортировать шаблон без файла параметров, и значения dev будут использоваться автоматически. Когда пора создать кластер prod, можно использовать файл prod-params.properties для перезаписи значений, указанных в самом файле шаблона.

Примечание

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

Ссылки на параметры в шаблоне могут принимать одну из двух форм:

$param: использует значение одного параметра с именем param

${expr}: оценивается expr в контексте всех параметров, что позволяет вычислять динамические значения. Пример:

Attribute = ${(a > b ? a : b) * 100}

Это займет больше двух параметров, a и bумножить его на 100. Выражение интерпретируется и вычисляется в соответствии со спецификацией языка ClassAd.

Если ссылка на параметр существует сама по себе, используется значение параметра, которое поддерживает нестроковые типы, такие как логические значения, целые числа и вложенные структуры, такие как списки. Однако если ссылка внедрена в другой текст, его значение преобразуется и включается в строку. Например, предположим, что param он определен как 456 и ссылается в двух местах:

  • Attribute1 = $param
  • Attribute2 = 123$param

Значением Attribute1 будет число 456, но значением Attribute2 будет строка "123456". Обратите внимание, что ${param} идентично $paramтому, что позволяет внедрять ссылки на параметры в более сложных ситуациях:

  • Attribute3 = 123$param789
  • Attribute4 = 123${param}789

Attribute3 будет искать параметр с именем param789, но Attribute4 будет использовать значение param для получения "123456789".

Типы компьютеров

Azure CycleCloud поддерживает несколько типов компьютеров с помощью атрибута MachineType . Она попытается получить емкость в указанном порядке.

Спецификации инициализации кластера

Веб-приложение Azure CycleCloud позволяет пользователям выбирать спецификации проекта cluster-init при создании нового кластера. Спецификации проекта настраиваются в шаблоне кластера:

[parameter ClusterInitSpecs]
Label = Cluster-Init
Description = Cluster init specs to apply to nodes
ParameterType = Cloud.ClusterInitSpecs

[cluster demo]

  [[node defaults]]
  AdditionalClusterInitSpecs = $ClusterInitSpecs

      [[[cluster-init myproject:myspec:1.0.0]]]

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

Точечные виртуальные машины

Чтобы снизить затраты на рабочие нагрузки, можно задать .Interruptible = true Это помечает экземпляр как точечный и будет использовать излишковую емкость, если она доступна. Важно отметить, что эти экземпляры не всегда доступны и могут быть вытесняются в любое время, то есть они не всегда подходят для вашей рабочей нагрузки.

По умолчанию при установке Interruptible значения true используются точечные экземпляры с максимальной ценой,равным –1. Это означает, что экземпляр не будет исключен на основе цены. Цена на такой экземпляр будет определяться меньшим из двух значений: текущая цена на экземпляр точечной или стандартной виртуальной машины, но только при условии наличия емкости и соблюдения квоты. Если вы хотите задать настраиваемую максимальную цену, используйте MaxPrice атрибут на нужном узле или nodearray.

[cluster demo]

  [[nodearray execute]]
  Interruptible = true
  MaxPrice = 0.2

Таблицы подстановки

Вы можете ссылаться на один параметр и вычислять определенное значение с помощью таблицы подстановки. Например, предположим, что у вас есть параметр для использования изображения с двумя вариантами в этом случае:

[[parameter MachineImage]]
    Label = Image
    DefaultValue = image-1000
    Description = Ubuntu 22.04
    Config.Plugin = pico.control.AutoCompleteDropdown
    [[[list Config.Entries]]]
        Name = image-1000
        Label = Ubuntu 20.04
    [[[list Config.Entries]]]
        Name = image-2000
            Label = Ubuntu 22.04

Вы также можете получить версию ОС выбранного образа и использовать ее для другой конфигурации, сделав параметр e, значение которого представляет собой таблицу подстановки значений:

[[parameter AmiLookup]]
  ParameterType = hidden
  [[[record DefaultValue]]]
      image-1000 = Ubuntu 20.04
      image-2000 = Ubuntu 22.04

Обратите внимание, что эта функция скрыта, чтобы она не отображалась в пользовательском интерфейсе.

Версию ОС, используемую для выбранного образа, можно получить в любом месте определения кластера:

[[node node]]
[[[configuration]]]
version = ${AmiLookup[MachineImage]}

Интеграция графического интерфейса пользователя

Определение параметров в шаблоне кластера позволяет воспользоваться преимуществами графического интерфейса Azure CycleCloud. Например, при определении параметров для создания графического интерфейса можно использовать следующие атрибуты:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

[parameters]
  [[parameter machine_type]]
  DefaultValue = Standard_D4v3
  Label = Machine Type
  Description = MachineType to use for the Grid Engine scheduler node
  ParameterType = Cloud.MachineType

  [[parameter slots]]
  DefaultValue = 2
  Description = The number of slots for Grid Engine to report for the node

Атрибуты Label и Description включаются, которые будут отображаться в графическом интерфейсе пользователя, а также необязательный атрибут ParameterType. ParameterType позволяет отображать настраиваемые элементы пользовательского интерфейса. В приведенном выше примере значение Cloud.MachineType отобразит раскрывающийся список, содержащий все доступные типы компьютеров. Другие значения ParameterType:

Тип параметра Описание
Cloud.MachineType Отображает раскрывающийся список, содержащий все доступные типы компьютеров.
Cloud.Credentials Отображает раскрывающийся список, содержащий все доступные учетные данные.
Cloud.Region Отображает раскрывающийся список, содержащий все доступные регионы.

Поддержка сервера Chef

Azure CycleCloud suports ChefServer.

Создайте файл chefserver.json и добавьте учетные данные. ValidationKey соответствует файлу validation.pem для сервера chef. Кроме того, необходимо подтвердить validation_client_name , что вы изменили его со значения по умолчанию chef-validator:

{
"AdType" : "Cloud.Locker",
"ValidationKey" : "YOURVALIDATION.PEMHERE",
"ValidationClientName" : "chef-validator",
"Credentials" : "default",
"Location" : "https://mychefserver",
"ChefRepoType" : "chefserver",
"LockerType" : "chefrepo",
"Name" : "chefrepo",
"AccountId" : "default",
"Shared" : false
}

Затем поместите файл в каталог /opt/cycle_server/config/data. Он будет импортирован автоматически.

Пользовательские изображения в шаблонах

Azure CycleCloud поддерживает пользовательские образы в шаблонах. Укажите идентификатор образа (идентификатор ресурса) непосредственно с ImageIdпомощью или добавьте его в реестр образов. Когда образ находится в реестре, сослаться на него с помощью узла Image или ImageName на нем. Он появится в раскрывающемся списке изображений на странице создания кластера.

Образы в реестре образов состоят из Package записи, определяющей содержимое логического образа и одну или несколько соответствующих Artifact записей, которые указывают фактический идентификатор образа в соответствующем поставщике облачных служб. Например, пользовательский образ с установленным на нем R может состоять из этой записи пакета:

AdType = "Package"
Name = "r_execute"
Version = "2.1.1"
PackageType = "image"
Label = "R"

После добавления этой записи можно указать это изображение, включив либо Image = RImageName = r_execute в шаблон кластера.

Если этот образ существовал в качестве одной виртуальной машины, используемой с идентификатором /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage, потребуется сохранить следующий артефакт:

AdType = "Artifact"
Package = "r_execute"
Version = "2.1.1"
Name = "az/useast"
Provider = "az"
ImageId = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage"

Необходимо указать Provider артефакт.

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

При добавлении нескольких пакетов образов с одинаковым именем они должны иметь разные номера версий. При запуске экземпляра CycleCloud автоматически выбирает изображение с наибольшим номером версии, рассматривая номер версии как пунктирную строку и сравнивая каждую часть как число. Чтобы переопределить это, укажите ImageVersion на узле как литерал (например1.2, или подстановочный знак).1.x