Freigeben über


Informationen zu NGroups (Vorschau)

Container haben sich zum Standard für das Packen, Bereitstellen und Verwalten von Cloudanwendungen entwickelt, und die effektive Verwaltung dieser Container ist ebenso wichtig wie das Ausführen der Apps selbst. Azure Container Instances (ACI) ist ein flexibler und skalierbarer Dienst für serverloses Computing, mit dem Sie containerisierte Anwendungen ausführen können, ohne die Infrastruktur verwalten zu müssen.

NGroups bietet Ihnen erweiterte Funktionen zum Verwalten mehrerer verwandter Containergruppen. Zu den unterstützten Features gehören:

  • Verwalten mehrerer Instanzen
  • Parallele Upgrades
  • Hochverfügbarkeit über Verfügbarkeitszonen (VZ)
  • Unterstützung verwalteter Identitäten
  • Unterstützung für vertrauliche Container
  • Lastenausgleich
  • Zonenausgleich (alle Zonen)

Das NGroups-Feature baut auf ACI auf und soll sicherstellen, dass Containergruppen sicher und hochverfügbar sind und die Features von ACI unterstützen.

Weitere Informationen zu Azure Container Instances finden Sie unter Was ist Azure Container Instances?.

Allgemeine Architektur von NGroups

Diagramm: Allgemeiner Workflow von NGroups

Mit Azure Container Instances müssen Kunden jede einzelne Containergruppe manuell erstellen und verwalten. NGroups bietet eine einfachere Lösung zum Erstellen, Aktualisieren und Verwalten von N-Containergruppeninstanzen mit einem einzelnen API-Aufruf.

Das Erstellen einer NGroups-Ressource ist ein zweistufiger Prozess.

  1. Erstellen Sie ein Containergruppenprofil (CG-Profil), das als Vorlage dient. Im CG-Profil gibt ein Benutzer CG-Eigenschaften an, die auf alle von NGroups erstellten Containergruppen angewendet werden.

  2. Erstellen Sie eine NGroups-Ressource. Sie können die gewünschte Anzahl (Anzahl der erforderlichen Containergruppen) und einen Verweis auf das Containergruppenprofil zusammen mit anderen relevanten Eigenschaften bereitstellen.

NGroups verweist auf dieses Containergruppenprofil und ruft dann ACI-APIs auf, um Containergruppen mit den im CG-Profil genannten Eigenschaften zu erstellen/zu aktualisieren.

Konzepte

Containergruppenprofil (CG-Profil)

Eine umfangreiche Cloudanwendung erfordert möglicherweise die Verwaltung mehrerer Containergruppen. Derzeit müssen Kunden für die Ausführung mehrerer CGs (Containergruppen) relevante Faktoren wie Containerimages, Neustartrichtlinien und andere Eigenschaften jedes Mal bereitstellen. Dies kann zu Drosselung, doppelte Arbeit und einen Mehraufwand bei der Verwaltung führen.

Aus diesem Grund wurden in NGroups Containergruppenprofile eingeführt. Ein Containergruppenprofil (CG-Profil) dient als Vorlage zum Erstellen von Containergruppen mit identischen Eigenschaften.

Im Folgenden finden Sie einige allgemeine Eigenschaften, die in einem Containergruppenprofil angegeben werden können:

  • osType (z. B.: Linux, Windows)
  • Container Imagename, Arbeitsspeicher, CPU usw.
  • restartPolicy
  • ipAddress: Protokoll und interner Port
  • shutdownGracePeriod
  • timeToLive

Dies ist ein Beispiel für ein CG-Profil:

