Authentifizieren mit Azure Container Registry (ACR) von Azure Kubernetes Service (AKS)

Wenn Sie Azure Container Registry (ACR) mit Azure Kubernetes Service (AKS) verwenden, müssen Sie einen Authentifizierungsmechanismus einrichten. Sie können die erforderlichen Berechtigungen zwischen ACR und AKS mithilfe des Azure CLI, Azure PowerShell oder Azure Portals konfigurieren. Dieser Artikel enthält Beispiele zum Konfigurieren der Authentifizierung zwischen diesen Azure-Diensten mithilfe der Azure CLI oder Azure PowerShell.

Die AKS-zu-ACR-Integration weist die Rolle AcrPull der verwalteten Identität Microsoft Entra ID zu, die dem Agentpool in Ihrem AKS-Cluster zugeordnet ist. Weitere Informationen zu verwalteten AKS-Identitäten finden Sie unter Zusammenfassung der verwalteten Identitäten.

Wichtig

Beim Anfügen von ACR tritt ein Latenzproblem mit Microsoft Entra-Gruppen auf. Wenn die AcrPull-Rolle einer Microsoft Entra-Gruppe gewährt wird und die Kubelet-Identität der Gruppe hinzugefügt wird, um die Azure-rollenbasierte Zugriffssteuerung (Azure RBAC) abzuschließen, könnte es zu einer Verzögerung kommen, bevor die RBAC-Gruppe wirksam wird. Wenn Sie die Automatisierung ausführen, für die die Azure RBAC-Konfiguration abgeschlossen sein muss, empfehlen wir, Bring Ihrer eigenen Kubelet-Identität als Problemumgehung zu verwenden. Sie können eine vom Benutzer zugewiesene Identität vorab erstellen, sie der Microsoft Entra Gruppe hinzufügen und dann die Identität als Kubelet-Identität verwenden, um einen AKS-Cluster zu erstellen. Diese Methode stellt sicher, dass die Identität der Microsoft Entra Gruppe hinzugefügt wird, bevor ein Token von Kubelet generiert wird, wodurch das Latenzproblem vermieden wird.

Hinweis

In diesem Artikel wird die automatische Authentifizierung zwischen AKS und ACR beschrieben. Wenn Sie ein Image aus einer privaten externen Registrierung abrufen, verwenden Sie ein Geheimnis für Imagepullvorgänge.

Vorsicht

Die AKS-ACR-Integration durch az aks --attach-acr wird nicht unterstützt für ABAC-fähige ACR-Registrierungen, bei denen der Berechtigungsmodus auf "RBAC Registry + ABAC Repository Permissions" festgelegt ist. ABAC-fähige ACR-Registrierungen erfordern die Container Registry Repository Reader-Rolle anstelle der AcrPull-Rolle, um Berechtigungen zum Abrufen von Bildern zu gewähren. Für ABAC-fähige ACR-Registrierungen sollten Sie nicht az aks --attach-acr verwenden, sondern stattdessen die rollenzuweisung Container Registry Repository Reader mithilfe des Azure Portals, az role assignment CLI oder Azure Resource Manager manuell zuweisen. Weitere Informationen zu ABAC-fähigen ACR-Registrierungen finden Sie unter Azure attributbasierte Zugriffssteuerung.

In dieser exemplarischen Vorgehensweise konfigurieren Sie einen Azure Kubernetes Service (AKS) Cluster zum sicheren Abrufen von Bildern aus einem Azure Container Registry (ACR). Verwenden Sie in Azure CLI --attach-acr. Weisen Sie in Terraform der verwalteten Identität des AKS kubelet die AcrPull Rolle zu. Dieser Leitfaden folgt dem gleichen Fluss wie der Azure CLI-Workflow bei Verwendung von Terraform für die Infrastrukturbereitstellung.

