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

关于 NGroup(预览版)

容器成为打包、部署和管理云应用程序的标准,有效地管理这些容器与运行应用本身一样重要。 Azure 容器实例 (ACI) 是一种灵活且可缩放的无服务器计算服务,可让你在不管理基础结构的情况下运行容器化应用程序。

NGroup 提供用于管理多个相关容器组的高级功能。 其他支持的功能包括:

  • 维护多个实例
  • 滚动升级
  • 通过可用性区域实现高可用性 (AZ)
  • 托管标识支持
  • 机密容器支持
  • 负载均衡
  • 区域重新均衡(任何区域)

NGroup 功能基于 ACI 构建,可确保容器组安全、高度可用,并支持 ACI 的功能集。

有关 Azure 容器实例的信息,请参阅什么是 Azure 容器实例?

NGroup 概要体系结构

显示 NGroup 大致工作流的关系图。

使用 Azure 容器实例,客户需要手动创建和维护每个单独的容器组。 NGroup 提供了一种更简单的解决方案,只需一次 API 调用即可创建、更新和管理 N 个容器组实例。

创建 NGroup 资源涉及两个步骤。

  1. 创建容器组配置文件 (CGProfile) 用作模板。 在 CGProfile 中,用户指定的容器组 (CG) 属性会应用于由 NGroup 创建的所有 CG。

  2. 创建 NGroup 资源。 可以提供所需的计数(所需 CG 数)和对容器组配置文件的引用以及其他相关属性。

NGroup 引用此容器组配置文件,然后调用 ACI API,以便使用 CGProfile 中提到的属性创建/更新 CG。

概念

容器组配置文件 (CG 配置文件)

大规模云应用程序可能需要你管理多个容器组。 到目前为止,为了运行多个容器组 (CG),客户每次都需要提供相关的属性,例如容器映像、重启策略和其他属性。 这可能会产生限制、重复的工作和管理开销。

为了缓解这种担忧,NGroup 引入了容器组配置文件。 容器组配置文件 (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" 
    }     
}

NGroup

NGroup 资源资源提供了一种创建和管理“n”个容器组的方法,该方法包含丰富的操作集。 NGroup 资源引用容器组配置文件资源,并使用该资源创建类似 CG 的 N 个实例。 在 NGroup 资源中,客户还可以指定其他属性,包括但不限于 CG 数量、更新首选项(手动更新或滚动更新)、负载均衡器、子网以及他们希望与 NGroup 资源下的 CG 关联的其他相关属性。

注意

你需要在创建 NGroup 资源之前便创建 CG 配置文件。 由于 CG 配置文件是 ARM 资源,因此它拥有自己的 ARM API。 你需要在创建 NGroup 资源之前便创建 CG 配置文件。

引用容器组配置文件的优点

  • 容器组配置文件是独立于 NGroup 的资源。 客户可以创建多个可以引用同一容器组配置文件的 NGroup。 容器组配置文件还保证所有引用同一容器组配置文件的 NGroup 之间的一致性,并避免重复。

  • 也可以从 CG 配置文件创建单个 ACI CG。 容器组配置文件使你能够快速地从原型转移到生产模式。

以下是一个包含托管标识和区域的 NGroup 资源的示例,该资源引用了容器组配置文件并创建了三个容器组:

{ 
    "location": "{{location}}", 
    "properties": { 
        "elasticProfile": { 
            "desiredCount": 100 // specifies how many CGs to create
        }, 
        "containerGroupProfiles": [ 
            { 
                "resource": { 
                    "id": "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ContainerInstance/containerGroupProfiles/{{cgProfile1}}" 
                } 
            } 
        ] 
    } 
}

NGroup 功能亮点

  • 提供滚动更新和手动更新
  • 管理跨区域容器组
  • 支持托管标识
  • 添加负载均衡器和应用程序网关,以跨容器组管理流量
  • 使用不同的容器组配置文件管理容器组
  • 附加和分离容器组

NGroup API

NGroup 引用 CG 配置文件,并添加其他相关属性和功能。 示例:

  • 要创建和横向扩展的 CG 目标数量
  • 使用虚拟网络时在其中部署 CG 的子网
  • 用于向 CG 提供网络入口的负载均衡器或应用程序网关

