Azure CycleCloud では、テンプレートを使用してクラスター構成を定義します。 CycleCloud には、既定で多数のテンプレートが含まれています。 サポートされているテンプレートの完全な一覧については、 GitHub を参照してください。 新しいテンプレートを作成したり、既存のテンプレートをカスタマイズしたりできます。 たとえば、 スポット VM を利用するように既存のテンプレートをカスタマイズしたり、VPC を追加して独自のネットワークを拡張したりできます。
構成表記
Azure CycleCloud クラスター テンプレートを使用すると、ノードまたはノード配列に 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 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
テンプレートは、各パラメーターの既定値を定義します (既定値として開発値を使用しました)。
これで、パラメーター ファイルなしでテンプレートをインポートできるようになり、開発値が自動的に使用されます。 prod クラスターを作成するときは、prod-params.properties ファイルを使用して、テンプレート ファイル自体で指定された値を上書きします。
注
パラメーター名には、任意の文字、数字、およびアンダースコアを含めることができます。
テンプレート内のパラメーター参照は、次の 2 つの形式のいずれかを使用できます。
$param: paramという名前の 1 つのパラメーターの値を使用します。
${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 アプリケーションを使用すると、新しいクラスターを作成するときにクラスターの 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 に設定されたスポット仮想マシンを使用します。 この設定は、インスタンスが価格に基づいて削除されていないことを意味します。 インスタンスの価格は、使用可能な容量とクォータがある限り、スポット仮想マシンの現在の価格または標準インスタンスの価格のいずれか小さい方です。 カスタムの最大価格を設定するには、目的のノードまたはノード配列で 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
GUI には、GUI に表示される Label 属性と Description 属性、および省略可能な ParameterType 属性が含まれます。
ParameterType 属性を使用すると、カスタム UI 要素を表示できます。 前の例では、 Cloud.MachineType 値には、使用可能なすべてのマシンの種類を含むドロップダウンが表示されます。 その他の ParameterType 値は次のとおりです。
| パラメーターの型 | 説明 |
|---|---|
| Cloud.MachineType | 使用可能なすべてのマシンの種類を含むドロップダウンが表示されます。 |
| クラウド認証情報 | 使用可能なすべての資格情報を含むドロップダウンが表示されます。 |
| クラウド・リージョン | 使用可能なすべてのリージョンを含むドロップダウンが表示されます。 |
テンプレート内のカスタム ユーザー イメージ
Azure CycleCloud では、テンプレート内のカスタム イメージがサポートされています。 イメージ ID (リソース ID) は、 ImageIdを使用して直接指定することも、イメージ レジストリに追加することもできます。 レジストリにイメージを追加するときに、ノード上の 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 を含めることで、イメージを指定できます。
このイメージが、の 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 など) として指定します。