Ověření pomocí Azure Container Registry služby Azure KubernetesAuthenticate with Azure Container Registry from Azure Kubernetes Service

Pokud používáte Azure Container Registry (ACR) se službou Azure Kubernetes Service (AKS), je nutné vytvořit ověřovací mechanismus.When you're using Azure Container Registry (ACR) with Azure Kubernetes Service (AKS), an authentication mechanism needs to be established. Tento článek podrobně popisuje doporučené konfigurace pro ověřování mezi těmito dvěma službami Azure.This article details the recommended configurations for authentication between these two Azure services.

Musíte nakonfigurovat jenom jednu z těchto metod ověřování.You only need to configure one of these authentication methods. Nejběžnějším přístupem je udělení přístupu pomocí instančního objektu služby AKS.The most common approach is to grant access using the AKS service principal. Pokud máte konkrétní potřeby, můžete volitelně udělit přístup pomocí tajných klíčů Kubernetes.If you have specific needs, you can optionally grant access using Kubernetes secrets.

V tomto článku se předpokládá, že jste už vytvořili cluster AKS a máte přístup ke clusteru pomocí kubectl klienta příkazového řádku.This article assumes that you've already created an AKS cluster and you are able to access the cluster with the kubectl command-line client.

Udělení přístupu AKS k ACRGrant AKS access to ACR

Když vytvoříte cluster AKS, Azure taky vytvoří instanční objekt, který bude podporovat cluster operability s dalšími prostředky Azure.When you create an AKS cluster, Azure also creates a service principal to support cluster operability with other Azure resources. Tento automaticky generovaný instanční objekt můžete použít k ověřování pomocí registru ACR.You can use this auto-generated service principal for authentication with an ACR registry. K tomu je potřeba vytvořit přiřazení role Azure AD, které udělí instančnímu objektu clusteru přístup k registru kontejneru.To do so, you need to create an Azure AD role assignment that grants the cluster's service principal access to the container registry.

Pomocí následujícího skriptu udělte instančnímu objektu služby, který je vygenerovaný AKS, přístup k službě Azure Container Registry.Use the following script to grant the AKS-generated service principal pull access to an Azure container registry. Před spuštěním skriptu ACR_* upravte proměnné aprovašeprostředí.AKS_*Modify the AKS_* and ACR_* variables for your environment before running the script.

#!/bin/bash

AKS_RESOURCE_GROUP=myAKSResourceGroup
AKS_CLUSTER_NAME=myAKSCluster
ACR_RESOURCE_GROUP=myACRResourceGroup
ACR_NAME=myACRRegistry

# Get the id of the service principal configured for AKS
CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv)

# Get the ACR registry resource id
ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv)

# Create role assignment
az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID

Přístup s tajným klíčem KubernetesAccess with Kubernetes secret

V některých případech možná nebudete moci přiřadit požadovanou roli k automaticky generovanému instančnímu objektu AKS, který uděluje přístup k ACR.In some instances, you might not be able to assign the required role to the auto-generated AKS service principal granting it access to ACR. Například vzhledem k modelu zabezpečení vaší organizace, možná nemáte dostatečná oprávnění ve vašem tenantovi Azure Active Directory pro přiřazení role k instančnímu objektu generovanému službou AKS.For example, due to your organization's security model, you might not have sufficient permissions in your Azure Active Directory tenant to assign a role to the AKS-generated service principal. Přiřazení role k instančnímu objektu vyžaduje, aby měl váš účet Azure AD oprávnění k zápisu do vašeho tenanta služby Azure AD.Assigning a role to a service principal requires your Azure AD account to have write permission to your Azure AD tenant. Pokud nemáte oprávnění, můžete vytvořit nový instanční objekt a pak mu udělit přístup k registru kontejneru pomocí tajného klíče pro vyžádání obsahu Kubernetes image.If you don't have permission, you can create a new service principal, then grant it access to the container registry using a Kubernetes image pull secret.

Pomocí následujícího skriptu vytvořte nový instanční objekt (použijete jeho přihlašovací údaje pro získání tajného klíče pro stažení Image Kubernetes).Use the following script to create a new service principal (you'll use its credentials for the Kubernetes image pull secret). Před spuštěním skriptu upravte proměnnouprostředí.ACR_NAMEModify the ACR_NAME variable for your environment before running the script.

#!/bin/bash

ACR_NAME=myacrinstance
SERVICE_PRINCIPAL_NAME=acr-service-principal

# Populate the ACR login server and resource id.
ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv)
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Create acrpull role assignment with a scope of the ACR resource.
SP_PASSWD=$(az ad sp create-for-rbac --name http://$SERVICE_PRINCIPAL_NAME --role acrpull --scopes $ACR_REGISTRY_ID --query password --output tsv)

# Get the service principal client id.
CLIENT_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)

# Output used when creating Kubernetes secret.
echo "Service principal ID: $CLIENT_ID"
echo "Service principal password: $SP_PASSWD"

Přihlašovací údaje instančního objektu teď můžete ukládat v tajném klíči pro vyžádáníobsahu Kubernetes image, který váš cluster AKS bude odkazovat na spuštění kontejnerů.You can now store the service principal's credentials in a Kubernetes image pull secret, which your AKS cluster will reference when running containers.

K vytvoření tajného klíče Kubernetes použijte následující příkaz kubectl .Use the following kubectl command to create the Kubernetes secret. Nahraďte <acr-login-server> plně kvalifikovaným názvem vašeho registru služby Azure Container Registry (ve formátu "acrname.azurecr.IO").Replace <acr-login-server> with the fully qualified name of your Azure container registry (it's in the format "acrname.azurecr.io"). Hodnoty <service-principal-ID> a<service-principal-password> nahraďte hodnotami, které jste získali spuštěním předchozího skriptu.Replace <service-principal-ID> and <service-principal-password> with the values you obtained by running the previous script. Nahraďte <email-address> libovolnou správně vytvořenou e-mailovou adresou.Replace <email-address> with any well-formed email address.

kubectl create secret docker-registry acr-auth --docker-server <acr-login-server> --docker-username <service-principal-ID> --docker-password <service-principal-password> --docker-email <email-address>

V rámci nasazení teď můžete použít tajný klíč Kubernetes zadáním jeho názvu (v tomto případě "ACR-auth") v imagePullSecrets parametru:You can now use the Kubernetes secret in pod deployments by specifying its name (in this case, "acr-auth") in the imagePullSecrets parameter:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: acr-auth-example
spec:
  template:
    metadata:
      labels:
        app: acr-auth-example
    spec:
      containers:
      - name: acr-auth-example
        image: myacrregistry.azurecr.io/acr-auth-example
      imagePullSecrets:
      - name: acr-auth