Voraussetzungen

  • Wenn Sie die Azure CLI verwenden, müssen Sie für diesen Artikel mindestens die Azure CLI-Version 2.7.0 ausführen. um die Version zu finden, führen Sie den az --version Befehl aus. Informationen zum Installieren oder Aktualisieren finden Sie unter Install Azure CLI.
  • Wenn Sie Azure PowerShell verwenden, erfordert dieser Artikel, dass Sie Azure PowerShell-Version 5.9.0 oder höher verwenden. Führen Sie den Befehl Get-InstalledModule -Name Az aus, um die Version zu ermitteln. Wenn Sie installieren oder aktualisieren müssen, lesen Sie Installieren von Azure PowerShell.
  • Beispiele und Syntax zur Verwendung von Terraform zum Konfigurieren von ACR finden Sie in der Terraform-Referenz.
  • Terraform ist installiert (>= 1.6).
  • Azure CLI installiert und bei Ihrem Abonnement angemeldet.
  • Berechtigungen zum Zuweisen von Rollen (Besitzer oder Benutzerzugriffsadministrator).

In diesem Artikel konfigurieren Sie einen Azure Kubernetes Service (AKS) Cluster zum sicheren Abrufen von Bildern aus einem Azure Container Registry (ACR). Verwenden Sie in Azure CLI --attach-acr. Weisen Sie in Terraform der verwalteten AKS Kubelet-Identität die AcrPull Rolle zu.

Dieser Artikel folgt demselben Fluss wie der Azure CLI-Workflow bei verwendung von Terraform für die Infrastrukturbereitstellung. Um zu überprüfen, ob Sie beim richtigen Abonnement angemeldet sind, verwenden Sie die folgenden Azure CLI Befehle:

az login
az account show

Erstellen einer neuen ACR

Wenn Sie noch nicht über eine ACR verfügen, erstellen Sie eine mit dem Befehl az acr create.

Der Registrierungsname muss innerhalb Azure global eindeutig sein und 5-50 alphanumerische Zeichen enthalten, mit Ausnahme von Bindestrichzeichen (-). Dieser Name ist Teil des vollqualifizierten DNS-Namens der Registrierung.

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export MYACR="mycontainerregistry$RANDOM_STRING"
export ACR_RESOURCE_GROUP="myContainerRegistryResourceGroup"
export LOCATION="westcentralus"

az group create \
  --name $ACR_RESOURCE_GROUP \
  --location $LOCATION

az acr create \
  --name $MYACR \
  --resource-group $ACR_RESOURCE_GROUP \
  --sku basic

Die RANDOM_STRING Variable speichert eine zufällige 10-stellige Zeichenfolge. Der MYACR Wert wird mit dem RANDOM_STRING Wert verkettet, um einen eindeutigen Namen zu erstellen.

Wenn Sie noch nicht über eine ACR verfügen, erstellen Sie eine mit dem Cmdlet New-AzContainerRegistry.

Der Registrierungsname muss innerhalb Azure global eindeutig sein und 5-50 alphanumerische Zeichen enthalten, mit Ausnahme von Bindestrichzeichen (-). Dieser Name ist Teil des vollqualifizierten DNS-Namens der Registrierung.

$RandomString = (Get-Random -Minimum 1000000000 -Maximum 10000000000).ToString()
$MyAcr = "mycontainerregistry$RandomString"
$AcrResourceGroup = "myContainerRegistryResourceGroup"
$Location = "westcentralus"

New-AzResourceGroup -Name $AcrResourceGroup -Location $Location

$NewAcr = @{
 Name = $MyAcr
 ResourceGroupName = $AcrResourceGroup
 Location = $Location
 Sku = "Basic"
}

New-AzContainerRegistry @NewAcr

Die $RandomString Variable speichert eine zufällige 10-stellige Zeichenfolge. Der $MyAcr Wert wird mit dem $RandomString Wert verkettet, um einen eindeutigen Namen zu erstellen.

