Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Ao usar Azure Container Registry (ACR) com o Azure Kubernetes Service (AKS), é necessário estabelecer um mecanismo de autenticação. Pode configurar as permissões necessárias entre ACR e AKS usando o CLI do Azure, Azure PowerShell ou o portal Azure. Este artigo apresenta exemplos para configurar a autenticação entre estes serviços Azure usando a CLI do Azure ou Azure PowerShell.
A integração do AKS com o ACR atribui a função AcrPull à identidade gerida do Microsoft Entra ID associada ao pool de agentes no seu cluster AKS. Para obter mais informações sobre identidades gerenciadas pelo AKS, consulte Resumo de identidades gerenciadas.
Importante
Há um problema de latência com os grupos Microsoft Entra ao ligar o ACR. Se o papel AcrPull for atribuído a um grupo do Microsoft Entra e a identidade kubelet for adicionada ao grupo para completar a configuração do controlo de acesso baseado em papéis do Azure (Azure RBAC), pode haver um atraso antes de o grupo RBAC entrar em vigor. Se estiver a executar a automação que exige que a configuração do Azure RBAC esteja completa, recomendamos que use Bring your own kubelet identity como uma solução alternativa. Pode pré-criar uma identidade atribuída pelo utilizador, adicioná-la ao grupo Microsoft Entra e depois usar essa identidade como identidade kubelet para criar um cluster AKS. Este método garante que a identidade é adicionada ao grupo Microsoft Entra antes de um token ser gerado pelo kubelet, evitando assim o problema da latência.
Nota
Este artigo aborda a autenticação automática entre AKS e ACR. Se precisar obter uma imagem de um registo externo privado, utilize um segredo de obtenção de imagem.
Atenção
A integração az aks --attach-acr AKS-ACR através não é suportada para registos ACR habilitados por ABAC, onde o modo de permissões de atribuição de funções está definido para "Permissões do Registo RBAC + Repositório ABAC." Os registos ACR habilitados por ABAC requerem o Container Registry Repository Reader papel em vez do AcrPull papel para conceder permissões de puxar imagens. Para registos ACR com ABAC, não deve usar az aks --attach-acr, mas deve atribuir manualmente a função Container Registry Repository Reader usando o portal do Azure, a CLI az role assignment ou o Azure Resource Manager. Para mais informações sobre registos ACR habilitados por ABAC, consulte Azure controlo de acesso baseado em atributos.
Neste walkthrough, configura um cluster Azure Kubernetes Service (AKS) para extrair imagens de forma segura de um Azure Container Registry (ACR). Em CLI do Azure, use --attach-acr. No Terraform, atribua a AcrPull função à identidade gerida do kubelet do AKS. Este guia segue o mesmo fluxo de trabalho do CLI do Azure, utilizando o Terraform para o provisionamento de infraestruturas.
Antes de começar
- Precisa de um dos seguintes papéis: Proprietário, Administrador de conta do Azure, ou Co-administrador do Azure na sua subscrição do Azure.
- Para evitar a necessidade destes papéis, pode-se usar uma identidade gerida existente para autenticar o ACR a partir do AKS. Para mais informações, consulte Use uma identidade gerida Azure para autenticar num ACR.
- Se está a usar CLI do Azure, este artigo exige que esteja a correr a versão 2.7.0 ou posterior do CLI do Azure. Para encontrar a versão, execute o
az --versioncomando. Se precisares de instalar ou atualizar, vê Install CLI do Azure.
- Se estiveres a usar Azure PowerShell, este artigo exige que estejas a correr Azure PowerShell versão 5.9.0 ou posterior. Para localizar a versão, execute o
Get-InstalledModule -Name Azcomando. Se precisares de instalar ou atualizar, vê Install Azure PowerShell. - Exemplos e sintaxe para usar o Terraform para configurar o ACR podem ser encontrados na referência Terraform.
- Terraform instalado (
>= 1.6). - CLI do Azure instalado e iniciado sessão na sua subscrição.
- Permissões para atribuir funções (Proprietário ou Administrador de Acesso ao Utilizador).
Neste artigo, configura um cluster Azure Kubernetes Service (AKS) para extrair imagens de forma segura de um Azure Container Registry (ACR). Em CLI do Azure, use --attach-acr. No Terraform, atribuir a AcrPull função à identidade gerida pelo kubelet do AKS.
Este artigo segue o mesmo fluxo de trabalho do CLI do Azure, utilizando o Terraform para o provisionamento da infraestrutura. Para verificar se está iniciado sessão na subscrição correta, use os seguintes comandos do CLI do Azure:
az login
az account show
Criar um novo ACR
Se você ainda não tiver um ACR, crie um usando o az acr create comando.
O nome do registo deve ser globalmente único dentro de Azure e conter entre 5 a 50 caracteres alfanuméricos, excluindo os caracteres traço (-). Este nome faz parte do nome DNS totalmente qualificado do registo.
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
A RANDOM_STRING variável armazena uma sequência aleatória de 10 dígitos. O MYACR valor é concatenado com o RANDOM_STRING valor para criar um nome único.
Se você ainda não tiver um ACR, crie um usando o New-AzContainerRegistry cmdlet.
O nome do registo deve ser globalmente único dentro de Azure e conter entre 5 a 50 caracteres alfanuméricos, excluindo os caracteres traço (-). Este nome faz parte do nome DNS totalmente qualificado do registo.
$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
A $RandomString variável armazena uma sequência aleatória de 10 dígitos. O $MyAcr valor é concatenado com o $RandomString valor para criar um nome único.
Crie um ficheiro main.tf para a configuração e comece por definir os fornecedores Terraform e gerar um sufixo único para nomes de recursos globalmente únicos. Um nome globalmente único garante que o seu nome Azure Container Registry não conflita com registos existentes.
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
}
Crie um novo cluster AKS e integre-se com um ACR existente
Crie um novo cluster AKS e integre com um ACR existente usando o az aks create comando com o --attach-acr parâmetro. Este comando permite-lhe autorizar um ACR existente na sua subscrição e configura o papel apropriado AcrPull para a identidade gerida.
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
Use um ACR numa subscrição diferente ou anexe usando o ID do recurso
Se estiver a usar um ACR localizado numa subscrição diferente do seu cluster AKS ou preferir usar o ID de recurso ACR em vez do nome ACR, use a seguinte sintaxe. Este exemplo cria a ACR_RESOURCE_ID variável usando o registo de contentores criado na secção anterior.
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
Crie um novo cluster AKS e integre com um ACR existente usando o New-AzAksCluster cmdlet com o -AcrNameToAttach parâmetro. Este comando permite-lhe autorizar um ACR na sua subscrição existente e configura a função apropriada AcrPull para a identidade gerida.
$ClusterName = "myAKSCluster"
$ClusterResourceGroup = "myClusterResourceGroup"
New-AzResourceGroup -Name $ClusterResourceGroup -Location $Location
$NewCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
GenerateSshKey = $true
AcrNameToAttach = $MyAcr
}
New-AzAksCluster @NewCluster
Use um ACR numa subscrição diferente ou anexe usando o ID do recurso
Azure PowerShell só suporta ligar ACR ao AKS usando o parâmetro -AcrNameToAttach e não suporta ligar a um ACR por ID de recurso.
De seguida, crie um grupo de recursos e um Azure Container Registry. Este registo armazena as imagens de containers que o seu cluster AKS obtém posteriormente.
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
}
Agora cria o cluster AKS que consome imagens do registo. Este cluster utiliza uma identidade gerida atribuída pelo sistema, que terá permissão para extrair imagens.
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"
}
}
Nesta fase, o cluster AKS existe, mas ainda não tem acesso ao registo de contentores. Em CLI do Azure, usa o parâmetro --attach-acr. Em Terraform, atribuis explicitamente a AcrPull função.
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
}
Configurar a integração ACR para um cluster AKS existente
Podes ligar um ACR a um cluster AKS existente, ou separar um ACR de um cluster AKS se já não quiseres que o cluster tenha acesso ao registo.
Os exemplos anteriores no artigo criaram um Azure Container Registry e um cluster Azure Kubernetes Service ligados ao ACR. Seguem-se exemplos de como anexar ou separar um registo de contentores de um cluster e utilizar o cluster ACR e AKS criado neste artigo. Podes substituir os valores das variáveis pelos teus próprios valores de cluster ACR e AKS.
Anexar um ACR a um cluster AKS existente
Integre um ACR existente com um cluster AKS existente usando o az aks update comando com o --attach-acr parâmetro.
# 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
O az aks update --attach-acr comando usa as permissões do usuário que executa o comando para criar a atribuição de função ACR. Essa função é atribuída à identidade gerenciada pelo kubelet . Para obter mais informações sobre identidades gerenciadas pelo AKS, consulte Resumo de identidades gerenciadas.
Integre um ACR existente com um cluster AKS existente usando o Set-AzAksCluster comando com o -AcrNameToAttach parâmetro.
$AttachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToAttach = $MyAcr
}
Set-AzAksCluster @AttachCluster
O Set-AzAksCluster -AcrNameToAttach cmdlet utiliza as permissões do utilizador que executa o comando para criar a atribuição de funções ACR. Essa função é atribuída à identidade gerenciada pelo kubelet . Para obter mais informações sobre identidades gerenciadas pelo AKS, consulte Resumo de identidades gerenciadas.
Se o teu cluster AKS já existe, podes anexar um ACR referenciando ambos os recursos e criando a mesma atribuição de funções.
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
}
Desassociar um ACR de um cluster AKS
Remova a integração entre um ACR e um cluster AKS usando o az aks update comando com o --detach-acr parâmetro.
# 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
Remova a integração entre um ACR e um cluster AKS usando o Set-AzAksCluster comando com o -AcrNameToDetach parâmetro.
$DetachCluster = @{
Name = $ClusterName
ResourceGroupName = $ClusterResourceGroup
AcrNameToDetach = $MyAcr
}
Set-AzAksCluster @DetachCluster
Para remover o acesso, elimine a atribuição de função que concede permissão ao cluster para extrair imagens.
# 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
# }
Inicializar e implementar a configuração
Depois de concluída a sua configuração, inicialize o Terraform e reveja o plano de execução antes de aplicar.
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
Neste ponto, o teu cluster AKS está configurado para extrair imagens do ACR.
Agora pode:
- Importa imagens para ACR.
- Implementar cargas de trabalho no AKS.
- Verificar a implementação do pod.
Trabalhar com ACR e AKS
Importa uma imagem para o teu ACR e depois implementa essa imagem para o teu cluster AKS.
Importar uma imagem para o ACR
Importa uma imagem de Docker Hub para o teu ACR usando o comando az acr import.
az acr import \
--name $MYACR \
--source docker.io/library/nginx:latest \
--image nginx:v1
Execute os seguintes comandos para verificar se a imagem foi importada.
az acr repository show --name $MYACR --repository nginx
az acr repository show-tags --name $MYACR --repository nginx
Importa uma imagem da Docker Hub para o teu ACR usando o cmdlet Import-AzContainerRegistryImage.
$ImportImage = @{
RegistryName = $MyAcr
ResourceGroupName = $AcrResourceGroup
SourceRegistryUri = 'docker.io'
SourceImage = 'library/nginx:latest'
TargetTag = 'nginx:v1'
}
Import-AzContainerRegistryImage @ImportImage
Execute os seguintes comandos para verificar se a imagem foi importada.
Get-AzContainerRegistryRepository -RegistryName $MyAcr
Get-AzContainerRegistryTag -RegistryName $MyAcr -Repository nginx
Criar ficheiro de implementação
Crie uma implementação Kubernetes que faça referência à imagem que importou para o ACR. Se a implementação for bem-sucedida e a imagem for extraída corretamente, o cluster AKS está devidamente integrado com o ACR.
Crie um ficheiro chamado acr-nginx.yaml usando o seguinte exemplo YAML. Na image propriedade, substitua o nome ACR pelo nome do seu ACR. No CLI do Azure, executar echo $MYACR para mostrar o nome do ACR. Em Azure PowerShell, execute $MyAcr para mostrar o nome 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
Obtenha credenciais e execute a implementação
Certifique-se de ter as credenciais AKS adequadas usando o
az aks get-credentialscomando.az aks get-credentials \ --resource-group $CLUSTER_RESOURCE_GROUP \ --name $CLUSTER_NAMEExecute a implementação no cluster AKS usando o
kubectl applycomando.kubectl apply -f acr-nginx.yamlMonitore a implantação usando o
kubectl get podscomando.kubectl get podsA saída deve mostrar dois pods em execução, como mostrado no exemplo de saída a seguir:
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Certifique-se de ter as credenciais AKS adequadas usando o
Import-AzAksCredentialcmdlet.Import-AzAksCredential -ResourceGroupName $ClusterResourceGroup -Name $ClusterNameExecute a implementação no cluster AKS usando o
kubectl applycomando.kubectl apply -f acr-nginx.yamlMonitore a implantação usando o
kubectl get podscomando.kubectl get podsA saída deve mostrar dois pods em execução, como mostrado no exemplo de saída a seguir:
NAME READY STATUS RESTARTS AGE nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
Resolução de Problemas
- Valide se o registro está acessível a partir do cluster AKS usando o
az aks check-acrcomando. - Se o teu cluster AKS usar um proxy HTTP e o teu ACR usar Private Link, adiciona ambos os endpoints ACR (REST e dados) à lista do cluster
noProxy. Para obter mais informações, consulte Suporte a proxy HTTP no Serviço Kubernetes do Azure (AKS). - Saiba mais sobre a monitorização ACR.
- Saiba mais sobre a ACR Saúde.
Limpeza de recursos
Quando deixar de precisar dos recursos criados neste artigo, pode eliminar os grupos de recursos para remover todos os recursos associados. Estes comandos eliminam o ACR e o cluster AKS, assim como o grupo de recursos do nó do cluster que começa com 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