Azure CycleCloud では、テンプレートを使用してクラスター構成を定義します。 既定では、CycleCloud には多数のテンプレートが含まれており、サポートされているテンプレートの完全な一覧は GitHub で入手できます。 新しいテンプレートを作成することも、既存のテンプレートをカスタマイズすることもできます。 たとえば、 スポット VM を利用するように既存のテンプレートをカスタマイズしたり、VPC を追加して独自のネットワークを拡張したりできます。
構成表記
Azure CycleCloud クラスター テンプレートには、すべて、ノードまたは nodearray に属する 1 つ以上の [[構成]] セクションを持つオプションがあります。 これらのセクションでは、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/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
の 2 つのパラメーターを定義します。 このテンプレートを使用すると、開発環境と 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 ファイルを使用して、テンプレート ファイル自体で指定された値を上書きできます。
注
パラメーター名には、任意の文字、数字、およびアンダースコアを含めることができます。
テンプレート内のパラメーター参照は、次の 2 つの形式のいずれかを使用できます。
$param
: 名前が付いた 1 つのパラメーターの値を使用します。 param
${expr}
: すべてのパラメーターのコンテキストで expr
を評価します。これにより、動的な値を計算できます。 例えば次が挙げられます。
Attribute = ${(a > b ? a : b) * 100}
これは、 a
と b
の 2 つのパラメーターのうち大きい方を受け取り、それを 100 で乗算します。
式は、 ClassAd 言語仕様に従って解釈および評価されます。
パラメーター参照が単独で存在する場合は、パラメーターの値が使用され、ブール値、整数、リストなどの入れ子構造などの文字列以外の型がサポートされます。
ただし、参照が他のテキストに埋め込まれている場合、その値は変換され、文字列に含まれます。
たとえば、 param
が 456
として定義され、次の 2 つの場所で参照されるとします。
- 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 Web アプリケーションを使用すると、ユーザーは新しいクラスターの作成時に 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]]]
このパラメーターがクラスター テンプレートに追加されると、ユーザーはファイル ピッカーを使用して、新しいクラスターの作成時に適切なプロジェクト スペックを選択できます。
Spot Virtual Machines
ワークロードのコストを削減するために、 Interruptible = true
を設定できます。 これにより、インスタンスにスポットとしてフラグが設定され、使用可能な場合は余分な容量が使用されます。 これらのインスタンスは常に使用できるわけではないため、いつでも割り込むことができるため、ワークロードに適しているとは限らない点に注意してください。
既定では、 Interruptible
を true に設定すると、最大価格が -1 に設定されたスポット インスタンスが使用されます。つまり、インスタンスは価格に基づいて削除されません。 インスタンスの価格は、利用可能な容量とクォータがある限り、スポットの現在の価格または標準インスタンスの価格のいずれか小さい方になります。 カスタムの最大価格を設定する場合は、目的のノードまたは nodearray で MaxPrice
属性を使用します。
[cluster demo]
[[nodearray execute]]
Interruptible = true
MaxPrice = 0.2
検索テーブル
1 つのパラメーターで別のパラメーターを参照し、参照テーブルを使用して特定の値を計算できます。 たとえば、イメージで使用するパラメーターがあり、この場合は次の 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 バージョンを取得し、値が値の参照テーブルであるパラメーターを e にすることで、他の構成に使用することもできます。
[[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" 属性、および省略可能な "ParameterType" 属性が含まれており、GUI に表示されます。 "ParameterType" を使用すると、カスタム UI 要素を表示できます。 上記の例では、"Cloud.MachineType" の値には、使用可能なすべてのマシンの種類を含むドロップダウンが表示されます。 その他の ParameterType 値は次のとおりです。
パラメーターの型 | 説明 |
---|---|
Cloud.MachineType | 使用可能なすべてのマシンの種類を含むドロップダウンが表示されます。 |
Cloud.Credentials | 使用可能なすべての資格情報を含むドロップダウンが表示されます。 |
クラウド・リージョン | 使用可能なすべてのリージョンを含むドロップダウンが表示されます。 |
Chef サーバーのサポート
Azure CycleCloud では ChefServer がサポートされています。
ファイル chefserver.json
を作成し、資格情報を追加します。 ValidationKey
は、chef サーバーの validation.pem ファイルに対応します。 また、"chef-validator" の既定値から変更した場合は、 validation_client_name
を証明する必要があります。
{
"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
を使用してイメージ ID (リソース ID) を直接指定するか、イメージ レジストリにイメージを追加します。 イメージがレジストリ内にある場合は、ノード上の Image
または ImageName
で参照します。 クラスター作成ページの イメージ ドロップダウン に表示されます。
イメージ レジストリ内のイメージは、論理イメージの内容を識別する Package
レコードと、適切なクラウド プロバイダーで実際のイメージ ID を指定する 1 つ以上の対応する Artifact
レコードで構成されます。 たとえば、R がインストールされているカスタム イメージは、次の Package レコードで構成される場合があります。
AdType = "Package"
Name = "r_execute"
Version = "2.1.1"
PackageType = "image"
Label = "R"
そのレコードを追加したら、クラスター テンプレートに Image = R
または ImageName = r_execute
を含めることで、そのイメージを指定できます。
このイメージが、 /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage
の ID を持つ使用中の単一の仮想マシンとして存在する場合は、次の成果物を格納する必要があります。
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
を指定する必要があります。
特定のイメージ パッケージに必要な数の成果物を追加できますが、そのイメージを使用するために必要なすべての成果物を、必要なすべての "場所" に含める必要があります (クラウド プロバイダー アカウント、リージョン、プロジェクトごとに 1 つ)。 成果物の名前は重要ではありません。ただし、特定のパッケージとバージョンのすべての成果物に対して一意である必要があります。 通常、プロバイダーとプロバイダー固有の詳細 (リージョンなど) の組み合わせを使用することをお勧めします。 CycleCloud は、プロバイダーとプロバイダー固有の詳細に一致する適切な成果物を自動的に選択しますが、Name を解析するのではなく、Provider 属性 (および Region など) を使用します。
同じ名前のイメージ パッケージを複数追加する場合は、バージョン番号が異なる必要があります。 インスタンスを開始すると、CycleCloud は、バージョン番号を点線の文字列として扱い、各部分を数値として比較することで、バージョン番号が最も高いイメージを自動的に選択します。 これをオーバーライドするには、ノード上の ImageVersion
をリテラル (例: 1.2
) またはワイルドカード (1.x
) として指定します。