Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
- Sie benötigen die Owner, Azure Kontoadministrator oder Azure co-administrator Rolle in Ihrem Azure-Abonnement.
- Um die Notwendigkeit dieser Rollen zu vermeiden, können Sie stattdessen eine vorhandene verwaltete Identität verwenden, um ACR von AKS zu authentifizieren. Weitere Informationen finden Sie unter Use an Azure managed identity to authenticate to an ACR.
- 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 --versionBefehl 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 Azaus, 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
Stellen Sie sicher, dass Sie über die richtigen AKS-Anmeldeinformationen verfügen, indem Sie den Befehl
az aks get-credentialsverwenden.az aks get-credentials \ --resource-group $CLUSTER_RESOURCE_GROUP \ --name $CLUSTER_NAMEFühren Sie die Bereitstellung in Ihrem AKS-Cluster mit dem Befehl
kubectl applyaus.kubectl apply -f acr-nginx.yamlÜberwachen Sie die Bereitstellung mit dem Befehl
kubectl get pods.kubectl get podsDie 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
Stellen Sie sicher, dass Sie über die richtigen AKS-Anmeldeinformationen verfügen, indem Sie das Cmdlet
Import-AzAksCredentialverwenden.Import-AzAksCredential -ResourceGroupName $ClusterResourceGroup -Name $ClusterNameFühren Sie die Bereitstellung in Ihrem AKS-Cluster mit dem Befehl
kubectl applyaus.kubectl apply -f acr-nginx.yamlÜberwachen Sie die Bereitstellung mit dem Befehl
kubectl get pods.kubectl get podsDie 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
- Überprüfen Sie mithilfe des Befehls
az aks check-acr, ob vom AKS-Cluster aus auf die Registrierung zugegriffen werden kann. - Wenn Ihr AKS-Cluster einen HTTP-Proxy verwendet und Ihr ACR Private Link nutzt, fügen Sie sowohl die ACR-Endpunkte (REST und Daten) zur Clusterliste
noProxyhinzu. Weitere Informationen finden Sie unter HTTP-Proxyunterstützung in Azure Kubernetes Service (AKS). - Weitere Informationen zur ACR-Überwachung.
- Weitere Informationen zur ACR-Integrität.
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