你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

群集模板

Azure CycleCloud 使用模板来定义群集配置。 默认情况下,CycleCloud 中包括许多模板, GitHub 中提供了受支持的模板的完整列表。 可以创建新模板,也可以自定义现有模板。 例如,你可能想要自定义现有模板以利用 现成 VM,或者可能需要添加一个用于扩展自己的网络的 VLAN。

配置表示法

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

如果需要,节点/节点数组还可以包含多个配置节:

[[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: Uses the value of a single parameter named 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 将使用获取"123456789"的值param

计算机类型

Azure CycleCloud 通过 MachineType 属性支持多个计算机类型。 它将尝试按列出的顺序获取容量。

群集 Init 规范

Azure CycleCloud Web 应用程序允许用户在创建新群集时选择群集 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。 这会将实例标记为 Spot,并在可用时使用剩余容量。 请务必注意,这些实例并不总是可用的,可以随时抢占这些实例,这意味着它们并不总是适合工作负荷。

默认情况下,设置为 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

还可以获取所选映像的 OS 版本,并将其用于其他配置,方法是将值设置为查找值表的参数:

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

请注意,这是隐藏的,因此它不会显示在 UI 中。

可以在群集定义中的其他任何位置获取用于所选映像的 OS 版本:

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

GUI 集成

在群集模板中定义参数可使一个参数利用 Azure CycleCloud GUI。 例如,定义参数时,可以使用以下属性来帮助创建 GUI:

# 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”属性包含在 GUI 中,以及可选的“ParameterType”属性。 “ParameterType”允许显示自定义 UI 元素。 在上面的示例中,“Cloud.MachineType”值将显示包含所有可用计算机类型的下拉列表。 其他 ParameterType 值包括:

参数类型 说明
Cloud.MachineType 显示包含所有可用计算机类型的下拉列表。
Cloud.Credentials 显示包含所有可用凭据的下拉列表。
Cloud.Region 显示包含所有可用区域的下拉列表。

Chef 服务器支持

Azure CycleCloud suports ChefServer

创建文件 chefserver.json 并添加凭据。 ValidationKey 对应于 chef 服务器的 validation.pem 文件。 还必须证明 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 支持模板中的自定义映像。 (资源 ID) 直接 ImageId指定映像 ID,或将映像添加到映像注册表。 当映像位于注册表中时,请使用任一 Image 节点或 ImageName 节点上引用它。 它将显示在群集创建页上 的图像下拉列表 中。

映像注册表中的映像由一条 Package 记录组成,用于标识逻辑映像的内容以及一个或多个在相应云提供程序中指定实际映像 ID 的相应 Artifact 记录。 例如,安装了 R 的自定义映像可能包含此包记录:

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

添加该记录后,可以通过包括群集 Image = R 模板或 ImageName = r_execute 群集模板来指定该映像。

如果此映像作为 ID 为 的 Useast /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) 。