而 NGroup 会调用 ACI ARM API 来创建和管理每个 CG。 由于使用相同的 ARM API,因此 NGroup 创建的 CG 与客户直接创建的 CG 之间没有区别。 他们具有相同的 API 体验。

更新 NGroup 资源。

随着要求的变化,我们需要不断更新 NGroup 及其 CG。 有两种更新模式可用于更新 NGroup:手动 (默认选项)和 滚动

请考虑这样一个基本示例,将 CG 配置文件引用从 cgprofile1 更新为 cgprofile2

  • 在手动模式下,我们将更新对 cgprofile2 的引用,并向 NGroup 发送 UPDATE PUT 请求:

NGroup 会存储此新的 CG 配置文件引用, 但它不会使用此引用更新现有 CG。 现有 CG 当前正在运行,并且不会影响它们。 但是,当 NGroup 横向扩展时,系统就会使用 cgprofile2 创建 CG。

  • 如何使用 cgprofile2 更新现有 CG?

若要使用新的 CGProfile 更新现有 CG,需要使用要更新的 CG 的显式列表发出“手动更新”命令。 该命令仅更新其列表中指定的 CG。 更新 CG 涉及调用 ACI 的 PUT CG API。 该列表中未指定的 CG 将继续使用 cgprofile1 运行。

该模式使我们可以灵活且可选择地更新 CG,并对生产工作负荷产生的影响拥有完全控制。

滚动模式下,当我们更新对 cgprofile2 的引用并发出更新 NGroup 命令时,现有 CG 会使用 cgprofile2 进行更新。 对现有 CG 的更新以小批量进行(而不是一次性更新)。 这可确保对工作负载的影响最小,因为在更新期间可能只有少量的 CG 不可用。

我们可以使用 NGroup API 配置批大小和其他相关的滚动更新模式设置。

试用 NGroup

使用 NGroup 的先决条件

当前支持的 API 版本为 2024-09-01-preview

  1. 在订阅中注册功能 Microsoft.ContainerInstace/NGroupsPreview

  2. 将功能标志应用于订阅后,在订阅上注册资源提供程序 Microsoft.ContainerInstance

注意

使用 api-version - 2024-09-01-preview 及更高版本进行预览

提示

请参阅 Azure 容器实例 Swagger 以获取有关 NGroup API 的最新信息。 容器实例 NGroup Swagger - 2024-11-01-preview

如果未满足这些先决条件,则请求会失败,并且无法识别 NGroup 资源类型。

ARM 模板示例

创建 CG 配置文件: ContainerGroupProfile-Sample.json 使用 CGProfile 创建区域 NGroup:NGroups-Zonal-Sample.json

客户可以通过检查 JSON 视图下的容器组 orchestratorId 属性来查看容器组是否关联到 NGroup 资源。 OrchestratorId 表示关联的 NGroup ARM 资源 ID。

显示 OrchestratorId 属性的 NGroup CG ARM JSON 的屏幕截图。

操作指南

执行滚动更新

我们可以使用滚动更新功能将所有 CG 自动更新到较新版本,而不会造成 NGroup 停机。 请参阅滚动更新文档:NGroup 滚动更新

创建区域(区域/非区域)NGroup

首先创建 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" 
    }

接下来,可以通过在属性外部添加区域或将区域数组留空的方式来创建区域/非区域 NGroup。

{ 
    "properties": { 
        "elasticProfile": { 
            "desiredCount": 5 
        }, 
        "containerGroupProfiles": [ 
            { 
                "resource": { 
                    "id": "[resourceId('Microsoft.ContainerInstance/containerGroupProfiles', parameters('cgProfileName'))]" 
                } 
            } 
        ] 
    }, 
    "zones": [ "1", "2", "3" ] 
}

通过设置 desiredCount 属性横向扩展 NGroup 时,CG 均匀分布在所有指定区域。 如果一个区域出现故障,应用程序仍将保持可用状态,因为 NGroup 的剩余 CG 会继续在其他区域中运行。

是否可以直接通过 ACI CG API 更新 NGroup 资源创建的 CG?