{ 
    "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-Ressourcen bieten eine Möglichkeit zum Erstellen und Verwalten von „n“-Containergruppen mit einer Vielzahl von Vorgängen. Eine NGroups-Ressource verweist auf ein Containergruppenprofil und verwendet dieses zum Erstellen von N-Instanzen ähnlicher Containergruppen. Sie können innerhalb der NGroups-Ressource auch andere Eigenschaften angeben, unter anderem die Anzahl der CGs, Updateeinstellungen (manuelles oder paralleles Update), Lastenausgleichsmodule, Subnetze und andere relevante Eigenschaften, die Sie den Containergruppen in einer NGroups-Ressource zuordnen möchten.

Hinweis

Vor dem Erstellen einer NGroups-Ressource müssen Sie ein CG-Profil erstellen. Da das CG-Profil eine ARM-Ressource ist, verfügt es über eigene ARM-APIs. Vor dem Erstellen einer NGroups-Ressource müssen Sie ein CG-Profil erstellen.

Vorteile von Verweisen auf Containergruppenprofile

  • Ein Containergruppenprofil ist eine separate Ressource von NGroups. Sie können mehrere NGroups erstellen, die auf dasselbe Containergruppenprofil verweisen. Außerdem garantiert es Konsistenz in allen NGroups, die auf dasselbe Containergruppenprofil verweisen und verhindert so Duplizierungen.

  • Eine einzelne ACI-Containergruppe kann ebenfalls aus einem CG-Profil erstellt werden. Dies ermöglicht einen schnellen Wechsel vom Prototyp zur Produktion.

Im Folgenden finden Sie ein Beispiel für eine NGroups-Ressource mit verwalteter Identität und Zonen, die sich auf ein Containergruppenprofil bezieht und drei Containergruppen erstellt:

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

Vorteile von NGroups-Features

  • Ermöglichen sowohl parallele als auch manuelle Updates
  • Verwalten von zonenübergreifenden Containergruppen
  • Unterstützung verwalteter Identitäten
  • Hinzufügen eines Lastenausgleichs und eines Anwendungsgateways zum Verwalten des Datenverkehrs über Containergruppen hinweg
  • Verwalten von Containergruppen mit unterschiedlichen Containergruppenprofilen
  • Anfügen und Trennen von Containergruppen

NGroups-API

NGroups verweist auf ein CG-Profil und fügt weitere verwandte Eigenschaften und Funktionen hinzu. Beispiel:

  • Die gewünschte Anzahl für die Erstellung oder horizontale Skalierung von Containergruppen
  • Das Subnetz, in dem Containergruppen bei Verwendung eines virtuellen Netzwerks bereitgestellt werden
  • Die Load Balancer- oder Application Gateway-Instanz zum Bereitstellen von eingehendem Netzwerkdatenverkehr für Containergruppen

NGroups ruft wiederum die ARM-APIs von ACI auf, um die einzelnen Containergruppen zu erstellen und zu verwalten. Da dabei dieselben ARM-APIs verwendet werden, gibt es keinen Unterschied zwischen den von NGroups erstellten und den auf Kundenseite direkt erstellten Containergruppen. Sie bietet eine identische API-Erfahrung.

Aktualisieren einer NGroups-Ressource

Wenn sich die Anforderungen ändern, müssen Sie Ihre NGroups und Containergruppen weiterhin aktualisieren. Es gibt zwei Updatemodi, mit denen Sie NGroups aktualisieren können: manuell (Standardoption) und parallel.

Betrachten Sie ein einfaches Beispiel für die Aktualisierung eines CG-Profilverweises von cgprofile1 auf cgprofile2:

  • Im manuellen Modus aktualisieren Sie den Verweis auf cgprofile2 und senden eine UPDATE PUT-Anforderung an NGroups:

NGroups speichert diesen neuen CG-Profilverweis. Vorhandene Containergruppen werden mit diesem Verweis jedoch nicht aktualisiert. Da die bestehenden Containergruppen derzeit ausgeführt werden, hat dies keine Auswirkungen. Bei einer horizontalen Skalierung der NGroups werden die Containergruppen jedoch mit cgprofile2 erstellt.

  • Wie werden vorhandene Containergruppen auf cgprofile2 aktualisiert?

Um vorhandene Containergruppen mit neuen CG-Profilen zu aktualisieren, führen Sie einen Befehl für ein manuelles Update mit einer expliziten Liste der Containergruppen aus, die aktualisiert werden sollen. Mit diesem Befehl werden nur die in der Liste angegebenen Containergruppen aktualisiert. Das Aktualisieren einer Containergruppe umfasst das Aufrufen der PUT CG-API von ACI. Die in dieser Liste nicht angegebenen Containergruppen werden weiterhin mit cgprofile1 ausgeführt.

Dieser Modus bietet die Flexibilität, Containergruppen selektiv zu aktualisieren und volle Kontrolle über die Auswirkungen auf Produktionsworkloads zu behalten.

Wenn Sie im parallelen Modus den Verweis auf cgprofile2 aktualisieren und den NGroups-Befehl UPDATE ausführen, werden die vorhandenen Containergruppen auf cgprofile2 aktualisiert. Updates vorhandener Containergruppen erfolgen in kleinen Batches (nicht für alle gleichzeitig). Dadurch wird sichergestellt, dass sich der Vorgang nur minimal auf Ihre Workload auswirkt, da während des Updates möglicherweise nur ein kleiner Prozentsatz der Containergruppen nicht verfügbar ist.

Sie können die Batchgröße und andere zugehörige Einstellungen für den parallelen Updatemodus mit der NGroups-API konfigurieren.

Testen von NGroups

Voraussetzungen für die Verwendung von NGroups

Die derzeit unterstützte API-Version ist 2024-09-01-preview.

  1. Registrieren Sie das Feature Microsoft.ContainerInstace/NGroupsPreview für Ihre Abonnements.

  2. Nachdem die Featureflags auf das Abonnement angewendet wurden, registrieren Sie den Ressourcenanbieter Microsoft.ContainerInstance für Ihre Abonnements.

Hinweis

Verwenden Sie für die Vorschau API-Version 2024-09-01-preview und höher.

Tipp

In Azure Container Instances-Swagger finden Sie aktuelle Informationen zu NGroups-APIs. Container Instances-Swagger für NGroups: 2024-11-01-preview

Wenn diese Voraussetzungen nicht erfüllt sind, schlagen Anforderungen fehl, und der Ressourcentyp „NGroups“ wird nicht erkannt.

Beispiele für ARM-Vorlagen

Erstellen eines CG-Profils: ContainerGroupProfile-Sample.json Erstellen von NGroups mit Zonen und CG-Profil: NGroups-Zonal-Sample.json

Kunden können sehen, ob eine Containergruppe einer NGroups-Ressource zugeordnet ist, indem Sie die Eigenschaft „containerId“ der Containergruppe in der JSON-Ansicht überprüfen. Die Orchestrator-ID (OrchestratorId) stellt die zugeordnete ARM-Ressourcen-ID in NGroups dar.

Screenshot: ARM-JSON-Ansicht der NGroups-Containergruppe mit OrchestratorId-Eigenschaft

Schrittanleitung

Ausführen eines parallelen Updates

Sie können das Feature für parallele Updates verwenden, um alle Containergruppen automatisch auf eine neuere Version zu aktualisieren, ohne dass es zu einer Downtime der NGroups kommt. Weitere Informationen finden Sie in der Dokumentation zu parallelen Updates unter NGroups: Parallele Updates.

Erstellen einer regionalen (zonalen/nicht zonalen) NGroups-Instanz

Erstellen Sie zunächst ein CG-Profil. Im Folgenden finden Sie ein Beispiel für ein CG-Profil. Die derzeit unterstützte API-Version ist 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" 
    }

