關於 NGroups (預覽)
容器成為封裝、部署和管理雲端應用程式的標準,並有效地管理這些容器,就像執行應用程式本身一樣重要。 Azure 容器執行個體 (ACI) 是彈性且可調整的無伺服器運算服務,可讓您在不管理基礎結構的情況下執行容器化應用程式。
NGroups 提供您管理多個相關容器群組的進階功能。 支援的功能包括:
- 維護多個實例
- 滾動升級
- 透過 可用性區域 的高可用性 (AZ)
- 受控識別支援
- 機密容器支援
- 負載平衡
- 區域重新平衡(區域任何)
NGroups 功能是以ACI為基礎建置,確保容器群組安全、高可用性,並支援ACI的功能集。
如需 Azure 容器執行個體 的相關信息,請參閱:什麼是 Azure 容器執行個體?
NGroups 高階架構
透過 Azure 容器執行個體,客戶必須手動建立和維護每個個別的容器群組。 NGroups 提供更簡單的解決方案,可透過單一 API 呼叫來建立、更新和管理 N 個容器群組實例。
建立 NGroups 資源是兩個步驟的程式。
建立 容器群組配置檔 (CGProfile),做為範本。 在 CGProfile 中,使用者指定 NGroups 所建立之所有 CG 上套用的 CG 屬性。
建立 NGroups 資源。 您可以提供所需的計數(所需的 CG 數目),以及容器群組配置文件的參考以及其他相關屬性。
NGroups 會參考此容器群組配置文件,然後呼叫 ACI API,以使用 CGProfile 中提及的屬性來建立/更新 CG。
概念
容器群組設定檔 (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 相關聯的其他相關屬性。
注意
建立 NGroups 資源之前,必須先建立 CG 配置檔。 由於 CG 配置檔是 ARM 資源,因此有自己的 ARM API。 建立 NGroups 資源之前,必須先建立 CG 配置檔。
參考容器群組配置檔的優點
容器群組配置檔是與 NGroups 不同的資源。 客戶可以建立多個可參考相同容器群組配置檔的 NGroup。 它也保證所有參考單一容器群組配置檔的 NGroup 之間的一致性,並避免重複。
您也可以從 CG 設定檔建立單一 ACI CG。 它可讓您快速從原型移至生產模式。
以下是具有受控識別和區域之 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 功能醒目提示
- 提供滾動和手動更新
- 管理跨區域容器群組
- 支援受控識別
- 新增負載平衡器和應用程式閘道來管理跨容器群組的流量
- 使用不同的容器群組配置檔管理容器群組
- 附加和中斷連結容器群組
NGroups API
NGroups 會參考 CG 配置檔,並新增其他相關的屬性和功能。 範例:
- 建立或相應放大所需的 CG 計數
- 使用虛擬網路時部署 CG 的子網
- 負載平衡器或 應用程式閘道,以提供對 CG 的網路輸入
NGroups 接著會叫用 ACI ARM API 來建立和管理每個 CG。 因為它使用相同的ARM API,所以 NGroups 所建立的 CG 與客戶直接建立的 CG 之間並無差異。 它們有完全相同的 API 體驗。
更新 NGroups 資源
隨著需求變更,我們需要持續更新 NGroups 及其 CG。 有兩種更新模式可以更新 NGroups – 手動 (預設選項) 和 滾動。
請考慮將 cgprofile1 的 CG 設定文件參考更新為 cgprofile2 的基本範例:
- 在手動模式中,我們會更新 cgprofile2 的參考,並將 UPDATE PUT 要求傳送至 NGroups:
NGroups 會儲存這個新的 CG 配置文件參考。 但不會使用此參考來更新現有的 CG。 現有的 CG 目前正在執行,而且不會影響它們。 不過,當 NGroups 相應放大時,會使用 cgprofile2 建立 CG。
- 如何使用 cgprofile2 更新現有的 CG?
若要使用新的 CGProfile 更新現有的 CG,我們會發出 手動更新 命令,其中包含我們想要更新的明確 CG 清單。 此命令只會更新其清單中指定的 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
。
注意
使用 api-version - 2024-09-01-preview 和更新版本預覽。
提示
請遵循 Azure Container Instance Swagger 取得 NGroups API 的最新資訊。 容器實例 NGroups Swagger - 2024-11-01-preview
如果不符合這些必要條件,要求會失敗,且無法辨識 NGroups 資源類型。
ARM 範例
建立 CG 配置檔: ContainerGroupProfile-Sample.json 使用 CGProfile 建立區域性 NGroups: NGroups-Zonal-Sample.json
客戶可以藉由檢查 JSON 檢視下的容器群組 OrchestratorId 屬性,查看容器群組是否與 NGroups 資源相關聯。 orchestratorId 代表相關聯的 NGroups ARM 資源標識符。
操作指南
執行滾動更新
我們可以使用滾動更新功能,將所有 CG 自動更新為較新版本,而不會停機 NGroups。 請參閱滾動更新檔: 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"
}
接下來,您可以新增屬性以外的區域或讓區域陣列空白,以建立 Zonal/Non-Zonal NGroups。
{
"properties": {
"elasticProfile": {
"desiredCount": 5
},
"containerGroupProfiles": [
{
"resource": {
"id": "[resourceId('Microsoft.ContainerInstance/containerGroupProfiles', parameters('cgProfileName'))]"
}
}
]
},
"zones": [ "1", "2", "3" ]
}
設定其 desiredCount 屬性來相應放大 NGroups 時,CG 會平均分散到所有指定的區域。 如果某個區域關閉,應用程式會維持可用狀態,因為 NGroups 的剩餘 CG 會繼續在其他區域中執行。
我可以透過 ACI CG API 直接更新 NGroups 資源所建立的 CG 嗎?
是,客戶可以使用 Azure 容器執行個體 (ACI) API,彈性地直接更新容器群組 (CG)。 若要深入瞭解 ACI 容器群組並探索相關的 API 選項,請參閱此資源:Azure 容器執行個體 中的容器群組
建立或更新容器群組時,NGroups 依賴相同的 ACI API。 這表示客戶可以使用這些 API 視需要更新特定容器群組,而不需要任何額外的設定。
技術功能和條件約束
一旦使用一組區域建立 NGroups 資源(例如 { “1”、“2” }),就無法移除區域。 不過,新的區域可以新增至清單。 例如, { “1”, “2”, “3” }
如果指定的區域已關閉,則建立 CG 的整體 NGroups 作業會失敗。 備份區域之後,請重試要求。 另一個選項是刪除失敗的 CG。
在相應減少期間,NGroups 會隨機刪除實例,而實例不一定會維持 AZ 分散。 不過,後續的向外延展作業一律會嘗試重新平衡 AZ 分散。
Spot 容器不支援 AZ 分散。 如果您有這類需求,請連絡 ACI 小組。
另請參閱: 基礎結構/平臺更新所造成的可用性影響。
建立具有前置詞的 NGroups CG
客戶可以使用前置詞來建立 NGroups CG,而不只是 GUID 名稱:
"properties": {
"elasticProfile": {
"desiredCount": 2,
"containerGroupNamingPolicy": {
"guidNamingPolicy": {
"prefix": "cg-"
}
}
},
當您在單一資源群組中有多個 NGroup,且想要區分屬於每個 NGroup 的 CG 時,這非常有用(例如,在 Azure 入口網站 檢視中)。 您也可以針對每個向外延展作業變更它,以識別在一個作業中一起相應放大的 CG。
使用系統指派和使用者指派的受控識別建立 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}}": {}
}
如果我從 NGroups 刪除某些 CG,NGroups 是否可以使用新的 CG 自行重建,以維持其所需的計數?
是,您可以將 properties.elasticProfile.maintainDesiredCount bool 屬性設定為 true。
它會為每個從 NGroups 刪除/中斷連結的 CG 建立新的 CG。 它會嘗試將 NGroups 的 desiredCount 屬性維持為其設定值。
當您想要使用 NGroups 做為 集區時,當您從集 區中取出 CG 時,這會很有用。
它是可為 Null 的 bool 屬性。 如果您省略後續 NGroups PUT/update 呼叫,則不會重設為 false。 若要重設,您必須明確地將它設定為 false。 當它是 null/false,且從 NGroups 刪除/中斷連結 CG 時,NGroups 的 desiredCount 屬性會據以減少。
如何? 取得傳播到容器的 CG 名稱、NGroups 識別碼和其他元數據?
目前,我們只公開 CG 名稱和協調器識別碼(ARM 資源標識符)。 未來可考慮其他相關屬性。 這兩個屬性會顯示為容器環境變數。
若要在容器上取得這些環境變數,請在 NGroups 層級指定這些標記:
tags: {
“metadata.container.environmentVariable.containerGroupName”: true,
“metadata.container.environmentVariable.orchestratorId”: true,
:
: // other NGroups tags you may have
:
}
NGroups 會將這些標籤視為特殊標記,並將所需的環境變數向下傳播至每個容器,如下所示。
由於基礎結構/平臺更新,可用性的影響為何?
對於提供較高可用性的工作負載(例如,NGroups 分散於多個 AZ 中),在多個 AZ 中仍可能會同時降低 CG 的可能性。 當基礎 Azure 基礎結構(主計算機、虛擬機器擴展集 等)進行更新時,可能會發生此情況(稱為基礎結構更新或平臺更新)。
此更新是由 AZ 所完成,在 AZ 之間沒有太多自動化的協調。 協調會手動追蹤並盡最大努力。
因此,如果偶然,平臺更新會在 2 個以上的 AZ 之間同時進行,則跨這些 AZ 的 CG 可以同時關閉,因而導致 NGroups 無法使用。
如何搭配 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 容器執行個體 上的機密容器準備部署
範例
容器群組配置檔範例
{
"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}}"
}
具有區域範例的 NGroups
{
"$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" ]
}
]
}