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-Instanz gespeichert sind, beim Bereitstellen in Containergruppen mit Azure Container Instances gepullt 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

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. So zeigen Sie den Wert an

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. So zeigen Sie den Wert an

echo $SPID

Die Dienstprinzipal-ID hat folgendes Format:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Gewähren einer Rollenzuweisung für die Identität

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 acrpull-Rolle 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

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/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --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

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 alle Ressourcen:

az group delete --name myResourceGroup

Nächste Schritte