Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контейнеры стали стандартом для упаковки, развертывания и управления облачными приложениями, и эффективное управление этими контейнерами столь же важно, как и запуск самих приложений. Экземпляры контейнеров Azure (ACI) — это гибкая и масштабируемая бессерверная вычислительная служба, которая позволяет запускать контейнерные приложения без управления инфраструктурой.
NGroups предоставляет расширенные возможности для управления несколькими связанными группами контейнеров. Поддерживаемые функции:
- Поддержание нескольких экземпляров
- Последовательные обновления
- Высокий уровень доступности через Зоны доступности (AZs)
- Поддержка управляемых удостоверений
- Поддержка конфиденциальных контейнеров
- Балансировка нагрузки
- Перебалансировка зоны (Любая зона)
Функция NGroups основана на ACI, обеспечивая безопасные, высокодоступные группы контейнеров и поддерживающие набор функций ACI.
Дополнительные сведения об экземплярах контейнеров Azure см. в статье "Что такое экземпляры контейнеров Azure?"
Архитектура NGroups высокого уровня
С Azure Container Instances клиентам необходимо вручную создавать и поддерживать каждую отдельную группу контейнеров. NGroups предлагает более простое решение для создания, обновления и управления экземплярами группы контейнеров N с помощью одного вызова API.
Создание ресурса NGroups — это двухэтапный процесс.
Создайте профиль группы контейнеров (CGProfile), который служит шаблоном. В CGProfile пользователь указывает свойства CG, применяемые ко всем группам CG, созданным NGroups.
Создайте ресурс NGroups. Можно указать желаемое количество (число требуемых контейнерных групп) и ссылку на профиль группы контейнеров вместе с другими важными свойствами.
NGroups ссылается на этот профиль группы контейнеров, а затем вызывает API ACI для создания и обновления CG со свойствами, упомянутыми в CGProfile.
Основные понятия
Профиль группы контейнеров (профиль CG)
Для управления несколькими группами контейнеров может потребоваться крупномасштабное облачное приложение. По состоянию на сегодняшний день для запуска нескольких групп CG (группы контейнеров) клиенты должны предоставлять соответствующие свойства, такие как образы контейнеров, политика перезапуска и другие свойства каждый раз. Это может привести к ограничению, дублированию усилий и управленческим затратам.
Чтобы устранить эту проблему, NGroups представила профили групп контейнеров. Профиль группы контейнеров (CGProfile) служит шаблоном для создания групп контейнеров с одинаковым набором свойств.
Ниже приведены некоторые распространенные свойства, которые можно указать в профиле группы контейнеров:
- osType (пример: Linux, Windows)
- Контейнеры. Имя образа, память, ЦП и т. д.
- политика перезапуска
- Протокол 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 клиенты могут указывать и другие свойства, такие как число CGs, параметры обновления (вручную или последовательное обновление), балансировщики нагрузки, подсети и другие соответствующие свойства, которые они хотят связать с CG под ресурсом NGroups.
Примечание.
Необходимо создать профиль CG перед созданием ресурса NGroups. Так как профиль 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
По мере изменения требований нам потребуется продолжать обновлять наши NGroups и их CG. Существует два режима обновления, с помощью которых можно обновить NGroups — вручную (параметр по умолчанию) и Rolling.
Рассмотрим базовый пример обновления ссылки профиля CG с cgprofile1 на cgprofile2:
- В ручном режиме мы обновим ссылку на cgprofile2 и отправим запрос UPDATE PUT в NGroups:
NGroups хранит эту новую ссылку на профиль CG. Но он не обновляет существующие CG с этой ссылкой. Существующие группы доступности в настоящее время работают, и на них нет никакого влияния. Однако при горизонтальном масштабировании NGroups создаются группы CG с помощью cgprofile2.
- Как обновить существующие CG с помощью cgprofile2?
Чтобы обновить существующие CG с новым CGProfile, мы выдаем команду ручного обновления с четким списком CG, которые мы хотим обновить. Эта команда обновляет только те CG, которые указаны в её списке. Обновление CG предполагает вызов API PUT CG от 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 Container Instance, чтобы быть в курсе информации об 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 Container Instances
При создании или обновлении групп контейнеров NGroups использует те же API ACI. Это означает, что клиенты могут использовать эти API для обновления определенных групп контейнеров при необходимости без дополнительных конфигураций.
Технические возможности и ограничения
После создания ресурса NGroups с набором зон (например, { "1", "2" }) зоны нельзя удалить. Однако в список можно добавить новую зону. Например, { "1", "2", "3" }
Если указанная зона отключена, то общая операция NGroups по созданию CG завершается сбоем. Повторите запрос после восстановления работы зоны. Другим вариантом может быть удаление неудачных CG.
Во время уменьшения масштаба NGroups случайным образом удаляет экземпляры, которые не всегда могут поддерживать распространение 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 логическое значение в true.
Он создает новый CG для каждого CG, который удаляется или отсоединяется от NGroups. Он пытается поддерживать свойство desiredCount у NGroups на его заданном значении.
Это полезно, если вы хотите использовать NGroups в качестве пула, который автоматически пополняется при изъятии CG из пула для сценариев вашей рабочей нагрузки.
Это свойство типа bool, допускающее значение null. Если он не указан для последующих вызовов NGroups PUT/update, он не сбрасывается на false. Чтобы сбросить, необходимо явно задать для него значение false. Если значение равно null/false, при удалении или отключении CG из NGroups свойство desiredCount для 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, распределенные по нескольким зонам доступности), все еще существует малая вероятность одновременного отказа CG в более чем одной зоне доступности. Это может произойти, когда базовая инфраструктура Azure (хост-компьютеры, Масштабируемые наборы виртуальных машин и т. д.) проходит обновление (называемое обновлением инфраструктуры или обновлением платформы).
Это обновление выполняется для каждой 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" ]
}
]
}