Partager via


À propos de NGroups (préversion)

Les conteneurs sont devenus la norme pour l’empaquetage, le déploiement et la gestion des applications cloud. La gestion efficace de ces conteneurs est aussi cruciale que l’exécution des applications elles-mêmes. Azure Container Instances (ACI) est un service d’informatique serverless flexible et évolutif, qui vous permet d’exécuter des applications conteneurisées sans devoir gérer l’infrastructure.

NGroups vous fournit des fonctionnalités avancées pour la gestion de plusieurs groupes de conteneurs associés. Les fonctionnalités prises en charge sont les suivantes :

  • La maintenance de plusieurs instances
  • Mises à niveau propagées
  • La haute disponibilité par le biais de zones de disponibilité (AZ)
  • Prise en charge des identités managées
  • Prise en charge des conteneurs confidentiels
  • Équilibrage de charge
  • Le rééquilibrage des zones (Zone Any)

La fonctionnalité NGroups s’appuie sur ACI pour garantir que les groupes de conteneurs sont sécurisés et qu’ils offrent une haute disponibilité, et elle prend en charge l’ensemble des fonctionnalités d’ACI.

Pour plus d’informations sur Azure Container Instances, consultez Présentation d’Azure Container Instances.

Architecture générale de NGroups

Diagramme montrant le workflow général de NGroups.

Avec Azure Container Instances, les clients doivent créer et gérer manuellement chaque groupe de conteneurs individuel. NGroups offre une solution plus facile pour créer, mettre à jour et gérer N instances de groupe de conteneurs avec un seul appel d’API.

La création d’une ressource NGroups est un processus en deux étapes.

  1. Créez un profil de groupe de conteneurs (CGProfile), qui sert de modèle. Dans le CGProfile, un utilisateur spécifie des propriétés de groupe de conteneurs qui sont appliquées sur tous les groupes de conteneurs créés par NGroups.

  2. Créez une ressource NGroups. Vous pouvez fournir le nombre souhaité (nombre de groupes de conteneurs requis) et une référence au profil de groupe de conteneurs ainsi que d’autres propriétés pertinentes.

NGroups fait référence à ce profil de groupe de conteneurs, puis appelle les API ACI pour créer/mettre à jour les groupes de conteneurs avec les propriétés mentionnées dans le CGProfile.

Concepts

Profil du groupe de conteneurs (profil CG)

Une application cloud à grande échelle peut nécessiter la gestion de plusieurs groupes de conteneurs. À ce jour, pour pouvoir exécuter plusieurs groupes de conteneurs, les clients doivent à chaque fois fournir des propriétés adaptées, comme les images conteneur, la stratégie de redémarrage et d’autres propriétés. Il peut en résulter des limitations, une duplication des efforts et une surcharge de travail en matière de gestion.

Pour pallier ce problème, NGroups a introduit les profils de groupe de conteneurs. Le profil du groupe de conteneurs (profile CG) sert de modèle pour créer des groupes de conteneurs avec le même ensemble de propriétés.

Voici quelques-unes des propriétés communes qui peuvent être spécifiées dans un profil du groupe de conteneurs :

  • osType (exemple : Linux, Windows)
  • Conteneurs. Nom de l’image, mémoire, processeur, etc.
  • restartPolicy
  • Protocole ipAddress et port interne
  • shutdownGracePeriod
  • timeToLive

Et voici un exemple du profil d’un groupe de conteneurs :