Als Nächstes können Sie eine zonal/nicht zonale NGroups-Instanz erstellen, indem Sie entweder Zonen außerhalb der Eigenschaften hinzufügen oder das Zonenarray leer lassen.

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

Wenn NGroups durch Festlegen der desiredCount-Eigenschaft skaliert wird, werden die Containergruppen gleichmäßig auf alle angegebenen Zonen verteilt. Wenn eine Zone ausfällt, bleibt die Anwendung verfügbar, da die verbleibenden Containergruppen von NGroups weiterhin in den anderen Zonen ausgeführt werden.

Können Containergruppen, die von einer NGroups-Ressource erstellt wurden, direkt über die Containergruppen-APIs von ACI aktualisiert werden?

Ja, Sie haben die Flexibilität, Containergruppen (CGs) direkt mithilfe der ACI-APIs (Azure Container Instances) zu aktualisieren. Weitere Informationen zu ACI-Containergruppen und zum Erkunden der zugehörigen API-Optionen finden Sie unter Containergruppen in Azure Container Instances.

Beim Erstellen oder Aktualisieren von Containergruppen verwendet NGroups dieselben ACI-APIs. Dies bedeutet, dass Sie ebenfalls diese APIs verwenden können, um bestimmte Containergruppen nach Bedarf ohne zusätzliche Konfigurationen zu aktualisieren.

Technische Funktionen und Einschränkungen
  • Nachdem eine NGroups-Ressource mit mehreren Zonen erstellt wurde (z. B. { „1“, „2“ }), können die Zonen nicht mehr entfernt werden. Der Liste können jedoch neue Zonen hinzugefügt werden. Beispiel: { „1“, „2“, „3“ }

  • Wenn eine angegebene Zone ausfällt, verursacht der allgemeine NGroups-Vorgang zum Erstellen der Containergruppen Fehler. Wiederholen Sie die Anforderung, wenn die Zone wieder online ist. Eine weitere Option besteht darin, die fehlerhaften Containergruppen zu löschen.

  • Während des Herunterskalierens löscht NGroups zufällig Instanzen, wobei möglicherweise nicht immer die gleichmäßige Verteilung auf Verfügbarkeitszonen beibehalten wird. Bei nachfolgenden Vorgängen zur horizontalen Skalierung wird jedoch immer versucht, die Verteilung auf Verfügbarkeitszonen wieder auszugleichen.

  • Bei Spotcontainern wird die Aufteilung auf Verfügbarkeitszonen nicht unterstützt. Wenn dies erforderlich ist, wenden Sie sich an das ACI-Team.

  • Weitere Informationen finden Sie auch unter Auswirkungen der Verfügbarkeit aufgrund von Infrastruktur-/Plattformupdates.

Erstellen von NGroups-Containergruppen mit einem Präfix