Erstellen Sie eine main.tf Datei für die Konfiguration, und definieren Sie zunächst die Terraform-Anbieter und generieren ein eindeutiges Suffix für global eindeutige Ressourcennamen. Ein global eindeutiger Name stellt sicher, dass Ihr Azure Container Registry Name nicht mit vorhandenen Registern in Konflikt kommt.

terraform {
 required_version = ">= 1.6.0"
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~> 4.0"
   }
   random = {
     source  = "hashicorp/random"
     version = "~> 3.6"
   }
 }
}
provider "azurerm" {
 features {}
}
resource "random_string" "suffix" {
 length  = 6
 upper   = false
 special = false
}

Erstellen eines neuen AKS-Clusters und Integration in eine vorhandene ACR-Instanz

Erstellen Sie einen neuen AKS-Cluster, und integrieren Sie es mit einem vorhandenen ACR mithilfe des az aks create Befehls mit dem --attach-acr Parameter. Mit diesem Befehl können Sie eine vorhandene ACR in Ihrem Abonnement autorisieren und die entsprechende AcrPull Rolle für die verwaltete Identität konfigurieren.

export CLUSTER_NAME="myAKSCluster"
export CLUSTER_RESOURCE_GROUP="myClusterResourceGroup"

az group create \
  --name $CLUSTER_RESOURCE_GROUP \
  --location $LOCATION

az aks create \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --generate-ssh-keys \
  --attach-acr $MYACR

Verwenden eines ACR in einem anderen Abonnement oder Anfügen mithilfe der Ressourcen-ID

Wenn Sie ein ACR verwenden, das sich in einem anderen Abonnement als Ihrem AKS-Cluster befindet oder die ACR-Ressourcen-ID anstelle des ACR-Namens verwenden möchte, verwenden Sie die folgende Syntax. In diesem Beispiel wird die ACR_RESOURCE_ID Variable mithilfe der containerregistrierung erstellt, die im vorherigen Abschnitt erstellt wurde.

ACR_RESOURCE_ID=$(az acr show \
  --name $MYACR \
  --resource-group $ACR_RESOURCE_GROUP \
  --query id --output tsv)

az aks create \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --generate-ssh-keys \
  --attach-acr $ACR_RESOURCE_ID

Erstellen Sie einen neuen AKS-Cluster, und integrieren Sie es mit einem vorhandenen ACR mithilfe des New-AzAksCluster Cmdlets mit dem -AcrNameToAttach Parameter. Mit diesem Befehl können Sie eine vorhandene ACR in Ihrem Abonnement autorisieren und die entsprechende AcrPull Rolle für die verwaltete Identität konfigurieren.

$ClusterName = "myAKSCluster"
$ClusterResourceGroup = "myClusterResourceGroup"

New-AzResourceGroup -Name $ClusterResourceGroup -Location $Location

$NewCluster = @{
 Name = $ClusterName
 ResourceGroupName = $ClusterResourceGroup
 GenerateSshKey = $true
 AcrNameToAttach = $MyAcr
}

New-AzAksCluster @NewCluster

Ein ACR in einem anderen Abonnement verwenden oder mithilfe der Ressourcen-ID anhängen

Azure PowerShell unterstützt nur das Anfügen von ACR an AKS mithilfe des Parameters -AcrNameToAttach und unterstützt das Anfügen an eine ACR nicht über die Ressourcen-ID.

Erstellen Sie als Nächstes eine Ressourcengruppe und eine Azure Container Registry. In dieser Registrierung werden die Containerimages gespeichert, die Ihr AKS-Cluster später zieht.

locals {
 location           = "westcentralus"
 acr_name           = "myacr${random_string.suffix.result}"
 acr_resource_group = "myContainerRegistryResourceGroup"
}
resource "azurerm_resource_group" "acr_rg" {
 name     = local.acr_resource_group
 location = local.location
}
resource "azurerm_container_registry" "acr" {
 name                = local.acr_name
 resource_group_name = azurerm_resource_group.acr_rg.name
 location            = azurerm_resource_group.acr_rg.location
 sku                 = "Basic"
 admin_enabled       = false
}