{ 
    "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

La ressource NGroups permet de créer et de gérer « n » groupes de conteneurs avec un large éventail d’opérations. Une ressource NGroups fait référence à une ressource de profil du groupe de conteneurs et l’utilise pour créer N instances de groupes de conteneurs similaires. Dans la ressource NGroups, les clients peuvent également spécifier d’autres propriétés, y compris, mais sans s’y limiter, le nombre de groupes de conteneurs (CG), les préférences de mise à jour (manuelle ou propagée), les équilibreurs de charge, les sous-réseaux ainsi que d’autres propriétés pertinentes qu’ils souhaitent associer aux groupes de conteneurs sous une ressource NGroups.

Remarque

Un profil CG doit être créé avant de créer une ressource NGroups. Étant donné que le profil CG est une ressource ARM, il possède ses propres API ARM. Un profil CG doit être créé avant de créer une ressource NGroups.

Avantages du référencement du profil du groupe de conteneurs

  • Le profil du groupe de conteneurs est une ressource distincte de NGroups. Les clients peuvent créer plusieurs NGroups qui peuvent se référer au même profil du groupe de conteneurs. Il garantit également la cohérence entre tous les NGroups qui se réfèrent à un profil du groupe de conteneurs unique et évite la duplication.

  • Un groupe de conteneurs ACI unique peut également être créé à partir d’un profil CG. Il vous permet de passer rapidement du prototype à la production.

Voici un exemple de ressource NGroups avec une identité managée et des zones, qui fait référence à un profil de groupe de conteneurs et crée trois groupes de conteneurs :

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

Principales fonctionnalités de NGroups

  • Permet les mises à jour manuelles et les mises à jour propagées
  • Gérer des groupes de conteneurs inter-zones
  • Prend en charge les identités managées
  • Ajouter un équilibreur de charge et une passerelle d’application pour gérer le trafic entre les groupes de conteneurs
  • Gérer des groupes de conteneurs avec différents profils de groupes de conteneurs
  • Attacher et détacher des groupes de conteneurs

API NGroups

NGroups fait référence à un profil CG et ajoute d’autres propriétés et fonctionnalités connexes. Exemple :

  • Le nombre souhaité de groupes de conteneurs à créer ou auquel appliquer un scale-out
  • Le sous-réseau dans lequel les groupes de conteneurs sont déployés lors de l’utilisation d’un réseau virtuel
  • L’équilibreur de charge ou la passerelle applicative destiné à fournir l’entrée réseau aux groupes de conteneurs

NGroups appelle à son tour les API ARM d’ACI pour créer et gérer chaque groupe de conteneurs. Comme il utilise les mêmes API ARM, il n’y a pas de différence entre les groupes de conteneurs créés par NGroups et les groupes de conteneurs créés directement par le client. Ils ont exactement la même expérience d’API.

Mise à jour d’une ressource NGroups

À mesure que les exigences évoluent, nous devons garder nos NGroups et ses groupes de conteneurs à jour. Il existe deux modes de mise à jour pour les NGroups : Manuelle (option par défaut) et Propagée.

Prenons l’exemple simple de la mise à jour d’une référence de profil CG de cgprofile1 vers cgprofile2 :

  • En mode manuel, nous mettons à jour la référence à cgprofile2 et nous envoyons une requête UPDATE PUT à NGroups :

NGroups stocke cette nouvelle référence de profil CG. Mais il ne met pas à jour les groupes de conteneurs existants avec cette référence. Les groupes de conteneurs existants sont en cours d’exécution et ne sont pas impactés. Toutefois, lorsque NGroups est étendu, les groupes de conteneurs sont créés à l’aide de cgprofile2.

  • Comment mettre à jour les groupes de conteneurs existants avec cgprofile2 ?

Pour mettre à jour des groupes de conteneurs existants avec le nouveau CGProfile, nous lançons une commande manual update avec une liste explicite des groupes de conteneurs que nous voulons mettre à jour. Cette commande met uniquement à jour les groupes de conteneurs spécifiés dans sa liste. La mise à jour du groupe de conteneurs implique d’appeler l’API PUT CG d’ACI. Les groupes de conteneurs non spécifiés dans cette liste continuent à s’exécuter avec cgprofile1.

Ce mode nous permet de mettre à jour les groupes de conteneurs de manière sélective et d’avoir un contrôle total sur l’impact des charges de travail sur la production.

En mode Propagée, lorsque nous mettons à jour la référence vers cgprofile2 et que nous émettons une commande UPDATE NGroups, les groupes de conteneurs existants sont mis à jour avec cgprofile2. La mise à jour des groupes de conteneurs existants se fait par petits lots (et pas tous en même temps). Ceci garantit un impact minimal sur votre charge de travail, car seul un petit pourcentage des groupes de conteneurs peut être indisponible pendant la mise à jour.

L’API NGroups permet de configurer la taille du lot et d’autres paramètres liés au mode de mise à jour propagée.

Essayer NGroups

Conditions préalables à l’utilisation de NGroups

La version actuellement prise en charge de l’API est 2024-09-01-preview.

  1. Inscrivez la fonctionnalité Microsoft.ContainerInstace/NGroupsPreview sur vos abonnements.

  2. Une fois les indicateurs de fonctionnalité appliqués à l’abonnement, inscrivez le fournisseur de ressources Microsoft.ContainerInstance sur vos abonnements.

Remarque

Utilisez la version d’API – 2024-09-01-preview et ses versions ultérieures pour la préversion.

Conseil

Suivez Swagger Azure Container Instances pour obtenir des informations à jour sur les API NGroups. Swagger NGroups Container Instances – 2024-11-01-preview

Si ces conditions préalables ne sont pas remplies, les requêtes échouent et le type de ressource NGroups n’est pas reconnu.

Exemples de modèles ARM

Créer un profil CG : ContainerGroupProfile-Sample.json Créer des NGroups zonaux avec CGProfile : NGroups-Zonal-Sample.json

Les clients peuvent voir si un groupe de conteneurs est associé à une ressource NGroups en examinant la propriété OrchestratorId du groupe de conteneurs sous la vue JSON. OrchestratorId représente l’ID de la ressource ARM NGroups associée.

Une capture d’écran d’un fichier JSON ARM de groupe de conteneurs NGroups montrant la propriété OrchestratorId.

Guide pratique

Effectuer une mise à jour propagée

Nous pouvons utiliser la fonction de mise à jour propagée pour mettre à jour automatiquement tous les groupes de conteneurs vers une version plus récente sans interrompre leur fonctionnement. Consultez la documentation sur la mise à jour propagée : Mise à jour propagée de NGroups.

Créer une ressource NGroups régionale (zonale/non zonale)

Commencez par créer un profil CG. Voici un exemple de profil CG. La version actuelle de l’API est 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" 
    }

