Bereitstellen in Azure Container Instances aus Azure Container Registry mit einer verwalteten Identität

Azure Container Registry (ACR) ist ein verwalteter Containerregistrierungsdienst auf Azure-Basis zum Speichern privater Docker-Containerimages. In diesem Artikel wird beschrieben, wie Containerimages, die in einer Azure Container Registry gespeichert sind, bei der Bereitstellung in Containergruppen mit Azure Container Instances abgerufen werden. Eine Möglichkeit zum Konfigurieren des Registrierungszugriffs besteht darin, eine verwaltete Microsoft Entra-Identität zu erstellen.

Wenn der Zugriff auf eine Azure Container Registry (ACR) über einen privaten Endpunkt eingeschränkt ist, ermöglicht die Verwendung einer verwalteten Identität Azure Container Instances, die in einem virtuellen Netzwerk bereitgestellt wurden, den Zugriff auf die Containerregistrierung über den privaten Endpunkt.

Voraussetzungen

Azure Container Registry: Sie benötigen eine Premium-SKU einer Azure-Containerregistrierung mit mindestens einem Image. Falls Sie eine Registrierung erstellen müssen, siehe Erstellen einer Containerregistrierung mit der Azure-Befehlszeilenschnittstelle (CLI). Notieren Sie sich unbedingt die id und den loginServer der Registrierung.

Azure CLI: Die Befehlszeilenbeispiele in diesem Artikel verwenden die Azure CLI und sind für die Bash-Shell formatiert. Sie können die Azure CLI lokal installieren oder die Azure Cloud Shell nutzen.

Einschränkungen

  • Azure Container Instances unterstützt keine mit ACR erfolgenden, per systemseitig zugewiesener verwalteter Identität authentifizierten Imageabrufe. Sie müssen eine vom Benutzer zugewiesene verwaltete Identität verwenden, um Image-Pulls von ACR zu authentifizieren, unabhängig vom Betriebssystem der Containergruppe.
  • Wenn Sie einen privaten Endpunkt für ACR in einem virtuellen Netzwerk verwenden, muss sich der private ACR-Endpunkt in einem anderen Subnetz befinden als das, das an Azure Container Instances delegiert wurde. ACI-delegierte Subnetze können nur Containergruppen enthalten. Wenn Sie den privaten ACR-Endpunkt im selben delegierten Subnetz platzieren, tritt ein Konflikt auf, und die Bereitstellung schlägt fehl.

Hinweis

Verwalteter Identitätszugriff auf eine private Azure-Containerregistrierung kann nur über eine ARM/Bicep-Vorlage oder die neueste Azure CLI konfiguriert werden.

Konfigurieren der Authentifizierung der Registrierung

Für Ihre Containerregistrierung müssen vertrauenswürdige Dienste aktiviert sein. Anweisungen zum Aktivieren vertrauenswürdiger Dienste finden Sie unter Zulassen des sicheren Zugriffs vertrauenswürdiger Dienste auf eine Containerregistrierung mit Netzwerkeinschränkungen.

Erstellen einer Identität

Erstellen Sie mit dem Befehl az identity create eine Identität in Ihrem Abonnement. Sie können entweder dieselbe Ressourcengruppe verwenden, die Sie zuvor zum Erstellen der Containerregistrierung verwendet haben, oder Sie verwenden eine andere Ressourcengruppe.

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

Um die Identität in den folgenden Schritten zu konfigurieren, verwenden Sie den Befehl az identity show, um die Ressourcen-ID und die Dienstprinzipal-ID der Identität in Variablen zu speichern.

Um die Identität in zukünftigen Schritten ordnungsgemäß zu konfigurieren, verwenden Sie az identity show, um die Ressourcen-ID und die Dienstprinzipal-ID der Identität abzurufen und in Variablen zu speichern.

# 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)

Sie benötigen die Ressourcen-ID der Identität, um sich von Ihrem virtuellen Computer aus bei der CLI anzumelden. Den Wert anzeigen:

echo $USERID

Die Ressourcen-ID hat folgendes Format:

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

Außerdem benötigen Sie die Dienstprinzipal-ID, um der verwalteten Identität Zugriff auf Ihre Containerregistrierung zu gewähren. Den Wert anzeigen:

echo $SPID