Erstellen Sie nun den AKS-Cluster, der Bilder aus der Registrierung verwendet. Dieser Cluster verwendet eine vom System zugewiesene verwaltete Identität, der die Berechtigung zum Abrufen von Bildern erteilt wird.

locals {
 aks_name           = "myAKSCluster"
 aks_resource_group = "myClusterResourceGroup"
}
resource "azurerm_resource_group" "aks_rg" {
 name     = local.aks_resource_group
 location = local.location
}
resource "azurerm_kubernetes_cluster" "aks" {
 name                = local.aks_name
 location            = azurerm_resource_group.aks_rg.location
 resource_group_name = azurerm_resource_group.aks_rg.name
 dns_prefix          = local.aks_name
 identity {
   type = "SystemAssigned"
 }
 default_node_pool {
   name       = "systempool"
   node_count = 2
   vm_size    = "Standard_DS2_v2"
 }
}

In dieser Phase ist der AKS-Cluster vorhanden, hat aber noch keinen Zugriff auf die Containerregistrierung. Verwenden Sie in Azure CLI den Parameter --attach-acr. In Terraform weisen Sie die AcrPull Rolle explizit zu.

resource "azurerm_role_assignment" "aks_acr_pull" {
 scope                = azurerm_container_registry.acr.id
 role_definition_name = "AcrPull"
 principal_id         = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
}

Konfigurieren der ACR-Integration für einen vorhandenen AKS-Cluster

Sie können ein ACR an einen vorhandenen AKS-Cluster anfügen oder einen ACR von einem AKS-Cluster trennen, wenn Sie nicht mehr möchten, dass der Cluster Zugriff auf die Registrierung hat.

In den vorherigen Beispielen im Artikel wurde ein Azure Container Registry und ein Azure Kubernetes Service Cluster erstellt, der an die ACR angefügt ist. Im Folgenden finden Sie Beispiele zum Anfügen oder Trennen einer Containerregistrierung von einem Cluster und zum Verwenden des in diesem Artikel erstellten ACR- und AKS-Clusters. Sie können die Variablenwerte durch Ihre eigenen ACR- und AKS-Clusterwerte ersetzen.

Anfügen einer ACR an einen vorhandenen AKS-Cluster

Integrieren Sie einen vorhandenen ACR mit einem vorhandenen AKS-Cluster mithilfe des az aks update Befehls mit dem --attach-acr Parameter.

# Attach using acr-name
az aks update \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --attach-acr $MYACR


# Attach using acr-resource-id
az aks update \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --attach-acr $ACR_RESOURCE_ID

Der Befehl az aks update --attach-acr verwendet die Berechtigungen des Benutzers, der den Befehl zum Erstellen der ACR-Rollenzuweisung ausführt. Diese Rolle wird der verwalteten Kubelet-Identität zugewiesen. Weitere Informationen zu verwalteten AKS-Identitäten finden Sie unter Zusammenfassung der verwalteten Identitäten.

Integrieren Sie einen vorhandenen ACR mit einem vorhandenen AKS-Cluster mithilfe des Set-AzAksCluster Befehls mit dem -AcrNameToAttach Parameter.

$AttachCluster = @{
 Name = $ClusterName
 ResourceGroupName = $ClusterResourceGroup
 AcrNameToAttach = $MyAcr
}

Set-AzAksCluster @AttachCluster

Das Set-AzAksCluster -AcrNameToAttach Cmdlet verwendet die Berechtigungen des Benutzers, der den Befehl ausführt, um die Rollen-ACR-Zuweisung zu erstellen. Diese Rolle wird der verwalteten Kubelet-Identität zugewiesen. Weitere Informationen zu verwalteten AKS-Identitäten finden Sie unter Zusammenfassung der verwalteten Identitäten.