Vous pouvez ensuite créer une ressource NGroups zonale/non zonale en ajoutant des zones en dehors des propriétés ou en laissant le tableau des zones vide.

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

Lorsque NGroups est étendu en définissant sa propriété desiredCount, les groupes de conteneurs sont répartis uniformément entre toutes les zones spécifiées. Si une zone tombe en panne, l’application reste disponible car les groupes de conteneurs des NGroups restants continuent à fonctionner dans d’autres zones.

Est-il possible de mettre à jour les groupes de conteneurs créés par une ressource NGroups directement via des API CG d’ACI ?

Oui, les clients ont la possibilité de mettre à jour les groupes de conteneurs (CG) directement en utilisant les API d’Azure Container Instances (ACI). Pour mieux comprendre les groupes de conteneurs ACI et explorer les options d’API correspondantes, consultez cette ressource : Groupes de conteneurs dans Azure Container Instances

Lors de la création ou de la mise à jour de groupes de conteneurs, NGroups s’appuie sur les mêmes API d’ACI. Cela signifie que les clients peuvent utiliser ces API pour mettre à jour des groupes de conteneurs spécifiques en fonction de leurs besoins, sans configuration supplémentaire.

Fonctionnalités techniques et contraintes
  • Une fois qu’une ressource NGroups est créée avec un ensemble de zones (par exemple, { "1", "2" }), les zones ne peuvent pas être supprimées. Toutefois, une nouvelle zone peut être ajoutée à la liste. Par exemple, { “1”, “2”, “3” }

  • Si une zone spécifiée est en panne, l’opération globale de création des groupes de conteneurs par NGroups échoue. Réessayez la requête une fois la zone sauvegardée. Une autre option consiste à supprimer les groupes de conteneurs qui ont échoué.

  • Lors d’un scale-down, NGroups supprime les instances de façon aléatoire, ce qui peut ne pas toujours conserver la répartition par zones de disponibilité. Toutefois, les opérations de montée en charge ultérieures tentent toujours de rééquilibrer la répartition par zones de disponibilité.

  • La répartition par zones de disponibilité n’est pas prise en charge avec les conteneurs Spot. Si cette exigence vous concerne, contactez l’équipe d’ACI.

  • Consultez également Impact de la disponibilité suite à des mises à jour de l’infrastructure/de la plateforme.

Créer des groupes de conteneurs NGroups avec un préfixe

Les clients peuvent créer des groupes de conteneurs NGroups avec un préfixe au lieu de simplement des noms GUID :

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

Ceci peut être utile quand vous avez plusieurs ressources NGroups dans un même groupe de ressources et que vous voulez différencier les groupes de conteneurs qui appartiennent à chaque NGroup (par exemple dans la vue du portail Azure). Vous pouvez également modifier le préfixe pour chaque opération de montée en charge afin d’identifier les groupes de conteneurs qui ont été mis à l’échelle au cours d’une même opération.