Sie können NGroups-Containergruppen mit einem Präfix und nicht nur mit GUID-Namen erstellen:

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

Dies kann hilfreich sein, wenn Sie mehrere NGroups-Instanzen in einer einzelnen Ressourcengruppe haben und die Containergruppen unterscheiden möchten, die zu den einzelnen NGroups-Instanzen gehören (z. B. in der Ansicht im Azure-Portal). Sie können es auch für jede horizontale Skalierung ändern, um Containergruppen zu identifizieren, die in einem Vorgang zusammen skaliert wurden.

Erstellen von NGroups-Instanzen mit systemseitig und benutzerseitig zugewiesenen verwalteten Identitäten

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

Wenn einige Containergruppen aus einer NGroups-Instanz gelöscht werden, kann diese NGroups-Instanz dann mit neuen Containergruppen unter Beibehaltung der gewünschten Anzahl neu erstellt werden?

Ja, legen Sie dazu die boolesche Eigenschaft „properties.elasticProfile.maintainDesiredCount“ auf TRUE fest.

Damit wird für jede Containergruppe, die aus NGroups gelöscht oder davon getrennt wird, eine neue Containergruppe erstellt. Dabei wird versucht, den in der desiredCount-Eigenschaft der NGroups-Instanz festgelegten Wert beizubehalten.

Dies ist hilfreich, wenn Sie die NGroups-Instanz als Pool verwenden möchten, der automatisch aufgefüllt wird, wenn Sie in Ihren Workloadszenarien Containergruppen aus dem Pool entfernen.

Dies ist eine boolesche, Nullwerte zulassende Eigenschaft. Wenn Sie sie bei nachfolgenden Aufrufen von NGroups PUT/update auslassen, wird sie nicht auf „false“ zurückgesetzt. Zum Zurückzusetzen müssen Sie sie explizit auf FALSE festlegen. Wenn der Wert NULL/FALSE ist und eine Containergruppe aus der NGroups-Instanz gelöscht oder von dieser getrennt wird, wird die desiredCount-Eigenschaft der NGroups-Instanz entsprechend verkleinert.

Wie werden Containergruppenname, NGroups-ID und andere Metadaten abgerufen, die auf die Container angewendet wurden?

Derzeit werden nur der Containergruppenname und die Orchestrator-ID (die ARM-Ressourcen-ID) verfügbar gemacht. In Zukunft sollen noch weitere relevante Eigenschaften berücksichtigt werden. Diese beiden Eigenschaften werden als Umgebungsvariablen des Containers angezeigt.

Um diese Umgebungsvariablen für den Container abzurufen, geben Sie diese Tags auf NGroups-Ebene an:

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

NGroups versteht diese Tags als Sonderfälle und überträgt die erforderlichen Umgebungsvariablen an jeden Container, wie hier gezeigt.

Screenshot einer Containerressource im Azure-Portal mit Umgebungsvariablen mit den Eigenschaften „ContainerGroupName“ und „OrchestratorId“

Welche Auswirkungen haben Infrastruktur-/Plattformupdates auf die Verfügbarkeit?

Für Workloads mit einer höheren Verfügbarkeit (z. B. auf mehrere Verfügbarkeitszonen verteilte NGroups) besteht immer noch eine geringe Wahrscheinlichkeit, dass Containergruppen in mehreren Verfügbarkeitszonen gleichzeitig ausfallen. Dies kann passieren, wenn die zugrunde liegende Azure-Infrastruktur (Hostcomputer, Virtual Machine Scale Sets usw.) ein Update (als Infrastruktur- oder Plattformupdate bezeichnet) durchläuft.

Dieses Update wird nacheinander in den Verfügbarkeitszonen durchgeführt, aber ohne automatisierte Koordination zwischen den Verfügbarkeitszonen. Die Koordination erfolgt durch manuelle Nachverfolgung und bestem Wissen.

Wenn also zufällig ein Plattformupdate über zwei oder noch mehr Verfügbarkeitszonen hinweg durchgeführt wird, können Containergruppen in diesen Verfügbarkeitszonen gleichzeitig ausfallen, was dazu führen kann, dass Ihre NGroups nicht verfügbar sind.

Verwenden vertraulicher Container mit NGroups

NGroups unterstützt vertrauliche ACI-Containergruppen. Vertrauliche Instanzen werden mithilfe der folgenden Eigenschaften in einem Containergruppenprofil definiert.

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

Weitere Informationen finden Sie in der ACI-Dokumentation zu vertraulichen Container im Tutorial: Vorbereiten einer Bereitstellung für einen vertraulichen Container in Azure Container Instances.

Beispiele

Beispiel für ein Containergruppenprofil

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

Beispiel für NGroups mit Zonen

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