Wenn Ihr AKS-Cluster bereits vorhanden ist, können Sie ein ACR anfügen, indem Sie auf beide Ressourcen verweisen und dieselbe Rollenzuweisung erstellen.

data "azurerm_kubernetes_cluster" "existing_aks" {
 name                = "myAKSCluster"
 resource_group_name = "myClusterResourceGroup"
}
data "azurerm_container_registry" "existing_acr" {
 name                = "mycontainerregistry"
 resource_group_name = "myContainerRegistryResourceGroup"
}
resource "azurerm_role_assignment" "existing_aks_acr_pull" {
 scope                = data.azurerm_container_registry.existing_acr.id
 role_definition_name = "AcrPull"
 principal_id         = data.azurerm_kubernetes_cluster.existing_aks.kubelet_identity[0].object_id
}

Trennen einer ACR-Instanz von einem AKS-Cluster

Entfernen Sie die Integration zwischen ACR und einem AKS-Cluster mithilfe des az aks update Befehls mit dem --detach-acr Parameter.

# Detach using acr-name
az aks update \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --detach-acr $MYACR

# Detach using acr-resource-id
az aks update \
  --name $CLUSTER_NAME \
  --resource-group $CLUSTER_RESOURCE_GROUP \
  --detach-acr $ACR_RESOURCE_ID

Entfernen Sie die Integration zwischen ACR und einem AKS-Cluster mithilfe des Set-AzAksCluster Befehls mit dem -AcrNameToDetach Parameter.

$DetachCluster = @{
 Name = $ClusterName
 ResourceGroupName = $ClusterResourceGroup
 AcrNameToDetach = $MyAcr
}

Set-AzAksCluster @DetachCluster

Um den Zugriff zu entfernen, löschen Sie die Rollenzuweisung, die der Clusterberechtigung zum Abrufen von Bildern gewährt.

# Remove this resource to revoke access
# resource "azurerm_role_assignment" "existing_aks_acr_pull" {
#   scope                = data.azurerm_container_registry.existing_acr.id
#   role_definition_name = "AcrPull"
#   principal_id         = data.azurerm_kubernetes_cluster.existing_aks.kubelet_identity[0].object_id
# }

Initialisieren und Bereitstellen der Konfiguration

Nachdem Ihre Konfiguration abgeschlossen ist, initialisieren Sie Terraform, und überprüfen Sie den Ausführungsplan, bevor Sie sie anwenden.

terraform fmt
terraform init
terraform validate
terraform plan
terraform apply

An diesem Punkt ist Ihr AKS-Cluster so konfiguriert, dass Bilder von ACR abgerufen werden.

Sie können jetzt:

  • Importieren Sie Bilder in ACR.
  • Stellen Sie Arbeitslasten in AKS bereit.
  • Überprüfen Sie die Podbereitstellung.

Arbeiten mit ACR und AKS

Importieren Sie ein Image in Ihr ACR, und stellen Sie es dann in Ihrem AKS-Cluster bereit.

Importieren eines Images in Ihre ACR

Importieren Sie ein Bild aus Docker Hub mithilfe des Befehls az acr import in Ihr ACR.

az acr import \
  --name $MYACR \
  --source docker.io/library/nginx:latest \
  --image nginx:v1

Führen Sie die folgenden Befehle aus, um zu überprüfen, ob das Bild importiert wurde.

az acr repository show --name $MYACR --repository nginx
az acr repository show-tags --name $MYACR --repository nginx

Importieren Sie ein Bild aus Docker Hub mithilfe des Cmdlets Import-AzContainerRegistryImage in Ihr ACR.

$ImportImage = @{
 RegistryName = $MyAcr
 ResourceGroupName = $AcrResourceGroup
 SourceRegistryUri = 'docker.io'
 SourceImage = 'library/nginx:latest'
 TargetTag = 'nginx:v1'
}

Import-AzContainerRegistryImage @ImportImage