Créer des ressources NGroups avec des identités managées affectées par le système et des identités managées affectées par l’utilisateur

“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}}": {} 
    }

Si je supprime certains groupes de conteneurs d’une ressource NGroups, la ressource NGroups peut-elle se reconstruire elle-même avec de nouveaux groupes de conteneurs afin de conserver le nombre de conteneurs souhaités ?

Oui, vous pouvez définir la propriété booléenne properties.elasticProfile.maintainDesiredCount sur true.

Elle crée un nouveau groupe de conteneurs pour chaque groupe de conteneurs qui est supprimé/détaché de la ressource NGroups. Elle tente de maintenir la propriété desiredCount de la ressource NGroups à sa valeur définie.

Ceci est utile quand vous voulez utiliser la ressource NGroups comme un pool qui se reconstitue automatiquement quand vous retirez des groupes de conteneurs du pool pour vos scénarios de charge de travail.

Cette propriété booléenne peut accepter la valeur Null. Si vous l’omettez lors des appels PUT/update ultérieurs de NGroups, elle n’est pas réinitialisée à false. Pour la réinitialiser, vous devez explicitement lui attribuer la valeur false. Quand sa valeur est Null/false et qu’un groupe de conteneurs est supprimé/détaché de la ressource NGroups, la propriété desiredCount de la ressource NGroups est réduite en conséquence.

Comment obtenir le nom du groupe de conteneurs, l’ID de la ressource NGroups et d’autres métadonnées propagés dans le conteneur ?

Actuellement, nous divulguons uniquement le nom du groupe de conteneurs et l’ID de l’orchestrateur (l’ID de la ressource ARM). À l’avenir, d’autres propriétés pertinentes pourraient être envisagées. Ces deux propriétés apparaissent comme des variables d’environnement des conteneurs.

Pour obtenir ces variables d’environnement sur le conteneur, spécifiez ces étiquettes au niveau de la ressource NGroups :

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

NGroups considère ces étiquettes comme spéciales et propage les variables d’environnement requises dans chaque conteneur, comme indiqué ici.

Capture d’écran d’une ressource conteneur sur le Portail Azure affichant des variables d’environnement contenant les propriétés « ContainerGroupName » et « OrchestratorId ».

Quel est l’impact sur la disponibilité en raison des mises à jour de l’infrastructure/de la plate-forme ?

Pour les charges de travail qui offrent une plus grande disponibilité (par exemple, les NGroups répartis sur plusieurs zones de disponibilité), il existe toujours une faible possibilité que les groupes de conteneurs de plus d’une zone de disponibilité tombent en panne en même temps. Cela peut se produire lorsque l’infrastructure Azure sous-jacente (machines hôtes, Virtual Machine Scale Sets, etc.) fait l’objet d’une mise à jour (appelée mise à jour de l’infrastructure ou mise à jour de la plateforme).

Cette mise à jour est effectuée zone de disponibilité par zone de disponibilité, avec peu de coordination automatisée entre celles-ci. La coordination est suivie manuellement et est réalisée au mieux.

Par conséquent, si, par hasard, une mise à jour de plateforme se produit simultanément dans 2 ou plusieurs zones de disponibilité, les groupes de conteneurs de ces zones de disponibilité peuvent être indisponibles simultanément, ce qui entraînera l’indisponibilité de vos NGroups.

Comment utiliser les conteneurs confidentiels avec les NGroups

NGroups prend en charge les groupes de conteneurs confidentiels d’ACI. Dans un profil du groupe de conteneurs, les instances confidentielles sont définies à l’aide des propriétés suivantes.

{ 
    "location": "{{location}}", 
    "properties": { 
        "sku": "Confidential",
        "confidentialComputeProperties": { 
            "ccePolicy": "<base 64 encoded policy>" 
          }, 
        "containers": [ ... ], 
        "restartPolicy": "Always", 
        "shutdownGracePeriod": "PT1H", 
        "ipAddress": { ... }, 
        "timeToLive": "PT1H", 
        "osType": "Linux" 
    }     
} 

Reportez-vous à la documentation d’ACI sur les conteneurs confidentiels ici : Tutoriel : Préparer un déploiement pour un conteneur confidentiel sur Azure Container Instances

Exemples

Exemple de profil du groupe de conteneurs

{
    "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}}"
}

Exemple de NGroups avec zones

{
  "$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" ]
    }
  ]
}