Dela via


Om NGroups (förhandsversion)

Containrar blev standard för att paketera, distribuera och hantera molnprogram, och att effektivt hantera dessa containrar är lika viktigt som att köra själva apparna. Azure Container Instances (ACI) är en flexibel och skalbar serverlös databehandlingstjänst som gör att du kan köra containerbaserade program utan att hantera infrastrukturen.

Med NGroups får du avancerade funktioner för att hantera flera relaterade containergrupper. Funktioner som stöds är:

  • Underhålla flera instanser
  • Löpande uppgraderingar
  • Hög tillgänglighet via Tillgänglighetszoner (AZs)
  • Stöd för hanterad identitet
  • Stöd för konfidentiell container
  • Belastningsutjämning
  • Zonombalansering (zon alla)

Funktionen NGroups bygger på ACI, vilket säkerställer att containergrupper är säkra, har hög tillgänglighet och stöder funktionsuppsättningen för ACI.

Information om Azure Container Instances finns i: Vad är Azure Container Instances?

NGroups-arkitektur på hög nivå

Ett diagram som visar NGroups-arbetsflöde på hög nivå.

Med Azure Container Instances måste kunderna skapa och underhålla varje enskild containergrupp manuellt. NGroups erbjuder en enklare lösning för att skapa, uppdatera och hantera N-containergruppinstanser med ett enda API-anrop.

Att skapa en NGroups-resurs är en process i två steg.

  1. Skapa en containergruppsprofil (CGProfile), som fungerar som en mall. I CGProfile anger en användare CG-egenskaper som tillämpas på alla CG:er som skapats av NGroups.

  2. Skapa en NGroups-resurs . Du kan ange önskat antal (antal nödvändiga CG:er) och en referens till containergruppprofilen tillsammans med andra relevanta egenskaper.

NGroups refererar till den här containergruppprofilen och anropar sedan ACI-API:er för att skapa/uppdatera CG:er med de egenskaper som anges i CGProfile.

Begrepp

Profil för containergrupp (CG-profil)

Ett storskaligt molnprogram kan kräva att du hanterar flera containergrupper. För att kunna köra flera CG:er (containergrupper) måste kunderna från och med i dag tillhandahålla relevanta egenskaper som containeravbildningar, omstartsprincip och andra egenskaper varje gång. Detta kan resultera i begränsning, duplicerad ansträngning och hanteringskostnader.

För att lindra det här problemet introducerade NGroups profiler för containergrupper. Containergruppprofilen (CGProfile) fungerar som en mall för att skapa containergrupper med samma uppsättning egenskaper.

Här är några av de vanliga egenskaperna som kan anges i en containergruppsprofil:

  • osType (exempel: Linux, Windows)
  • Behållare. Avbildningsnamn, minne, CPU osv.
  • restartPolicy
  • ipAddress-protokoll och intern port
  • shutdownGracePeriod
  • timeToLive

Och här är ett exempel på 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-resursen är ett sätt att skapa och hantera "n" containergrupper med en omfattande uppsättning åtgärder. En NGroups-resurs refererar till en containergruppsprofilresurs och använder den för att skapa N-instanser av liknande CG:er. I NGroups-resursen kan kunder också ange andra egenskaper, inklusive men inte begränsat till antal CG:er, uppdateringsinställningar (manuell eller löpande uppdatering), lastbalanserare, undernät och andra relevanta egenskaper som de vill associera med CG:er under en NGroups-resurs.

Kommentar

En CG-profil måste skapas innan du skapar en NGroups-resurs. Eftersom CG-profilen är en ARM-resurs har den egna ARM-API:er. En CG-profil måste skapas innan du skapar en NGroups-resurs.

Fördelar med att referera till containergruppprofil

  • Profilen för containergrupper är en separat resurs från NGroups. Kunder kan skapa flera NGroups som kan referera till samma containergruppsprofil. Det garanterar också konsekvens i alla NGroups som refererar till en enda containergruppprofil och undviker duplicering.

  • En enda ACI CG kan också skapas från en CG-profil. Det gör att du snabbt kan gå från prototyp till produktionsläge.

Här är ett exempel på en NGroups-resurs med hanterad identitet och zoner som refererar till en containergruppprofil och skapar tre containergrupper:

