Сведения о NGroups (предварительная версия)
Контейнеры стали стандартом для упаковки, развертывания и управления облачными приложениями, а также эффективного управления этими контейнерами, как и сами приложения. Экземпляры контейнеров Azure (ACI) — это гибкая и масштабируемая бессерверная вычислительная служба, которая позволяет запускать контейнерные приложения без управления инфраструктурой.
NGroups предоставляет расширенные возможности для управления несколькими связанными группами контейнеров. Поддерживаемые функции:
- Обслуживание нескольких экземпляров
- Последовательные обновления
- Высокий уровень доступности через Зоны доступности (AZs)
- Поддержка управляемых удостоверений
- Поддержка конфиденциальных контейнеров
- Балансировка нагрузки
- Перебалансирование зоны (Zone Any)
Функция NGroups основана на ACI, обеспечивая безопасные, высокодоступные группы контейнеров и поддерживающие набор функций ACI.
Дополнительные сведения о Экземпляры контейнеров Azure см. в статье "Что такое Экземпляры контейнеров Azure?"
Архитектура NGroups высокого уровня
При использовании Экземпляры контейнеров Azure клиентам необходимо создать и сохранить каждую отдельную группу контейнеров вручную. NGroups предлагает более простое решение для создания, обновления и управления экземплярами группы контейнеров N с помощью одного вызова API.
Создание ресурса NGroups — это двухэтапный процесс.
Создайте профиль группы контейнеров (CGProfile), который служит шаблоном. В CGProfile пользователь указывает свойства CG, применяемые ко всем группам CG, созданным NGroups.
Создайте ресурс NGroups. Можно указать требуемое количество (количество обязательных групп CG) и ссылку на профиль группы контейнеров вместе с другими соответствующими свойствами.
NGroups ссылается на этот профиль группы контейнеров, а затем вызывает API ACI для создания и обновления CG со свойствами, упомянутыми в CGProfile.
Основные понятия
Профиль группы контейнеров (профиль CG)
Для управления несколькими группами контейнеров может потребоваться крупномасштабное облачное приложение. По состоянию на сегодняшний день для запуска нескольких групп CG (группы контейнеров) клиенты должны предоставлять соответствующие свойства, такие как образы контейнеров, политика перезапуска и другие свойства каждый раз. Это может привести к регулированию, дублированию усилий и затратам на управление.
Чтобы устранить эту проблему, NGroups представила профили групп контейнеров. Профиль группы контейнеров (CGProfile) служит шаблоном для создания групп контейнеров с одинаковым набором свойств.
Ниже приведены некоторые распространенные свойства, которые можно указать в профиле группы контейнеров:
- osType (пример: Linux, Windows)
- Контейнеры. Имя образа, память, ЦП и т. д.
- 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 ссылается на ресурс профиля группы контейнеров и использует его для создания экземпляров N похожих CG. В ресурсе NGroups клиенты также могут указывать другие свойства, включая, но не ограничено числом CG, настроек обновления (вручную или последовательного обновления), балансировщиками нагрузки, подсетями и другими соответствующими свойствами, которые они хотят связать с группами CG в ресурсе NGroups.
Примечание.
Перед созданием ресурса NGroups необходимо создать профиль CG. Так как профиль CG является ресурсом ARM, он имеет собственные API ARM. Перед созданием ресурса NGroups необходимо создать профиль CG.
Преимущества ссылок на профиль группы контейнеров
Профиль группы контейнеров — это отдельный ресурс из NGroups. Клиенты могут создавать несколько NGroups, которые могут ссылаться на один профиль группы контейнеров. Кроме того, она гарантирует согласованность во всех NGroups, ссылающихся на один профиль группы контейнеров, и избегает дублирования.
Можно также создать один объект ACI CG из профиля 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 в свою очередь вызывает API ACI ARM для создания и управления каждым CG. Так как он использует те же API ARM, нет разницы между группами CG, созданными NGroups и группами CG, созданными непосредственно клиентом. У них есть тот же интерфейс API.
Обновление ресурса NGroups
По мере изменения требований нам потребуется продолжать обновлять группы NGroup и ее группы CG. Существует два режима обновления, с помощью которых можно обновить NGroups — вручную (параметр по умолчанию) и Rolling.
Рассмотрим базовый пример обновления ссылки профиля CG с cgprofile1 на cgprofile2:
- В ручном режиме мы обновим ссылку на cgprofile2 и отправим запрос UPDATE PUT в NGroups:
NGroups хранит эту новую ссылку на профиль CG. Но он не обновляет существующие группы CG с этой ссылкой. Существующие группы доступности в настоящее время работают и не влияют на них. Однако при горизонтальном масштабировании NGroups создаются группы CG с помощью cgprofile2.
- Как обновить существующие группы CG с помощью cgprofile2?
Чтобы обновить существующие группы CG с новым CGProfile, мы создадим команду обновления вручную с явным списком групп CG, которые мы хотим обновить. Эта команда обновляет только группы CG, указанные в списке. Обновление CG включает вызов API CG PUT ACI. Группы CG, не указанные в этом списке, продолжают работать с cgprofile1.
Этот режим обеспечивает гибкость в выборочном обновлении групп CG и обеспечивает полный контроль над воздействием на рабочие нагрузки в рабочей среде.
В режиме скользящей передачи при обновлении ссылки на cgprofile2 и выдаче команды UPDATE NGroups существующие CG обновляются с помощью cgprofile2. Обновление существующих групп CG происходит в небольших пакетах (а не сразу). Это гарантирует минимальное влияние на рабочую нагрузку, так как во время обновления может быть недоступно только небольшое количество групп CG.
Мы можем настроить размер пакета и другие связанные параметры режима обновления с помощью API NGroups.
Попробуйте использовать NGroups
Предварительные требования для работы с NGroups
В настоящее время поддерживаемая версия API — 2024-09-01-preview.
Зарегистрируйте функцию
Microsoft.ContainerInstace/NGroupsPreview
в подписках.После применения флагов компонентов к подписке зарегистрируйте поставщика
Microsoft.ContainerInstance
ресурсов в подписках.
Примечание.
Используйте api-версию — 2024-09-01-preview и далее для предварительной версии .
Совет
Следуйте инструкциям в Swagger экземпляра контейнеров Azure, чтобы получить актуальные сведения об API NGroups. NGroups Swagger для экземпляра контейнера — 2024-11-01-preview
Если эти предварительные требования не выполнены, запросы завершаются ошибкой и тип ресурса NGroups не распознается.
Примеры шаблонов ARM
Создание профиля CG: ContainerGroupProfile-Sample.json создание зональных NGroups с помощью CGProfile: NGroups-Zonal-Sample.json
Клиенты могут узнать, связана ли группа контейнеров с ресурсом NGroups, проверив свойство orchestratorId группы контейнеров в представлении JSON. OrchestratorId представляет связанный идентификатор ресурса NGroups ARM.
Практическое руководство
Выполнение последовательного обновления
Мы можем использовать функцию скользящего обновления для автоматического обновления всех групп CG до более новой версии без простоя NGroups. См. сводную документацию по обновлению: NGroups Rolling update.
Создание региональных (зональных или незональных) 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 масштабируется путем задания требуемого свойстваCount, группы CG распределяются равномерно по всем указанным зонам. Если одна зона исчезнет, приложение остается доступным, так как остальные группы групп NGroup продолжают работать в других зонах.
Можно ли обновить CG, созданный ресурсом NGroups непосредственно через API ACI CG?
Да, клиенты имеют гибкость для обновления групп контейнеров (CG) непосредственно с помощью API Экземпляры контейнеров Azure (ACI). Для более глубокого понимания групп контейнеров ACI и изучения связанных параметров API ознакомьтесь с этим ресурсом: группы контейнеров в Экземпляры контейнеров Azure
При создании или обновлении групп контейнеров NGroups использует те же API ACI. Это означает, что клиенты могут использовать эти API для обновления определенных групп контейнеров при необходимости без дополнительных конфигураций.
Технические возможности и ограничения
После создания ресурса NGroups с набором зон (например, { "1", "2" }) зоны нельзя удалить. Однако в список можно добавить новую зону. Например, { "1", "2", "3" }
Если указанная зона отключена, общая операция NGroups для создания групп CG завершается сбоем. Повторите запрос после резервного копирования зоны. Другим вариантом является удаление неудачных групп CG.
Во время уменьшения масштаба NGroups случайным образом удаляет экземпляры, которые не всегда могут поддерживать распространение AZ. Однако последующие операции горизонтального масштабирования всегда пытаются перебалансировать распространение AZ.
Az spread не поддерживается с контейнерами Spot. Если у вас есть такое требование, обратитесь к команде ACI.
См. также: влияние доступности из-за обновлений инфраструктуры и платформы.
Создание групп NGroups CG с префиксом
Клиенты могут создавать группы NGroups CG с префиксом вместо просто имен GUID:
"properties": {
"elasticProfile": {
"desiredCount": 2,
"containerGroupNamingPolicy": {
"guidNamingPolicy": {
"prefix": "cg-"
}
}
},
Это может быть полезно при наличии нескольких NGroup в одной группе ресурсов и необходимости различать группы CG, принадлежащие каждой группе NGroup (например, в представлении портал 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}}": {}
}
Если удалить некоторые группы CG из NGroups, можно ли перестроить NGroups с новыми группами CG для поддержания требуемого количества?
Да, можно задать для свойства properties.elasticProfile.maintainDesiredCount bool значение true.
Он создает новый CG для каждого CG, который удаляется или отсоединяется от NGroups. Он пытается сохранить требуемое свойство NGroups в заданном значении.
Это полезно, если вы хотите использовать NGroups в качестве пула , который автоматически обновляется при удалении групп CG из пула для сценариев рабочей нагрузки.
Это свойство bool, допускаемое значение null. Если он не указан для последующих вызовов NGroups PUT/update, он не сбрасывается на false. Чтобы сбросить, необходимо явно задать для него значение false. Если значение равно null/false, а при удалении или отключении CG из NGroups необходимое свойствоCount для NGroups уменьшается соответствующим образом.
Разделы справки получить имя 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), в нескольких группах доступности по-прежнему существует низкая вероятность снижения групп безопасности в нескольких группах доступности одновременно. Это может произойти, когда базовая инфраструктура Azure (хост-компьютеры, Масштабируемые наборы виртуальных машин и т. д.) проходит обновление (называемое обновлением инфраструктуры или обновлением платформы).
Это обновление выполняется AZ от AZ с не очень автоматизированной координацией по AZ. Координация отслеживается вручную и лучше всего.
Таким образом, если по возможности обновление платформы происходит одновременно через 2 или более AZ, то группы CG между этими AZ могут быть одновременно отключены, что приводит к недоступности для групп 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" ]
}
]
}