Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Quando si usa Registro Azure Container (ACR) con il servizio Azure Kubernetes, è necessario stabilire un meccanismo di autenticazione. È possibile configurare le autorizzazioni necessarie tra Azure Container Registry (ACR) e Azure Kubernetes Service (AKS) usando interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure. Questo articolo fornisce esempi per configurare l'autenticazione tra questi servizi Azure usando il interfaccia della riga di comando di Azure o l'Azure PowerShell.
L'integrazione di AKS con ACR assegna il ruolo AcrPull all'identità gestita Microsoft Entra ID associata al pool di agenti nel cluster AKS. Per altre informazioni sulle identità gestite del servizio Azure Kubernetes, vedere Riepilogo delle identità gestite.
Importante
Si è verificato un problema di latenza con i gruppi di Microsoft Entra quando si collega Azure Container Registry. Se il ruolo AcrPull viene concesso a un gruppo di Microsoft Entra e l'identità kubelet viene aggiunta al gruppo per completare la configurazione del controllo degli accessi in base al ruolo di Azure (Azure RBAC), potrebbe esserci un ritardo prima che il gruppo RBAC diventi effettivo. Se si esegue un'automazione che richiede che la configurazione del controllo degli accessi in base al ruolo di Azure sia completata, è consigliabile utilizzare Porta la tua identità kubelet come soluzione alternativa. È possibile precreare un'identità assegnata dall'utente, aggiungerla al gruppo Microsoft Entra, quindi utilizzare l'identità come identità kubelet per creare un cluster AKS. Questo metodo garantisce che l'identità venga aggiunta al gruppo di Microsoft Entra prima che venga generato un token da kubelet, evitando così il problema di latenza.
Note
Questo articolo illustra l'autenticazione automatica tra il servizio Azure Kubernetes e Registro Azure Container. Se è necessario eseguire il pull di un'immagine da un registro esterno privato, usare un segreto di pull dell’immagine.
Attenzione
L'integrazione AKS-ACR tramite az aks --attach-acr non è supportata per i registri ACR abilitati per ABAC, dove la modalità delle autorizzazioni di assegnazione dei ruoli è impostata su "RBAC Registry + ABAC Repository Permissions". I registri ACR abilitati per ABAC richiedono il Container Registry Repository Reader ruolo anziché il ruolo AcrPull per concedere le autorizzazioni di pull per l'immagine. Per i registri ACR abilitati per il controllo degli accessi basato sugli attributi, non è consigliabile usare az aks --attach-acr ma invece assegnare manualmente l'assegnazione di ruolo Container Registry Repository Reader utilizzando il portale di Azure, l'interfaccia della riga di comando az role assignment o Azure Resource Manager. Per altre informazioni sui registri ACR abilitati per il controllo degli accessi in base agli attributi, vedere controllo degli accessi in base agli attributi di Azure.
In questa procedura dettagliata viene configurato un cluster Servizio Azure Kubernetes (AKS) per eseguire il pull sicuro delle immagini da un Registro Azure Container (ACR). In interfaccia della riga di comando di Azure, usa --attach-acr. In Terraform, assegnare il ruolo AcrPull all'identità gestita kubelet del servizio Azure Kubernetes. Questa guida segue lo stesso flusso di lavoro del workflow di interfaccia della riga di comando di Azure durante l'utilizzo di Terraform per il provisioning dell'infrastruttura.
Prima di iniziare
- È necessario il ruolo di Owner, Amministratore dell'account Azure o Co-amministratore Azure nella sottoscrizione Azure.
- Per evitare la necessità di questi ruoli, è possibile utilizzare un'identità gestita esistente per autenticare l'Azure Container Registry dal Azure Kubernetes Service. Per ulteriori informazioni, vedere Usare un'identità gestita di Azure per autenticarsi su un ACR.
- Se si usa interfaccia della riga di comando di Azure, questo articolo richiede che sia in esecuzione interfaccia della riga di comando di Azure versione 2.7.0 o successiva. per trovare la versione, eseguire il
az --versioncomando . Se è necessario installare o aggiornare, vedere Installare interfaccia della riga di comando di Azure.
- Se si usa Azure PowerShell, questo articolo richiede di eseguire Azure PowerShell versione 5.9.0 o successiva. Per trovare la versione, eseguire il comando
Get-InstalledModule -Name Az. Se è necessario installare o aggiornare, vedere Installare Azure PowerShell. - Esempi e sintassi per l'uso di Terraform per la configurazione di Registro Azure Container sono disponibili nelle informazioni di riferimento su Terraform.
- Terraform installato (
>= 1.6). - Interfaccia della riga di comando di Azure installata e connessa alla sottoscrizione.
- Autorizzazioni per assegnare ruoli (proprietario o amministratore accesso utenti).
In questo articolo viene configurato un cluster Servizio Azure Kubernetes (AKS) per eseguire il pull sicuro delle immagini da un Registro Azure Container (ACR). In interfaccia della riga di comando di Azure, utilizza --attach-acr. In Terraform, assegnare il ruolo AcrPull all'identità gestita kubelet del servizio Azure Kubernetes.
Questo articolo segue lo stesso schema del flusso di lavoro di interfaccia della riga di comando di Azure quando si utilizza Terraform per il provisioning dell'infrastruttura. Per verificare di aver eseguito l'accesso alla sottoscrizione corretta, usare i comandi di interfaccia della riga di comando di Azure seguenti:
az login
az account show
Creare un nuovo servizio Registro Azure Container
Se non si dispone già un servizio Registro Azure Container, crearne uno usando il comando az acr create.
Il nome del Registro di sistema deve essere univoco a livello globale all'interno di Azure e contenere 5-50 caratteri alfanumerici, esclusi i caratteri trattini (-). Questo nome fa parte del nome DNS completamente qualificato del registro.
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
La RANDOM_STRING variabile archivia una stringa casuale a 10 cifre. Il MYACR valore è concatenato con il RANDOM_STRING valore per creare un nome univoco.
Se non si dispone già un servizio Registro Azure Container, crearne uno usando il cmdlet New-AzContainerRegistry.
Il nome del Registro di sistema deve essere univoco a livello globale all'interno di Azure e contenere 5-50 caratteri alfanumerici, esclusi i caratteri trattini (-). Questo nome fa parte del nome DNS completamente qualificato del registro.
$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
La $RandomString variabile archivia una stringa casuale a 10 cifre. Il $MyAcr valore è concatenato con il $RandomString valore per creare un nome univoco.
Creare un file di main.tf per la configurazione e iniziare definendo i provider Terraform e generando un suffisso univoco per i nomi di risorse univoci a livello globale. Un nome univoco globale garantisce che il nome Registro Azure Container non sia in conflitto con i registri esistenti.
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
}
Creare un nuovo cluster del servizio Azure Kubernetes e integrarlo con un servizio Registro Azure Container esistente
Creare un nuovo cluster AKS e integrarlo con un Azure Container Registry esistente usando il az aks create comando con il parametro --attach-acr. Questo comando consente di autorizzare un Azure Container Registry (ACR) esistente nella tua sottoscrizione e di configurare il ruolo AcrPull appropriato per l'identità gestita.
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
Usare un ACR in una sottoscrizione diversa o collegarsi usando l'ID risorsa
Se si utilizza un ACR situato in una sottoscrizione diversa dal cluster AKS o si preferisce usare l'ID risorsa dell'ACR anziché il nome dell'ACR, usare la sintassi seguente. In questo esempio viene creata la ACR_RESOURCE_ID variabile usando il registro contenitori creato nella sezione precedente.
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
Creare un nuovo cluster del servizio Azure Kubernetes e integrare con un Registro Azure Container esistente usando il cmdlet New-AzAksCluster con il parametro -AcrNameToAttach. Questo comando consente di autorizzare un Registro Azure Container esistente nella sottoscrizione e di configurare il ruolo AcrPull appropriato per l'identità gestita.
$ClusterName = "myAKSCluster"
$ClusterResourceGroup = "myClusterResourceGroup"
New-AzResourceGroup -Name $ClusterResourceGroup -Location $Location
$NewCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
GenerateSshKey = $true
AcrNameToAttach = $MyAcr
}
New-AzAksCluster @NewCluster
Usare un ACR in una sottoscrizione diversa o collegarsi usando l'ID risorsa
Azure PowerShell supporta solo il collegamento di ACR a AKS usando il parametro -AcrNameToAttach e non consente di collegarsi a un ACR tramite ID risorsa.
Creare quindi un gruppo di risorse e un Registro Azure Container. Questo registro archivia le immagini del contenitore che il tuo cluster AKS scarica successivamente.
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
}
Ora crea il cluster AKS che utilizza le immagini dal registro. Questo cluster usa un'identità gestita assegnata dal sistema, a cui verrà concessa l'autorizzazione per il pull delle immagini.
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 questa fase, il cluster AKS esiste, ma non ha ancora accesso al registro contenitori. In interfaccia della riga di comando di Azure usare il parametro --attach-acr. In Terraform si assegna in modo esplicito il AcrPull ruolo.
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
}
Configurare l'integrazione di Registro Azure Container per un cluster del servizio Azure Kubernetes esistente
È possibile collegare un registro Azure Container a un cluster del servizio Azure Kubernetes esistente o scollegare un registro Azure Container da un cluster del servizio Azure Kubernetes se non si vuole più che il cluster abbia accesso al Registro di sistema.
Gli esempi precedenti nell'articolo hanno creato un Registro Azure Container e un cluster di servizio Azure Kubernetes collegato all'Registro Azure Container. Di seguito sono riportati esempi di come collegare o scollegare un registro container da un cluster e usare il registro container di Azure (ACR) e il cluster del servizio Kubernetes di Azure (AKS) creati in questo articolo. È possibile sostituire i valori delle variabili con i propri valori per il cluster ACR e AKS.
Collegare un servizio Registro Azure Container a un cluster del servizio Azure Kubernetes esistente
Integrare un Azure Container Registry esistente con un cluster del servizio Azure Kubernetes esistente usando il comando az aks update con il parametro --attach-acr.
# 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
Il comando az aks update --attach-acr usa le autorizzazioni dell'utente che esegue il comando per creare l'assegnazione del ruolo di Registro Azure Container. Questo ruolo viene assegnato all'identità gestita kubelet. Per altre informazioni sulle identità gestite del servizio Azure Kubernetes, vedere Riepilogo delle identità gestite.
Integrare un Azure Container Registry esistente con un cluster del servizio Azure Kubernetes esistente usando il comando Set-AzAksCluster con il parametro -AcrNameToAttach.
$AttachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToAttach = $MyAcr
}
Set-AzAksCluster @AttachCluster
Il Set-AzAksCluster -AcrNameToAttach cmdlet usa le autorizzazioni dell'utente che esegue il comando per creare l'assegnazione del ruolo ACR. Questo ruolo viene assegnato all'identità gestita kubelet. Per altre informazioni sulle identità gestite del servizio Azure Kubernetes, vedere Riepilogo delle identità gestite.
Se il cluster AKS esiste già, è possibile collegare un Registro Azure Container riferendosi a entrambe le risorse e creando la stessa assegnazione di ruolo.
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
}
Scollegare un servizio Registro Azure Container da un cluster del servizio Azure Kubernetes
Rimuovere l'integrazione tra un Registro Azure Container e un cluster del servizio Azure Kubernetes usando il az aks update comando con il parametro --detach-acr.
# 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
Rimuovere l'integrazione tra un Registro Azure Container e un cluster del servizio Azure Kubernetes usando il Set-AzAksCluster comando con il parametro -AcrNameToDetach.
$DetachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToDetach = $MyAcr
}
Set-AzAksCluster @DetachCluster
Per rimuovere l'accesso, eliminare l'assegnazione di ruolo che concede l'autorizzazione del cluster a scaricare le immagini.
# 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
# }
Inizializzare e distribuire la configurazione
Al termine della configurazione, inizializzare Terraform ed esaminare il piano di esecuzione prima di applicarla.
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
A questo punto, il cluster AKS è configurato per recuperare le immagini da Azure Container Registry.
È ora possibile:
- Importare immagini nel Registro Azure Container.
- Distribuire carichi di lavoro su AKS.
- Verificare la distribuzione del pod.
Lavorare con Azure Container Registry e Azure Kubernetes Service
Importare un'immagine nel Registro Azure Container (ACR), quindi distribuirla al tuo cluster AKS.
Importare un'immagine in Registro Azure Container
Importare un'immagine da Docker Hub nel Azure Container Registry usando il comando az acr import.
az acr import \
--name $MYACR \
--source docker.io/library/nginx:latest \
--image nginx:v1
Eseguire i comandi seguenti per verificare che l'immagine sia stata importata.
az acr repository show --name $MYACR --repository nginx
az acr repository show-tags --name $MYACR --repository nginx
Importare un'immagine da Docker Hub nel Azure Container Registry usando il cmdlet Import-AzContainerRegistryImage.
$ImportImage = @{
RegistryName = $MyAcr
ResourceGroupName = $AcrResourceGroup
SourceRegistryUri = 'docker.io'
SourceImage = 'library/nginx:latest'
TargetTag = 'nginx:v1'
}
Import-AzContainerRegistryImage @ImportImage
Eseguire i comandi seguenti per verificare che l'immagine sia stata importata.
Get-AzContainerRegistryRepository -RegistryName $MyAcr
Get-AzContainerRegistryTag -RegistryName $MyAcr -Repository nginx
Creare un file di distribuzione
Creare una distribuzione Kubernetes che faccia riferimento all'immagine importata nel Registro Azure Container. Se il risultato della distribuzione è positivo e l'immagine viene pullata correttamente, il cluster AKS è correttamente integrato con Azure Container Registry.
Creare un file denominato acr-nginx.yaml usando il codice YAML di esempio seguente. Nella proprietà image, sostituire acr-name con il nome del tuo ACR. Nell'interfaccia della riga di comando di Azure, eseguire il comando echo $MYACR per visualizzare il nome del Registro Azure Container. In Azure PowerShell, eseguire $MyAcr per visualizzare il nome dell'ACR.
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
Ottenere le credenziali ed eseguire la distribuzione
Assicurarsi di disporre delle credenziali del servizio Azure Kubernetes appropriate usando il comando
az aks get-credentials.az aks get-credentials \ --resource-group $CLUSTER_RESOURCE_GROUP \ --name $CLUSTER_NAMEEseguire la distribuzione nel cluster del servizio Azure Kubernetes usando il comando
kubectl apply.kubectl apply -f acr-nginx.yamlMonitorare la distribuzione usando il comando
kubectl get pods.kubectl get podsL'output dovrebbe mostrare due pod in esecuzione, come illustrato nell'output di esempio seguente:
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Assicurarsi di disporre delle credenziali del servizio Azure Kubernetes appropriate usando il cmdlet
Import-AzAksCredential.Import-AzAksCredential -ResourceGroupName $ClusterResourceGroup -Name $ClusterNameEseguire la distribuzione nel cluster del servizio Azure Kubernetes usando il comando
kubectl apply.kubectl apply -f acr-nginx.yamlMonitorare la distribuzione usando il comando
kubectl get pods.kubectl get podsL'output dovrebbe mostrare due pod in esecuzione, come illustrato nell'output di esempio seguente:
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Risoluzione dei problemi
- Verificare che il Registro di sistema sia accessibile dal cluster del servizio Azure Kubernetes usando il comando
az aks check-acr. - Se il cluster AKS utilizza un proxy HTTP e il Registro Azure Container usa collegamento privato, aggiungere entrambi gli endpoint del Registro Azure Container (REST e dati) alla lista del cluster
noProxy. Per altre informazioni, vedere Supporto proxy HTTP nel servizio Azure Kubernetes. - Altre informazioni sul monitoraggio di Registro Azure Container.
- Altre informazioni sull'integrità di Registro Azure Container.
Pulire le risorse
Quando le risorse create in questo articolo non sono più necessarie, è possibile eliminare i gruppi di risorse per rimuovere tutte le risorse associate. Questi comandi eliminano il Registro Azure Container e il cluster del servizio Azure Kubernetes AKS, oltre al gruppo di risorse dei nodi del cluster che inizia con MC_.
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