Die Dienstprinzipal-ID hat die folgende Form:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Der Identität eine Rollenzuweisung zuweisen

Damit Ihre Identität auf Ihre Containerregistrierung zugreifen kann, müssen Sie ihr eine Rollenzuweisung erteilen. Verwenden Sie den folgenden Befehl, um der gerade erstellten Identität die Rolle acrpull zuzuweisen. Stellen Sie dabei sicher, dass Sie die ID und den Dienstprinzipal Ihrer Registrierung angeben, die wir zuvor abgerufen haben:

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

Bereitstellen mithilfe einer Azure Resource Manager-Vorlage (ARM)

Beginnen Sie, indem Sie den folgenden JSON-Code in eine neue Datei mit dem Namen azuredeploy.json kopieren. In Azure Cloud Shell können Sie die Datei mit Visual Studio Code in Ihrem Arbeitsverzeichnis erstellen:

code azuredeploy.json

Sie können die Eigenschaften Ihrer Azure Container Registry in einer ARM-Vorlage angeben, indem Sie die imageRegistryCredentials-Eigenschaft in die Definition der Containergruppe einbeziehen. Sie können z. B. die Registrierungsanmeldeinformationen direkt angeben:

Hinweis

Dies ist keine umfassende ARM-Vorlage, sondern ein Beispiel dafür, wie der resources-Abschnitt einer vollständigen Vorlage aussähe.

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

Bereitstellen der Vorlage

Stellen Sie Ihre Resource Manager-Vorlage mit dem folgenden Befehl bereit:

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

Bereitstellen über die Azure-Befehlszeilenschnittstelle

Verwenden Sie den folgenden Befehl, um eine Containergruppe mithilfe einer verwalteten Identität zum Authentifizieren von Imagepulls über die Azure CLI bereitzustellen, und stellen Sie dabei sicher, dass Ihr <dns-label> global eindeutig ist:

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>

Bereitstellen in einem virtuellen Netzwerk mithilfe der Azure-Befehlszeilenschnittstelle

Important

Wenn Ihr ACR einen privaten Endpunkt verwendet, muss sich der private Endpunkt in einem anderen Subnetz befinden als das, das an Azure Container Instances delegiert wurde. ACI-delegierte Subnetze können nur Containergruppen enthalten, sodass das Platzieren des privaten ACR-Endpunkts im selben Subnetz dazu führt, dass die Bereitstellung fehlschlägt.

Verwenden Sie den folgenden Befehl, um eine Containergruppe in einem virtuellen Netzwerk mithilfe einer verwalteten Identität bereitzustellen, um Imagepulls aus einer ACR zu authentifizieren, die hinter einem privaten Endpunkt über die Azure-Befehlsschnittstelle ausgeführt wird:

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

Weitere Informationen zum Bereitstellen in einem virtuellen Netzwerk finden Sie unter Bereitstellen von Containerinstanzen in einem virtuellen Azure-Netzwerk.

Bereitstellen einer Gruppe mit mehreren Containern in einem virtuellen Netzwerk mithilfe von YAML und der Azure-Befehlsschnittstelle

Important

Wenn Ihr ACR einen privaten Endpunkt verwendet, muss sich der private Endpunkt in einem anderen Subnetz befinden als das, das an Azure Container Instances delegiert wurde. ACI-delegierte Subnetze können nur Containergruppen enthalten, sodass das Platzieren des privaten ACR-Endpunkts im selben Subnetz dazu führt, dass die Bereitstellung fehlschlägt.

Sie können die Konfiguration der Containergruppe in einer YAML-Datei angeben, um eine Gruppe mit mehreren Containern in einem virtuellen Netzwerk mithilfe einer verwalteten Identität bereitzustellen, um Imagepulls aus einer ACR zu authentifizieren, die hinter einem privaten Endpunkt über die Azure-Befehlsschnittstelle ausgeführt wird. Übergeben Sie die YAML-Datei dann als Parameter an den Befehl.

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

Weitere Informationen zum Bereitstellen in einer Gruppe mit mehreren Containern finden Sie unter Bereitstellen einer Gruppe mit mehreren Containern.

Bereinigen von Ressourcen

Um alle Ressourcen aus Ihrem Azure-Abonnement zu entfernen, löschen Sie die Ressourcengruppe:

az group delete --name myResourceGroup

Nächste Schritte