{ 
    "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-funktionshöjdpunkter

  • Erbjuder både löpande och manuell uppdatering
  • Hantera grupper för flera zonindelningscontainer
  • Stöder hanterade identiteter
  • Lägga till lastbalanserare och programgateway för att hantera trafik mellan containergrupper
  • Hantera containergrupper med olika containergruppsprofiler
  • Koppla och koppla från containergrupper

NGroups-API

NGroups refererar till en CG-profil och lägger till andra relaterade egenskaper och funktioner. Exempel:

  • Önskat antal CG:er för att skapa eller skala ut
  • Det undernät som CG:er distribueras till när du använder ett virtuellt nätverk
  • Lastbalanseraren eller Application Gateway för att tillhandahålla nätverksingress till CG:erna

NGroups anropar i sin tur ACI ARM-API:er för att skapa och hantera varje CG. Eftersom den använder samma ARM-API:er finns det ingen skillnad mellan de CG:er som skapats av NGroups och de CG:er som skapats direkt av kunden. De har exakt samma API-upplevelse.

Uppdatera en NGroups-resurs

När kraven ändras måste vi fortsätta att uppdatera våra NGroups och dess CG:er. Det finns två uppdateringslägen där vi kan uppdatera en NGroups – Manuell (standardalternativ) och Rullande.

Överväg ett grundläggande exempel på uppdatering av en CG-profilreferens från cgprofile1 till cgprofile2:

  • I manuellt läge uppdaterar vi referensen till cgprofile2 och skickar en UPDATE PUT-begäran till NGroups:

NGroups lagrar den här nya CG-profilreferensen. Men den uppdaterar inte befintliga CG:er med den här referensen. Befintliga CG:er körs för närvarande och det påverkar dem inte. Men när NGroups skalas ut skapas CG:erna med cgprofile2.

  • Hur uppdaterar vi befintliga CG:er med cgprofile2?

Om du vill uppdatera befintliga CG:er med nya CGProfile utfärdar vi ett manuellt uppdateringskommando med en explicit lista över de CG:er som vi vill uppdatera. Det här kommandot uppdaterar endast de CG:er som anges i listan. Uppdateringen av CG innebär att anropa ACI:s PUT CG API. De CG:er som inte anges i den här listan fortsätter att köras med cgprofile1.

Det här läget ger oss flexibilitet att uppdatera CG:er selektivt och ger fullständig kontroll över påverkan på produktionsarbetsbelastningar.

I rullande läge uppdateras befintliga CG:er med cgprofile2 när vi uppdaterar referensen till cgprofile2 och utfärdar ett UPDATE NGroups-kommando. Uppdateringen av befintliga CG:er sker i små batchar (och inte alla samtidigt). Detta säkerställer att arbetsbelastningen påverkas minimalt eftersom endast en liten andel av CG:erna kanske inte är tillgängliga under uppdateringen.

Vi kan konfigurera batchstorleken och andra relaterade inställningar för rullande uppdateringsläge med NGroups-API:et.

Prova NGroups

Förutsättningar för att arbeta med NGroups

Api-versionen som stöds för närvarande är 2024-09-01-preview.

  1. Registrera funktionen Microsoft.ContainerInstace/NGroupsPreview i dina prenumerationer.

  2. När funktionsflaggor har tillämpats på prenumerationen registrerar du resursprovidern Microsoft.ContainerInstance för dina prenumerationer.

Kommentar

Använd api-version – 2024-09-01-preview och framåt för förhandsversion.

Dricks

Följ Azure Container Instance Swagger för uppdaterad information om NGroups-API:er. Container Instance NGroups Swagger – 2024-11-01-preview

Om dessa krav inte uppfylls misslyckas begäranden och resurstypen NGroups känns inte igen.

ARM-mallexempel

Skapa CG-profil: ContainerGroupProfile-Sample.json Skapa zonindeliga NGroups med CGProfile: NGroups-Zonal-Sample.json

Kunder kan se om en containergrupp är associerad med en NGroups-resurs genom att kontrollera egenskapen orchestratorId för containergrupper under JSON-vyn. OrchestratorId representerar det associerade ARM-resurs-ID:t för NGroups.

En skärmbild av en NGroups CG ARM JSON som visar egenskapen OrchestratorId.

Instruktioner

Utföra en löpande uppdatering

Vi kan använda funktionen Rullande uppdatering för att automatiskt uppdatera alla CG:er till en nyare version utan driftstopp för NGroups. Se löpande uppdateringsdokumentation: Löpande uppdatering av NGroups.

Skapa en regional (zonindelad/icke-zonindelad) NGroups

Skapa först en CG-profil. Här är en CG-exempelprofil. API-versionen som stöds för närvarande är 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" 
    }

Sedan kan du skapa en zonindelad/icke-zonindelad NGroups genom att antingen lägga till zoner utanför egenskaperna eller lämna zonmatrisen tom.

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

När NGroups skalas ut genom att ange egenskapen desiredCount fördelas CG:erna jämnt över alla angivna zoner. Om en zon slutar fungera förblir programmet tillgängligt eftersom de återstående CG:erna för NGroups fortsätter att köras i andra zoner.

Kan jag uppdatera CG som skapats av en NGroups-resurs direkt via ACI CG-API:er?