Führen Sie die folgenden Befehle aus, um zu überprüfen, ob das Bild importiert wurde.

Get-AzContainerRegistryRepository -RegistryName $MyAcr

Get-AzContainerRegistryTag -RegistryName $MyAcr -Repository nginx

Erstellen einer Bereitstellungsdatei

Erstellen Sie eine Kubernetes-Bereitstellung, die auf das in ACR importierte Image verweist. Wenn die Bereitstellung erfolgreich ist und das Image ordnungsgemäß heruntergeladen wird, ist Ihr AKS-Cluster ordnungsgemäß in ACR integriert.

Erstellen Sie eine Datei mit dem Namen acr-nginx.yaml mit dem folgenden Beispiel-YAML. Ersetzen Sie in der image Eigenschaft acr-Name durch den Namen Ihrer ACR. Führen Sie in Azure CLI echo $MYACR aus, um den ACR-Namen anzuzeigen. Führen Sie in Azure PowerShell $MyAcr aus, um den ACR-Namen anzuzeigen.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx0-deployment
  labels:
    app: nginx0-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx0
  template:
    metadata:
      labels:
        app: nginx0
    spec:
      containers:
      - name: nginx
        image: <acr-name>.azurecr.io/nginx:v1
        ports:
        - containerPort: 80

Erhalten von Anmeldeinformationen und Durchführung der Bereitstellung

  1. Stellen Sie sicher, dass Sie über die richtigen AKS-Anmeldeinformationen verfügen, indem Sie den Befehl az aks get-credentials verwenden.

    az aks get-credentials \
      --resource-group $CLUSTER_RESOURCE_GROUP \
      --name $CLUSTER_NAME
    
  2. Führen Sie die Bereitstellung in Ihrem AKS-Cluster mit dem Befehl kubectl apply aus.

    kubectl apply -f acr-nginx.yaml
    
  3. Überwachen Sie die Bereitstellung mit dem Befehl kubectl get pods.

    kubectl get pods
    

    Die Ausgabe sollte zwei ausgeführte Pods anzeigen, wie in der folgenden Beispielausgabe gezeigt:

    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx0-deployment-669dfc4d4b-x74kr   1/1     Running   0          20s
    nginx0-deployment-669dfc4d4b-xdpd6   1/1     Running   0          20s
    
  1. Stellen Sie sicher, dass Sie über die richtigen AKS-Anmeldeinformationen verfügen, indem Sie das Cmdlet Import-AzAksCredential verwenden.

    Import-AzAksCredential -ResourceGroupName $ClusterResourceGroup -Name $ClusterName
    
  2. Führen Sie die Bereitstellung in Ihrem AKS-Cluster mit dem Befehl kubectl apply aus.

    kubectl apply -f acr-nginx.yaml
    
  3. Überwachen Sie die Bereitstellung mit dem Befehl kubectl get pods.

    kubectl get pods
    

    Die Ausgabe sollte zwei ausgeführte Pods anzeigen, wie in der folgenden Beispielausgabe gezeigt:

    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx0-deployment-669dfc4d4b-x74kr   1/1     Running   0          20s
    nginx0-deployment-669dfc4d4b-xdpd6   1/1     Running   0          20s
    

Problembehandlung

Bereinigen von Ressourcen

Wenn Sie die in diesem Artikel erstellten Ressourcen nicht mehr benötigen, können Sie die Ressourcengruppen löschen, um alle zugehörigen Ressourcen zu entfernen. Diese Befehle löschen den ACR- und AKS-Cluster sowie die Clusterknotenressourcengruppe, die mit MC_ beginnt.

az group delete --name $ACR_RESOURCE_GROUP --yes --no-wait
az group delete --name $CLUSTER_RESOURCE_GROUP --yes --no-wait
Remove-AzResourceGroup -Name $AcrResourceGroup -Force
Remove-AzResourceGroup -Name $ClusterResourceGroup -Force