Dela via


Distribuera till Azure Container Instances från Azure Container Registry med hjälp av en hanterad identitet

Azure Container Registry (ACR) är en Azure-baserad, hanterad containerregistertjänst som används för att lagra privata Docker-containeravbildningar. Den här artikeln beskriver hur du hämtar containeravbildningar som lagras i ett Azure-containerregister när du distribuerar till containergrupper med Azure Container Instances. Ett sätt att konfigurera registeråtkomst är att skapa en Microsoft Entra-hanterad identitet.

När åtkomsten till ett Azure Container Registry (ACR) begränsas med hjälp av en privat slutpunkt kan Azure Container Instances distribueras till ett virtuellt nätverk för åtkomst till containerregistret via den privata slutpunkten med hjälp av en hanterad identitet.

Förutsättningar

Azure-containerregister: Du behöver ett Premium SKU Azure-containerregister med minst en avbildning. Om du behöver skapa ett register kan du läsa Skapa ett containerregister med hjälp av Azure CLI. Var noga med att anteckna registrets id och loginServer

Azure CLI: Kommandoradsexemplen i den här artikeln använder Azure CLI och är formaterade för Bash-gränssnittet. Du kan installera Azure CLI lokalt eller använda Azure Cloud Shell.

Begränsningar

  • Windows-containrar stöder inte systemtilldelade hanterade identitetsautentiserade avbildningshämtningar med ACR, endast användartilldelade.

Konfigurera registerautentisering

Containerregistret måste ha betrodda tjänster aktiverade. Anvisningar om hur du aktiverar betrodda tjänster finns i Tillåt betrodda tjänster att på ett säkert sätt komma åt ett nätverksbegränsat containerregister.

Skapa en identitet

Skapa en identitet i din prenumeration med kommandot az identity create . Du kan använda samma resursgrupp som du använde tidigare för att skapa containerregistret eller en annan.

az identity create --resource-group myResourceGroup --name myACRId

Om du vill konfigurera identiteten i följande steg använder du kommandot az identity show för att lagra identitetens resurs-ID och tjänstens huvudnamns-ID i variabler.

För att konfigurera identiteten korrekt i framtida steg använder du az identity show för att hämta och lagra identitetens resurs-ID och tjänstens huvudnamns-ID i variabler.

# Get resource ID of the user-assigned identity
USERID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)
# Get service principal ID of the user-assigned identity
SPID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

Du behöver identitetens resurs-ID för att logga in på CLI från den virtuella datorn. Så här visar du värdet:

echo $USERID

Resurs-ID:t är i formuläret:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

Du behöver också tjänstens huvudnamns-ID för att ge den hanterade identiteten åtkomst till containerregistret. Så här visar du värdet:

echo $SPID

Tjänstens huvudnamns-ID är av formuläret:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Bevilja identiteten en rolltilldelning

För att din identitet ska få åtkomst till containerregistret måste du ge den en rolltilldelning. Använd följande kommando för att bevilja acrpull rollen till den identitet som du just har skapat, och se till att ange registrets ID och tjänstens huvudnamn som vi hämtade tidigare:

az role assignment create --assignee $SPID --scope <registry-id> --role acrpull

Distribuera med hjälp av en ARM-mall (Azure Resource Manager)

Börja med att kopiera följande JSON till en ny fil med namnet azuredeploy.json. I Azure Cloud Shell kan du använda Visual Studio Code för att skapa filen i arbetskatalogen:

code azuredeploy.json

Du kan ange egenskaperna för ditt Azure-containerregister i en ARM-mall genom att inkludera imageRegistryCredentials egenskapen i containergruppens definition. Du kan till exempel ange autentiseringsuppgifterna för registret direkt:

Kommentar

Det här är inte en omfattande ARM-mall, utan snarare ett exempel på hur avsnittet i resources en fullständig mall skulle se ut.

{
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2021-09-01",
    "name": "myContainerGroup",
    "location": "norwayeast",
    "identity": {
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId": {}
        }
    },
    "properties": {
      "containers": [
        {
          "name": "mycontainer",
          "properties": {
            "image": "myacr.azurecr.io/hello-world:latest",
            "ports": [
              {
                "port": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {
              "requests": {
                "cpu": 1,
                "memoryInGB": 1
              }
            }
        }
        }
      ],
      "imageRegistryCredentials": [
        {
            "server":"myacr.azurecr.io",
            "identity":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId"
        }
      ],
      "ipAddress": {
        "ports": [
          {
            "port": 80,
            "protocol": "TCP"
          }
        ],
        "type": "public"
      },
      "osType": "Linux"
    }
  }

Distribuera mallen

Distribuera Resource Manager-mallen med följande kommando:

az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json

Distribuera med Azure CLI

Om du vill distribuera en containergrupp med hanterad identitet för att autentisera avbildningshämtningar via Azure CLI använder du följande kommando och ser till att din <dns-label> är globalt unik:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --ports 80 --dns-name-label <dns-label>

Distribuera i ett virtuellt nätverk med hjälp av Azure CLI

Om du vill distribuera en containergrupp till ett virtuellt nätverk med hanterad identitet för att autentisera avbildningshämtningar från en ACR som körs bakom en privat slutpunkt via Azure CLI använder du följande kommando:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --vnet "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --subnet mySubnetName

Mer information om hur du distribuerar till ett virtuellt nätverk finns i Distribuera containerinstanser till ett virtuellt Azure-nätverk.

Distribuera en grupp med flera containrar i ett virtuellt nätverk med YAML och Azure CLI

Om du vill distribuera en grupp med flera containrar till ett virtuellt nätverk med hanterad identitet för att autentisera avbildningshämtningar från en ACR som körs bakom en privat slutpunkt via Azure CLI, kan du ange konfigurationen av containergruppen i en YAML-fil. Skicka sedan YAML-filen som en parameter till kommandot .

apiVersion: '2021-10-01'
location: eastus
type: Microsoft.ContainerInstance/containerGroups
identity: 
  type: UserAssigned
  userAssignedIdentities: {
    '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId': {}
    }
properties:
  osType: Linux
  imageRegistryCredentials:
  - server: myacr.azurecr.io
    identity: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId'
  subnetIds:
  - id: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNetName/subnets/mySubnetName'
    name: mySubnetName
  containers:
  - name: myContainer-1
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 1
      image: 'myacr.azurecr.io/myimage:latest'
  - name: myContainer-2
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 2
      image: 'myacr.azurecr.io/myimage:latest'
az container create --name my-containergroup --resource-group myResourceGroup --file my-YAML-file.yaml

Mer information om hur du distribuerar till en grupp med flera containrar finns i Distribuera en grupp med flera containrar.

Rensa resurser

Ta bort alla resurser från din Azure-prenumeration genom att ta bort resursgruppen:

az group delete --name myResourceGroup

Nästa steg