Ja, kunderna har flexibiliteten att uppdatera containergrupper (CG:er) direkt med hjälp av API:erna för Azure Container Instances (ACI). Mer information om ACI-containergrupper och utforska relaterade API-alternativ finns i den här resursen: Containergrupper i Azure Container Instances

När du skapar eller uppdaterar containergrupper förlitar sig NGroups på samma ACI-API:er. Det innebär att kunder kan använda dessa API:er för att uppdatera specifika containergrupper efter behov, utan några extra konfigurationer.

Tekniska funktioner och begränsningar
  • När en NGroups-resurs har skapats med en uppsättning zoner (till exempel { "1", "2" }) kan zonerna inte tas bort. En ny zon kan dock läggas till i listan. Till exempel { "1", "2", "3" }

  • Om en angiven zon är nere misslyckas den övergripande NGroups-åtgärden för att skapa CG:erna. Försök igen när zonen är igång igen. Ett annat alternativ är att ta bort de misslyckade CG:erna.

  • Under nedskalning tar NGroups slumpmässigt bort instanser, vilket kanske inte alltid upprätthåller AZ-spridning. Efterföljande utskalningsåtgärder försöker dock alltid balansera om AZ-spridningen.

  • AZ-spridning stöds inte med Spot-containrar. Om du har ett sådant krav kontaktar du ACI-teamet.

  • Se även: tillgänglighetens inverkan på grund av infrastruktur-/plattformsuppdateringar.

Skapa NGroups-CG:er med ett prefix

Kunder kan skapa NGroups-CG:er med ett prefix i stället för bara GUID-namn:

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

Detta kan vara användbart när du har flera NGroups i en enda resursgrupp och vill skilja CG:er som tillhör varje NGroup (till exempel i vyn Azure Portal). Du kan också ändra den för varje utskalningsåtgärd för att identifiera CG:er som skalats ut tillsammans i en åtgärd.

Skapa NGroups med både systemtilldelade och användartilldelade hanterade identiteter

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

Om jag tar bort vissa CG:er från en NGroups, kan NGroups återskapa sig själv med nya CG:er för att behålla önskat antal?

Ja, du kan ange egenskapen properties.elasticProfile.maintainDesiredCount bool till true.

Den skapar en ny CG för varje CG som tas bort/kopplas från NGroups. Den försöker behålla egenskapen desiredCount för NGroups till dess angivna värde.

Detta är användbart när du vill använda NGroups som en pool som automatiskt fylls på när du tar bort CG:er från poolen för dina arbetsbelastningsscenarier.

Det är en bool-egenskap som kan ogiltigförklaras. Om du utelämnar det för efterföljande PUT/update-anrop för NGroups återställs det inte till false. Om du vill återställa måste du uttryckligen ställa in den på false. När det är null/false och när en CG tas bort/kopplas från NGroups, minskar egenskapen desiredCount för NGroups därefter.

Hur gör jag för att hämta CG-namnet, NGroups-ID:t och andra metadata som sprids ned till containern?

För närvarande exponerar vi endast CG-namnet och orkestrerings-ID :t (ARM-resurs-ID). I framtiden kan andra relevanta egenskaper övervägas. Dessa två egenskaper visas som containermiljövariabler.

Om du vill hämta dessa miljövariabler i containern anger du dessa taggar på NGroups-nivå:

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

NGroups förstår dessa taggar som speciella och sprider de miljövariabler som krävs ned till varje container enligt beskrivningen här.

En skärmbild av en containerresurs på Azure Portal som visar miljövariabler som innehåller egenskaperna ContainerGroupName och OrchestratorId.

Vilken effekt har tillgängligheten på grund av infrastruktur-/plattformsuppdateringar?

För arbetsbelastningar som erbjuder högre tillgänglighet (till exempel NGroups spridda över flera AZ:er) finns det fortfarande en låg möjlighet att CG:er i mer än en AZ går ned samtidigt. Det kan inträffa när den underliggande Azure-infrastrukturen (värddatorer, VM-skalningsuppsättningar osv.) genomgår en uppdatering (kallas för en infrastrukturuppdatering eller plattformsuppdatering).

Den här uppdateringen görs AZ av AZ med inte mycket automatiserad samordning mellan AZs. Koordineringen spåras manuellt och är bäst.

Om en plattformsuppdatering av en slump sker samtidigt över 2 eller fler AZ:er kan därför CG:er i dessa AZ:er vara nere samtidigt, vilket orsakar otillgänglighet för dina NGroups.

Använda konfidentiella containrar med NGroups

NGroups stöder konfidentiella ACI-containergrupper. Konfidentiella instanser definieras med hjälp av följande egenskaper i en containergruppprofil.

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

Se ACI-dokumentationen för konfidentiella containrar här: Självstudie: Förbereda en distribution för en konfidentiell container på Azure Container Instances

Exempel

Exempel på containergruppprofil

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

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