NGroups について (プレビュー)
コンテナーはクラウド アプリケーションのパッケージ化、デプロイ、管理の標準となり、これらのコンテナーを効果的に管理することは、アプリ自体の実行と同じくらい重要になります。 Azure Container Instances (ACI) は、インフラストラクチャを管理せずにコンテナー化されたアプリケーションを実行できる、柔軟でスケーラブルなサーバーレス コンピューティング サービスです。
NGroups には、関連する複数のコンテナー グループを管理するための高度な機能が用意されています。 "サポートされている" 機能は、次のとおりです。
- 複数のインスタンスの維持
- ローリング アップグレード
- Availability Zones (AZ) による高可用性
- マネージド ID のサポート
- 機密コンテナーのサポート
- 負荷分散
- ゾーンの再調整 (Zone Any)
NGroups 機能は、ACI に基づいて構築され、コンテナー グループがセキュリティで保護され、高可用性を確保し、ACI の機能セットをサポートするようにします。
Azure Container Instances の詳細については、「Azure Container Instances とは」を参照してください。
NGroups の高レベル アーキテクチャ
Azure Container Instances では、個々のコンテナー グループを手動で作成し、管理する必要があります。 NGroups には、1 回の API 呼び出しで N 個のコンテナー グループ インスタンスを作成し、更新し、管理する簡単なソリューションが用意されています。
NGroups リソースの作成は、2 つの手順で行います。
テンプレートとなるコンテナー グループ プロファイル (CGProfile) を作成します。 CGProfile では、ユーザーは NGroups によって作成されたすべての CG に適用される CG プロパティを指定します。
NGroups リソースを作成します。 必要なカウント (必要な CG の数) と、コンテナー グループ プロファイルへの参照を、その他の関連プロパティとともに指定できます。
NGroups はこのコンテナー グループ プロファイルを参照し、CGProfile に記載されたプロパティを持つ CG を作成/更新するために ACI API を呼び出します。
概念
コンテナー グループのプロファイル (CG プロファイル)
大規模なクラウド アプリケーションでは、複数のコンテナー グループを管理する必要がある場合があります。 現在、複数の CG (コンテナー グループ) を実行するには、コンテナー イメージ、再起動ポリシー、その他のプロパティなどの関連するプロパティを毎回指定する必要があります。 その結果、調整エラーが発生し、作業が重複して、管理のオーバーヘッドが発生する可能性があります。
この問題を軽減するために、NGroups ではコンテナー グループ プロファイルが導入されました。 コンテナー グループ プロファイル (CGProfile) は、同じプロパティ セットを持つコンテナー グループを作成するためのテンプレートとして機能します。
コンテナー グループ プロファイルで指定できる一般的なプロパティの一部を次に示します。
- osType (例: Linux、Windows)
- あります。 イメージ名、メモリ、CPU など
- restartPolicy
- ipAddress プロトコルと内部ポート
- shutdownGracePeriod
- timeToLive
サンプル CG プロファイルを次に示します。
{
"location": "{{location}}",
"properties": {
"sku": "Standard",
"containers": [
{
"name": "container1",
"properties": {
"image": "nginx",
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"resources": {
"requests": {
"memoryInGB": 2.0,
"cpu": 1.0
}
}
}
}
],
"restartPolicy": "Always",
"shutdownGracePeriod": "PT1H",
"ipAddress": {
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"type": "Public",
},
"timeToLive": "PT1H",
"osType": "Linux"
}
}
NGroups
NGroups リソースは、豊富な操作セットを使用して "n" コンテナー グループを作成および管理する方法を提供します。 NGroups リソースは、コンテナー グループ プロファイル リソースを参照し、そのリソースを使用して、同じような CG の N インスタンスを作成します。 NGroups リソース内では、CG の数、更新設定 (手動またはローリング更新)、ロード バランサー、サブネットなどのプロパティ、また NGroups リソースの下で CG に関連付けるその他の関連プロパティを指定することもできます。そして、これらに限定されません。
Note
NGroups リソースを作成する前に、CG プロファイルを作成する必要があります。 CG プロファイルは ARM リソースであるため、独自の ARM API を持っています。 NGroups リソースを作成する前に、CG プロファイルを作成する必要があります。
コンテナー グループ プロファイルを参照するメリット
コンテナー グループ プロファイルは、NGroups とは別個のリソースです。 お客様は、同じコンテナー グループ プロファイルを参照できる複数の NGroup を作成できます。 また、1 つのコンテナー グループ プロファイルを参照するすべての NGroup の一貫性が保たれ、重複も避けられます。
1 つの ACI CG を CG プロファイルから作成することもできます。 プロトタイプから実稼働モードに迅速に移行できます。
コンテナー グループ プロファイルを参照し、3 つのコンテナー グループを作成するマネージド ID とゾーンを持つ NGroups リソースのサンプルを次に示します。
{
"location": "{{location}}",
"properties": {
"elasticProfile": {
"desiredCount": 100 // specifies how many CGs to create
},
"containerGroupProfiles": [
{
"resource": {
"id": "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ContainerInstance/containerGroupProfiles/{{cgProfile1}}"
}
}
]
}
}
NGroups 機能概要
- ローリング更新と手動更新の両方を提供する
- クロス ゾーン コンテナー グループを管理する
- マネージド ID のサポート。
- ロード バランサーとアプリケーション ゲートウェイを追加してコンテナー グループ間のトラフィックを管理する
- 異なるコンテナー グループ プロファイルを使用してコンテナー グループを管理する
- コンテナー グループのアタッチとデタッチ
NGroups API
NGroups は CG プロファイルを参照し、その他の関連するプロパティと機能を追加します。 例:
- 作成またはスケールアウトする CG の必要な数
- 仮想ネットワーク使用時に CG がデプロイされるサブネット
- CG へのネットワーク イングレスを提供する Load Balancer または Application Gateway
NGroups は、ACI ARM API を呼び出して各 CG を作成および管理します。 同じ ARM API を使用するため、NGroups によって作成された CG と顧客が直接作成した CG の間に違いはありません。 これらの API エクスペリエンスはまったく同じです。
NGroups リソースの更新
要件が変わるたびに、NGroup とその CG を更新し続ける必要があります。 NGroups を更新するための更新モードが 2 つあります (手動 (既定のオプション) とローリング)。
cgprofile1 から cgprofile2 に CG プロファイル参照を更新する基本的な例を考えてみましょう。
- 手動モードでは、cgprofile2 への参照を更新し、NGroups への UPDATE PUT 要求を送信します。
NGroups には、この新しい CG プロファイル参照が格納されます。 ただし、この参照では既存の CG は更新されません。 既存の CG は現在実行中であり、それらに影響はありません。 ただし、NGroups がスケールアウトされると、cgprofile2 を使用して CG が作成されます。
- cgprofile2 を使用して既存の CG を更新する方法
既存の CG を新しい CGProfile で更新するには、更新する CG の明示的な一覧を使用して "manual update" コマンドを発行します。 このコマンドは、リストで指定された CG のみを更新します。 CG の更新には、ACI の PUT CG API の呼び出しが含まれます。 この一覧で指定されていない CG は、cgprofile1 で引き続き実行されます。
このモードにより、CG を選択的に更新する柔軟性が得られ、運用ワークロードへの影響を完全に制御できます。
ローリング モードでは、cgprofile2 への参照を更新して UPDATE NGroups コマンドを発行すると、既存の CG が cgprofile2 で更新されます。 既存の CG への更新は、小さなバッチで行われます (一度にすべてではない)。 これにより、更新中に使用できない可能性のある CG の割合がごくわずかになるため、確実にワークロードへの影響が最小限に抑えられます。
NGroups API を使用して、バッチ サイズやその他の関連するローリング更新モードの設定を構成できます。
NGroups を試す
NGroups での作業の前提条件
現在サポートされている API バージョンは 2024-09-01-preview です。
サブスクリプションの
Microsoft.ContainerInstace/NGroupsPreview
に機能を登録します。機能フラグがサブスクリプションに適用されたら、サブスクリプションの
Microsoft.ContainerInstance
にリソース プロバイダーを登録します。
Note
api-version - 2024-09-01-preview 以降をプレビューに使用します。
ヒント
NGroups API の最新情報については、Azure Container Instance Swagger をフォローしてください。 Container Instance NGroups Swagger - 2024-11-01-preview
これらの前提条件が満たされていない場合、要求は失敗し、NGroups リソースの種類は認識されません。
ARM テンプレートのサンプル
CG プロファイルの作成: ContainerGroupProfile-Sample.json CGProfile を使用したゾーン NGroup の作成: NGroups-Zonal-Sample.json
顧客は、JSON ビューのコンテナー グループの orchestratorId プロパティを確認することで、コンテナー グループが NGroups リソースに関連付けられているかどうかを確認できます。 orchestratorId は、関連する NGroups ARM リソース ID を表します。
攻略ガイド
ローリング アップデートを実行する
ローリング アップデート機能を使用すると、NGroups のダウンタイムなしですべての CG を新しいバージョンに自動的に更新できます。 ローリング アップデートのドキュメント「NGroups ローリング アップデート」を参照してください。
リージョン (ゾーン/非ゾーン) NGroups を作成する
最初に CG プロファイルを作成します。 サンプル CG プロファイルを次に示します。 現在サポートされている API バージョンは 2024-09-01-preview です。
{
"properties": {
"sku": "Standard",
"containers": [
{
"name": "container1",
"properties": {
"image": "nginx",
"ports": [
{
"protocol": "TCP",
"port": 80
}],
"resources": {
"requests": {
"memoryInGB": 2.0,
"cpu": 1.0
}
}
}
}
],
"restartPolicy": "Always",
"shutdownGracePeriod": "PT1H",
"ipAddress": {
"ports": [
{
"protocol": "TCP",
"port": 80
}],
"type": "Public"
},
"timeToLive": "PT1H",
"osType": "Linux"
}
次に、プロパティの外部にゾーンを追加するか、ゾーン配列を空のままにして、ゾーン/非ゾーンの NGroups を作成できます。
{
"properties": {
"elasticProfile": {
"desiredCount": 5
},
"containerGroupProfiles": [
{
"resource": {
"id": "[resourceId('Microsoft.ContainerInstance/containerGroupProfiles', parameters('cgProfileName'))]"
}
}
]
},
"zones": [ "1", "2", "3" ]
}
NGroups が desiredCount プロパティを設定してスケールアウトされると、CG は指定されたすべてのゾーンに均等に分散されます。 1 つのゾーンがダウンしても、NGroup の残りの CG は引き続き他のゾーンで実行されるため、アプリケーションは引き続き使用できます。
ACI CG API を使用して NGroups リソースによって作成された CG を直接更新できますか?
はい。お客様は、Azure Container Instances (ACI) API を使用してコンテナー グループ (CG) を直接更新することができます。 ACI コンテナー グループについて詳しく理解し、関連する API オプションを調べるには、「Azure Container Instances のコンテナー グループ」を参照してください。
コンテナー グループを作成または更新する場合、NGroups は同じ ACI API に依存します。 つまり、お客様はこれらの API を使用して、追加の構成を行わずに、必要に応じて特定のコンテナー グループを更新できます。
技術的な機能と制約
一連のゾーン ({ "1", "2" } など) を使用して NGroups リソースを作成すると、ゾーンを削除することはできません。 ただし、新しいゾーンをリストに追加することはできます。 例: { "1", "2", "3" }
指定したゾーンがダウンしている場合、CG を作成するための NGroups 操作全体が失敗します。 ゾーンがバックアップされたら、要求を再試行します。 もう 1 つのオプションは、失敗した CG を削除することです。
スケールダウン中、NGroups は、AZ スプレッドを常に維持するとは限らないインスタンスをランダムに削除します。 ただし、後続のスケールアウト操作では、常に AZ スプレッドの再調整が試みられます。
AZ スプレッドはスポット コンテナーではサポートされていません。 このような要件がある場合は、ACI チームに連絡してください。
インフラストラクチャ/プラットフォームの更新による可用性の影響に関するページも参照してください。
プレフィックスを持つ NGroup CG を作成する
お客様は、GUID 名だけでなくプレフィックスを持つ NGroup CG を作成できます。
"properties": {
"elasticProfile": {
"desiredCount": 2,
"containerGroupNamingPolicy": {
"guidNamingPolicy": {
"prefix": "cg-"
}
}
},
これは、1 つのリソース グループに複数の NGroup があり、各 NGroup に属する CG を区別する場合に便利です (たとえば、Azure portal ビュー)。 また、スケールアウト操作ごとに変更して、1 回の操作でまとめてスケールアウトされた CG を識別することもできます。
システム割り当てとユーザー割り当ての両方のマネージド ID を持つ NGroups を作成する
“location”: “{{location}}”
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{{userAssignedIdentity1}}": {},
"/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{{userAssignedIdentity2}}": {}
}
NGroup からいくつかの CG を削除した場合、NGroup は新しい CG を使用して自身を再構築して目的の数を維持できますか?
はい。properties.elasticProfile.maintainDesiredCount bool プロパティを true に設定できます。
NGroups から削除またはデタッチされるすべての CG に対して新しい CG が作成されます。 NGroups の desiredCount プロパティを設定値のままにしようとします。
これは、ワークロード シナリオのためにプールから CG を取り除くと自動的に補充されるプールとして NGroups を使用する場合に便利です。
これは Null が許容される bool プロパティです。 後続の NGroups PUT/update 呼び出しで省略した場合、false にリセットされません。 リセットするには、明示的に false に設定する必要があります。 null/false の場合、および CG が NGroups から削除またはデタッチされると、NGroups の desiredCount プロパティはそれに応じて減少します。
CG 名、NGroups ID、およびその他のメタデータをコンテナーに反映するにはどうすればよいですか?
現時点では、CG 名とオーケストレーター ID (ARM リソース ID) のみを公開しています。 将来的には、他の関連するプロパティも考慮される可能性があります。 これら 2 つのプロパティは、コンテナー環境変数として表示されます。
コンテナーでこれらの環境変数を取得するには、NGroups レベルでこれらのタグを指定します
tags: {
“metadata.container.environmentVariable.containerGroupName”: true,
“metadata.container.environmentVariable.orchestratorId”: true,
:
: // other NGroups tags you may have
:
}
NGroups は、これらのタグを特殊なものとして認識し、次に示すように、必要な環境変数を各コンテナーに伝達します。
インフラストラクチャ/プラットフォームの更新による可用性の影響はどの程度ですか?
より高い可用性を提供するワークロード (たとえば、NGroup が複数の AZ に分散) の場合、複数の AZ が同時にダウンする可能性は低くなります。 これは、基になる Azure インフラストラクチャ (ホスト マシン、仮想マシン スケール セットなど) が更新された (インフラストラクチャの更新またはプラットフォームの更新と呼ばれます) ときに発生する可能性があります。
この更新は AZ によって行われ、AZ 間での自動的な調整はほとんど行われません。 調整は手動で追跡し、ベスト エフォートで行います。
そのため、偶然にプラットフォームの更新が 2 つ以上の AZ で同時に行われる場合、これらの AZ 間の CG が同時にダウンし、NGroup が使用できなくなる可能性があります。
NGroups を使用した機密コンテナーを使用する方法
NGroups では、機密 ACI コンテナー グループがサポートされています。 機密インスタンスは、コンテナー グループ プロファイル内で次のプロパティを使用して定義されます。
{
"location": "{{location}}",
"properties": {
"sku": "Confidential",
"confidentialComputeProperties": {
"ccePolicy": "<base 64 encoded policy>"
},
"containers": [ ... ],
"restartPolicy": "Always",
"shutdownGracePeriod": "PT1H",
"ipAddress": { ... },
"timeToLive": "PT1H",
"osType": "Linux"
}
}
機密コンテナーの ACI ドキュメント「チュートリアル: Azure Container Instances で機密コンテナーのデプロイを準備する」を参照してください。
サンプル
コンテナー グループ プロファイルのサンプル
{
"properties": {
"sku": "Standard",
"containers": [
{
"name": "web",
"properties": {
"image": "mcr.microsoft.com/azuredocs/aci-helloworld",
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"targetState": "Running",
"resources": {
"requests": {
"memoryInGB": 1,
"cpu": 1
}
}
}
}
],
"restartPolicy": "Always",
"shutdownGracePeriod": "PT2H",
"ipAddress": {
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"type": "Public"
},
"osType": "Linux",
"revision": 1
},
"id": "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ContainerInstance/containerGroupProfiles/{{cgProfile1}}",
"name": "{{cgProfile1}}",
"type": "Microsoft.ContainerInstance/containerGroupProfiles",
"location": "{{location}}"
}
ゾーンを含む NGroup のサンプル
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"apiVersion": {
"type": "string",
"maxLength": 32
},
"NGroupsName": {
"type": "string",
"maxLength": 64
},
"containerGroupProfileName": {
"type": "string",
"maxLength": 64
},
"resourceTags": {
"type": "object"
},
"desiredCount": {
"type": "int"
}
},
"variables": {
"description": "This ARM template can be parameterized for a basic CRUD scenario for NGroups. It is self contained with cgProfile and NGroups resource",
"cgProfileName": "[parameters('containerGroupProfileName')]",
"NGroupsName": "[parameters('NGroupsName')]",
"resourcePrefix": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/')]"
},
"resources": [
{
"apiVersion": "[parameters('apiVersion')]",
"type": "Microsoft.ContainerInstance/containerGroupProfiles",
"name": "[variables('cgProfileName')]",
"location": "[resourceGroup().location]",
"properties": {
"sku": "Standard",
"containers": [
{
"name": "web",
"properties": {
"image": "mcr.microsoft.com/azuredocs/aci-helloworld",
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"resources": {
"requests": {
"memoryInGB": 1.0,
"cpu": 1.0
}
}
}
}
],
"restartPolicy": "Always",
"ipAddress": {
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"type": "Public"
},
"osType": "Linux"
}
},
{
"apiVersion": "[parameters('apiVersion')]",
"type": "Microsoft.ContainerInstance/NGroups",
"name": "[variables('NGroupsName')]",
"tags": "[parameters('resourceTags')]",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.ContainerInstance/containerGroupProfiles/', variables('cgProfileName'))]"
],
"identity": {
"type": "systemAssigned"
},
"properties": {
"elasticProfile": {
"desiredCount": "[parameters('desiredCount')]",
"maintainDesiredCount": true
},
"containerGroupProfiles": [
{
"resource": {
"id": "[concat(variables('resourcePrefix'), 'Microsoft.ContainerInstance/containerGroupProfiles/', variables('cgProfileName'))]"
}
}
]
},
"zones": [ "1", "2", "3" ]
}
]
}