Ověřování pomocí Azure Container Registry ze služby Azure KubernetesAuthenticate with Azure Container Registry from Azure Kubernetes Service

Pokud používáte Azure Container Registry (ACR) s Azure Kubernetes Service (AKS), je potřeba navázat mechanismus ověřování.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.

Tento článek předpokládá, že jste již vytvořili AKS cluster a budete moct 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.

AKS udělit přístup do služby ACRGrant AKS access to ACR

Při vytváření clusteru AKS Azure také vytvoří službu objektu zabezpečení pro podporu funkčnost clusteru v jiných prostředcích Azure.When you create an AKS cluster, Azure also creates a service principal to support cluster operability with other Azure resources. Použít tento instanční objekt služby pro automaticky generované pro ověřování pomocí registru služby ACR.You can use this auto-generated service principal for authentication with an ACR registry. K tomu je potřeba vytvořit i službu Azure AD přiřazení role , který uděluje do registru kontejneru clusteru přístup k hlavní službě.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 pro udělení přístupu služby AKS generovány instančního objektu o přijetí změn do služby Azure container registry.Use the following script to grant the AKS-generated service principal pull access to an Azure container registry. Upravit AKS_* a ACR_* proměnné pro vaše prostředí před spuštěním skriptu.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 pomocí tajného klíče KubernetesAccess with Kubernetes secret

V některých případech nemusí být možné přiřadit požadované role automaticky generované AKS instančnímu objektu služby se uděluje přístup do služby 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. Díky modelu zabezpečení vaší organizace například nemusí mít dostatečná oprávnění ve vašem tenantovi Azure Active Directory na přiřazení role ve službě AKS generovány instančního objektu.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 instančnímu objektu služby vyžaduje váš účet Azure AD oprávnění k zápisu do svého tenanta 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 kontejnerů pomocí tajného klíče Kubernetes obrázek o přijetí změn.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 (budete používat svoje přihlašovací údaje pro tajného kódu Kubernetes obrázek o přijetí změn).Use the following script to create a new service principal (you'll use its credentials for the Kubernetes image pull secret). Upravit ACR_NAME proměnné pro vaše prostředí před spuštěním skriptu.Modify 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"

Nyní můžete ukládat přihlašovací údaje instančního objektu v Kubernetes tajný klíč o přijetí změn image, který bude odkazovat na clusteru AKS při spuštěné kontejnery.You can now store the service principal's credentials in a Kubernetes image pull secret, which your AKS cluster will reference when running containers.

Pomocí následujících kubectl příkaz pro vytvoření tajného kódu Kubernetes.Use the following kubectl command to create the Kubernetes secret. Nahraďte <acr-login-server> s plně kvalifikovaným názvem vašeho registru kontejneru Azure (to je 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"). Nahraďte <service-principal-ID> a <service-principal-password> hodnotami, které jste získali pomocí skriptu pro předchozí.Replace <service-principal-ID> and <service-principal-password> with the values you obtained by running the previous script. Nahraďte <email-address> s libovolnou adresu ve správném formátu e-mailu.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>

Nyní můžete tajného kódu Kubernetes v podu nasazení tak, že zadáte jeho název (v tomto případě "acr vícefaktorového ověřování") v imagePullSecrets parametr: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