Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Lorsque vous utilisez Azure Container Registry (ACR) avec Azure Kubernetes Service (AKS), vous devez établir un mécanisme d’authentification. Vous pouvez configurer les autorisations requises entre ACR et AKS à l’aide du portail Azure CLI, Azure PowerShell ou Azure. Cet article fournit des exemples de configuration de l’authentification entre ces services Azure à l’aide du Azure CLI ou du Azure PowerShell.
L’intégration AKS à ACR affecte le rôle AcrPull à l’identité managée Microsoft Entra ID associée au pool d’agents dans votre cluster AKS. Pour plus d’informations sur les identités managées AKS, consultez Résumé des identités managées.
Important
Il existe un problème de latence avec les groupes Microsoft Entra lors de l’association à ACR. Si le rôle AcrPull est accordé à un groupe Microsoft Entra et que l’identité kubelet est ajoutée au groupe pour terminer la configuration du contrôle d’accès en fonction du rôle (Azure RBAC) Azure, il peut y avoir un délai avant que le groupe RBAC ne prenne effet. Si vous exécutez l'automatisation qui nécessite que la configuration RBAC Azure soit terminée, nous vous recommandons d'utiliser Bring your own kubelet identity comme solution de contournement. Vous pouvez créer au préalable une identité attribuée par l'utilisateur, l'ajouter au groupe Microsoft Entra, puis utiliser cette identité en tant qu'identité kubelet pour créer un cluster AKS. Cette méthode garantit que l’identité est ajoutée au groupe Microsoft Entra avant qu’un jeton soit généré par kubelet, ce qui évite le problème de latence.
Remarque
Cet article traite de l’authentification automatique entre AKS et ACR. Si vous devez extraire une image d’un registre externe privé, utilisez un secret d’extraction d’image.
Caution
L’intégration AKS-ACR par az aks --attach-acr n'est pas prise en charge dans les registres ACR activés pour ABAC, dans lesquels le mode d'autorisations d'attribution de rôle est défini sur « RBAC Registry + ABAC Repository Permissions ». Les registres ACR activés pour ABAC nécessitent le rôle Container Registry Repository Reader au lieu du rôle AcrPull pour accorder des autorisations d'extraction d'image. Pour les registres ACR compatibles avec ABAC, vous ne devez pas utiliser az aks --attach-acr, mais affecter manuellement l'attribution de rôle Container Registry Repository Reader à l'aide du portail Azure, az role assignment CLI ou Azure Resource Manager. Pour plus d’informations sur les registres ABAC avec ACR, consultez Azure contrôle d’accès basé sur les attributs.
Dans cette procédure pas à pas, vous allez configurer un cluster Azure Kubernetes Service (AKS) pour extraire en toute sécurité des images à partir d’un Azure Container Registry (ACR). Dans Azure CLI, utilisez --attach-acr. Dans Terraform, affectez le AcrPull rôle à l’identité managée AKS kubelet. Ce guide suit le même flux que le flux de travail Azure CLI lors de l’utilisation de Terraform pour l’approvisionnement d’infrastructure.
Avant de commencer
- Vous avez besoin du Owner, Azure administrateur de compte ou Azure rôle de coadministrateur sur votre abonnement Azure.
- Pour éviter d’avoir besoin de ces rôles, vous pouvez utiliser plutôt une identité managée existante pour authentifier ACR à partir d’AKS. Pour plus d’informations, consultez Utilisez une identité managée Azure pour vous authentifier auprès d’un ACR.
- Si vous utilisez Azure CLI, cet article nécessite que vous exécutez Azure CLI version 2.7.0 ou ultérieure. pour rechercher la version, exécutez la
az --versioncommande. Si vous devez installer ou mettre à niveau, consultez Installer Azure CLI.
- Si vous utilisez Azure PowerShell, cet article nécessite que vous exécutez Azure PowerShell version 5.9.0 ou ultérieure. Pour connaître la version de l’interface, exécutez la commande
Get-InstalledModule -Name Az. Si vous devez installer ou mettre à niveau, consultez Installer Azure PowerShell. - Vous trouverez des exemples et une syntaxe pour utiliser Terraform pour configurer ACR dans la référence Terraform.
- Terraform installé (
>= 1.6). - Azure CLI installé et connecté à votre abonnement.
- Autorisations d’attribution de rôles (propriétaire ou administrateur de l’accès utilisateur).
Dans cet article, vous allez configurer un cluster Azure Kubernetes Service (AKS) pour extraire en toute sécurité des images d’un Azure Container Registry (ACR). Dans Azure CLI, utilisez --attach-acr. Dans Terraform, affectez le rôle AcrPull à l’identité managée de kubelet AKS.
Cet article suit le même flux que le flux de travail Azure CLI lors de l’utilisation de Terraform pour l’approvisionnement d’infrastructure. Pour vérifier que vous êtes connecté à l'abonnement approprié, utilisez les commandes Azure CLI suivantes :
az login
az account show
Créez un nouveau ACR
Si vous n’avez pas encore de registre ACR, créez-en un à l’aide de la commande az acr create.
Le nom du registre doit être globalement unique dans Azure et contenir 5 à 50 caractères alphanumériques, à l’exception du caractère tiret (-). Ce nom fait partie du nom DNS complet du Registre.
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 variable stocke une chaîne à 10 chiffres aléatoire. La MYACR valeur est concaténée avec la RANDOM_STRING valeur pour créer un nom unique.
Si vous n’avez pas encore de registre ACR, créez-en un à l’aide de la cmdlet New-AzContainerRegistry.
Le nom du Registre doit être globalement unique dans Azure et contenir 5 à 50 caractères alphanumériques, sans les caractères de type tiret (-). Ce nom fait partie du nom DNS complet du Registre.
$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 variable stocke une chaîne à 10 chiffres aléatoire. La $MyAcr valeur est concaténée avec la $RandomString valeur pour créer un nom unique.
Créez un fichier main.tf pour la configuration, puis commencez par définir les fournisseurs Terraform et générez un suffixe unique pour les noms de ressources globaux uniques. Un nom global unique garantit que votre nom de Azure Container Registry n'est pas en conflit avec les registres existants.
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
}
Créer un cluster AKS et l’intégrer à un ACR existant
Créez un cluster AKS et intégrez-le à un ACR existant à l’aide de la az aks create commande avec le --attach-acr paramètre. Cette commande vous permet d’autoriser un ACR existant dans votre abonnement et de configurer le rôle approprié AcrPull pour l’identité managée.
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
Utiliser un ACR dans un autre abonnement ou attacher à l’aide de l’ID de ressource
Si vous utilisez un ACR situé dans un autre abonnement que votre cluster AKS ou si vous préférez utiliser l’ID de ressource ACR au lieu du nom ACR, utilisez la syntaxe suivante. Cet exemple crée la ACR_RESOURCE_ID variable à l’aide du registre de conteneurs créé dans la section précédente.
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
Créez un cluster AKS et intégrez-le à un ACR existant à l’aide de l’applet New-AzAksCluster de commande avec le -AcrNameToAttach paramètre. Cette commande vous permet d’autoriser un ACR existant dans votre abonnement et de configurer le rôle approprié AcrPull pour l’identité managée.
$ClusterName = "myAKSCluster"
$ClusterResourceGroup = "myClusterResourceGroup"
New-AzResourceGroup -Name $ClusterResourceGroup -Location $Location
$NewCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
GenerateSshKey = $true
AcrNameToAttach = $MyAcr
}
New-AzAksCluster @NewCluster
Utiliser un ACR dans un autre abonnement ou l'associer avec l’ID de ressource
Azure PowerShell prend uniquement en charge l'attachement d'ACR à AKS à l'aide du paramètre -AcrNameToAttach et ne prend pas en charge l'attachement à un ACR par resource ID.
Ensuite, créez un groupe de ressources et un Azure Container Registry. Ce Registre stocke les images conteneur que votre cluster AKS extrait ultérieurement.
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
}
Créez maintenant le cluster AKS qui utilise des images du registre. Ce cluster utilise une identité managée affectée par le système, qui sera autorisée à extraire des images.
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"
}
}
À ce stade, le cluster AKS existe, mais il n’a pas encore accès au registre de conteneurs. Dans Azure CLI, utilisez le paramètre --attach-acr. Dans Terraform, vous attribuez explicitement le AcrPull rôle.
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
}
Configurer une intégration ACR pour un cluster AKS existant
Vous pouvez attacher un ACR à un cluster AKS existant ou détacher un ACR d’un cluster AKS si vous ne souhaitez plus que le cluster ait accès au Registre.
Les exemples précédents de l’article ont créé un Azure Container Registry et un cluster Azure Kubernetes Service attaché à l’ACR. Voici des exemples d’attachement ou de détachement d’un registre de conteneurs à partir d’un cluster et d’utilisation du cluster ACR et AKS créés dans cet article. Vous pouvez remplacer les valeurs des variables par vos propres valeurs de cluster ACR et AKS.
Attacher un registre ACR à un cluster AKS existant
Intégrez un ACR existant à un cluster AKS existant à l’aide de la commande az aks update avec le paramètre --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
La commande az aks update --attach-acr utilise les autorisations de l’utilisateur qui exécute la commande pour créer l’attribution de rôle ACR. Ce rôle est attribué à l’identité managée kubelet. Pour plus d’informations sur les identités managées AKS, consultez Résumé des identités managées.
Intégrez un ACR existant à un cluster AKS existant à l’aide de la commande Set-AzAksCluster avec le paramètre -AcrNameToAttach.
$AttachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToAttach = $MyAcr
}
Set-AzAksCluster @AttachCluster
L’applet Set-AzAksCluster -AcrNameToAttach de commande utilise les autorisations de l’utilisateur exécutant la commande pour créer l’attribution de rôle ACR. Ce rôle est attribué à l’identité managée kubelet. Pour plus d’informations sur les identités managées AKS, consultez Résumé des identités managées.
Si votre cluster AKS existe déjà, vous pouvez attacher un ACR en référençant les deux ressources et en créant la même attribution de rôle.
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
}
Détacher un ACR d’un cluster AKS
Supprimez l’intégration entre un ACR et un cluster AKS à l’aide de la az aks update commande avec le --detach-acr paramètre.
# 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
Supprimez l’intégration entre un ACR et un cluster AKS à l’aide de la Set-AzAksCluster commande avec le -AcrNameToDetach paramètre.
$DetachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToDetach = $MyAcr
}
Set-AzAksCluster @DetachCluster
Pour supprimer l’accès, supprimez l’attribution de rôle qui accorde l’autorisation du cluster pour tirer des images.
# 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
# }
Initialiser et déployer la configuration
Une fois votre configuration terminée, initialisez Terraform et passez en revue le plan d’exécution avant d’appliquer.
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
À ce stade, votre cluster AKS est configuré pour extraire des images d’ACR.
Vous pouvez désormais :
- Importez des images dans ACR.
- Déployez des charges de travail sur AKS.
- Vérifier le pod de déploiement.
Utilisation d’ACR et AKS
Importez une image dans votre ACR, puis déployez cette image sur votre cluster AKS.
Importer une image dans votre instance ACR
Importez une image à partir de Docker Hub dans votre ACR à l’aide de la commande az acr import.
az acr import \
--name $MYACR \
--source docker.io/library/nginx:latest \
--image nginx:v1
Exécutez les commandes suivantes pour vérifier que l’image a été importée.
az acr repository show --name $MYACR --repository nginx
az acr repository show-tags --name $MYACR --repository nginx
Importez une image à partir de Docker Hub dans votre ACR à l’aide de l’applet de commande Import-AzContainerRegistryImage.
$ImportImage = @{
RegistryName = $MyAcr
ResourceGroupName = $AcrResourceGroup
SourceRegistryUri = 'docker.io'
SourceImage = 'library/nginx:latest'
TargetTag = 'nginx:v1'
}
Import-AzContainerRegistryImage @ImportImage
Exécutez les commandes suivantes pour vérifier que l’image a été importée.
Get-AzContainerRegistryRepository -RegistryName $MyAcr
Get-AzContainerRegistryTag -RegistryName $MyAcr -Repository nginx
Créer un fichier de déploiement
Créez un déploiement Kubernetes qui référence l’image que vous avez importée dans ACR. Si le déploiement réussit et que l’image est extraite correctement, votre cluster AKS est correctement intégré à ACR.
Créez un fichier nommé acr-nginx.yaml à l’aide de l’exemple YAML suivant. Dans la image propriété, remplacez acr-name par le nom de votre ACR. Dans Azure CLI, exécutez echo $MYACR pour afficher le nom ACR. Dans Azure PowerShell, exécutez $MyAcr pour afficher le nom 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
Obtenir les informations d’identification et exécuter le déploiement
Vérifiez que vous disposez des informations d’identification AKS appropriées à l’aide de la commande
az aks get-credentials.az aks get-credentials \ --resource-group $CLUSTER_RESOURCE_GROUP \ --name $CLUSTER_NAMEExécutez le déploiement dans votre cluster AKS à l’aide de la commande
kubectl apply.kubectl apply -f acr-nginx.yamlSurveillez le déploiement à l’aide de la commande
kubectl get pods.kubectl get podsLa sortie doit afficher deux pods en cours d’exécution, comme indiqué dans l’exemple de sortie suivant :
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Vérifiez que vous disposez des informations d’identification AKS appropriées à l’aide de la cmdlet
Import-AzAksCredential.Import-AzAksCredential -ResourceGroupName $ClusterResourceGroup -Name $ClusterNameExécutez le déploiement dans votre cluster AKS à l’aide de la commande
kubectl apply.kubectl apply -f acr-nginx.yamlSurveillez le déploiement à l’aide de la commande
kubectl get pods.kubectl get podsLa sortie doit afficher deux pods en cours d’exécution, comme indiqué dans l’exemple de sortie suivant :
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Dépannage
- Vérifiez que le registre est accessible à partir du cluster AKS à l’aide de la commande
az aks check-acr. - Si votre cluster AKS utilise un proxy HTTP et que votre ACR utilise Private Link, ajoutez les points de terminaison ACR (REST et données) au cluster
noProxylist. Pour plus d’informations, consultez la prise en charge du proxy HTTP dans Azure Kubernetes Service (AKS). - En savoir plus sur la surveillance ACR.
- En savoir plus sur la santé ACR.
Nettoyer les ressources
Lorsque vous n’avez plus besoin des ressources créées dans cet article, vous pouvez supprimer les groupes de ressources pour supprimer toutes les ressources associées. Ces commandes suppriment les clusters ACR et AKS et le groupe de ressources des nœuds de cluster qui commencent par 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
Contenu connexe
- Utilisez une identité managée pour vous authentifier auprès d’un registre de conteneurs Azure
- La prise en charge du proxy HTTP dans le service Azure Kubernetes (AKS)