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
- Windows-Container unterstützen keine systemseitig zugewiesenen, verwalteten Identitäts-authentifizierten Image-Pulls mit ACR, nur benutzerseitig zugewiesene.
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 Ihrer VM aus bei der Befehlszeilenschnittstelle 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 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
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