可以,客户可以使用 Azure 容器实例 (ACI) API 灵活地直接更新容器组 (CG)。 若要更深入地了解 ACI 容器组并浏览相关的 API 选项,请查看此资源:Azure 容器实例中的容器组

创建或更新容器组时,NGroup 依赖于相同的 ACI API。 这意味着客户可以使用这些 API 根据需要更新特定的容器组,而无需执行任何额外的配置。

技术功能和约束
  • 使用一组区域(例如 { “1”, “2” })创建 NGroup 资源后,无法删除该区域。 但是,可以将新区域添加到该列表中。 例如 { “1”, “2”, “3” }

  • 如果指定的区域已关闭,则创建 CG 的整体 NGroup 操作将失败。 备份区域后再重试请求。 另一种选择是删除失败的 CG。

  • 在纵向缩减期间,NGroup 会随机删除可能并不总是保持 AZ 分布的实例。 但是,后续横向扩展操作会始终尝试重新平衡 AZ 分布。

  • 现成容器不支持 AZ 分布。 如果你存在这样的要求,请联系 ACI 团队。

  • 另请参阅:基础结构/平台更新对可用性的影响

使用前缀创建 NGroup CG

客户可以使用前缀而不是 GUID 名称创建 NGroup CG:

"properties": { 
    "elasticProfile": { 
        "desiredCount": 2,             
        "containerGroupNamingPolicy": { 
            "guidNamingPolicy": { 
                "prefix": "cg-" 
            } 
        } 
    },

在单个资源组中存在多个 NGroup 并且想要区分属于每个 NGroup 的 CG(例如,在 Azure 门户视图中),这种方法就非常实用。 你也可以针对每个横向扩展操作更改 NGroup CG,以标识在一个操作中一起横向扩展的 CG。

可以使用系统分配的托管标识和用户分配的托管标识创建 NGroup

“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 布尔属性设置为 true。

这样,每当有 CG 被删除或从 NGroup 中分离时,系统就会创建一个新的 CG, 以保持 NGroup 的 desiredCount 属性处于其设定值。

当你希望将 NGroup 用作一个池时,该方法非常实用,因为当你因工作负载方案需要从池中移走 CG 时,系统会自动补充新的 CG

该属性是可为空的布尔属性。 如果省略该属性进行后续 NGroup PUT/update 调用,则不会将其重置为 false。 若要将其重置,必须将其显式设置为 false。 如果该属性的设置为 null/false,并且从 NGroup 中删除/分离 CG,则 NGroup 的 desiredCount 属性会相应地减少。

如何获取传播到容器中的 CG 名称、NGroup ID 和其他元数据?

目前,我们仅公开 CG 名称和业务流程协调程序 ID(ARM 资源 ID)。 我们会在将来考虑其他相关属性。 这两个属性显示为容器环境变量。

若要在容器上获取这些环境变量,请在 NGroup 级别指定这些标记

tags: { 
    “metadata.container.environmentVariable.containerGroupName”: true, 
    “metadata.container.environmentVariable.orchestratorId”: true, 
    : 
    : // other NGroups tags you may have 
    : 
}

NGroup 将这些标记理解为特殊标记,并将所需的环境变量向下传播到每个容器,如下所示

Azure 门户中容器资源的屏幕截图,其中显示了包含“ContainerGroupName”和“OrchestratorId”属性的环境变量。

由于基础结构/平台更新,对可用性产生了什么影响?

对于提供更高可用性的工作负荷(例如,跨多个 AZ 分布的 NGroup),CG 仍有可能在多个 AZ 中同时关闭,虽然可能性较低。 当底层 Azure 基础结构(主机、虚拟机规模集等)经历更新(称为基础结构更新或平台更新)时,可能会发生这种情况。

该类更新按 AZ 逐个进行,并且在 AZ 之间没有太多自动化的协调。 协调操作需要手动执行追踪,并且是尽力而为。

因此,如果偶然在 2 个或更多 AZ 之间同时发生平台更新,则这些 AZ 中的 CG 会同时关闭,从而导致 NGroup 不可用。

如何在 NGroup 中使用机密容器

NGroup 支持机密 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}}"
}

具有区域示例的 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" ]
    }
  ]
}