Azure Kubernetes Service から Azure Container Registry の認証を受けるAuthenticate with Azure Container Registry from Azure Kubernetes Service

Azure Kubernetes Service (AKS) で Azure Container Registry (ACR) を使用する場合は、認証メカニズムを確立する必要があります。When you're using Azure Container Registry (ACR) with Azure Kubernetes Service (AKS), an authentication mechanism needs to be established. この記事では、この 2 つの Azure サービス間で認証を行う場合に推奨される構成について詳しく説明します。This article details the recommended configurations for authentication between these two Azure services.

これらのいずれかの認証方法のみを構成する必要があります。You only need to configure one of these authentication methods. 最も一般的な手法は、AKS サービス プリンシパルを使用してアクセス権を付与することです。The most common approach is to grant access using the AKS service principal. 特定のニーズがある場合、必要に応じて Kubernetes シークレットを使用してアクセス権を付与することができます。If you have specific needs, you can optionally grant access using Kubernetes secrets.

この記事では、AKS クラスターを既に作成しており、kubectl コマンド ライン クライアントを使用してクラスターにアクセスできることを前提としています。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.

ACR へのアクセス許可を AKS に付与するGrant AKS access to ACR

AKS クラスターを作成するとき、Azure は他の Azure リソースとのクラスター運用性をサポートするサービス プリンシパルも作成します。When you create an AKS cluster, Azure also creates a service principal to support cluster operability with other Azure resources. この自動生成されるサービス プリンシパルは、ACR レジストリでの認証に使用できます。You can use this auto-generated service principal for authentication with an ACR registry. これを行うには、コンテナー レジストリに対するクラスターのサービス プリンシパルのアクセスを付与する Azure AD のロールの割り当てを作成する必要があります。To do so, you need to create an Azure AD role assignment that grants the cluster's service principal access to the container registry.

AKS によって生成された、Azure Container Registry に対するサービス プリンシパルのプル アクセスを付与するには、次のスクリプトを使用します。Use the following script to grant the AKS-generated service principal pull access to an Azure container registry. スクリプトを実行する前に、環境に合わせて AKS_* および ACR_* 変数を変更してください。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

Kubernetes シークレットを使用したアクセスAccess with Kubernetes secret

場合によっては、自動生成された AKS サービス プリンシパルに対して、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. たとえば、組織のセキュリティ モデルにより、AKS によって生成されたサービス プリンシパルにロールを割り当てるための十分なアクセス許可が Azure Active Directory テナントに存在しない場合があります。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. サービス プリンシパルにロールを割り当てるには、Azure AD アカウントに Azure AD テナントへの書き込みアクセス許可が付与されている必要があります。Assigning a role to a service principal requires your Azure AD account to have write permission to your Azure AD tenant. アクセス許可がない場合は、新しいサービス プリンシパルを作成し、Kubernetes のイメージ プル シークレットを使用してコンテナー レジストリへのアクセスを付与することができます。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.

新しいサービス プリンシパルを作成するには次のスクリプトを使用します (この資格情報を Kubernetes のイメージ プル シークレット用に使用します)。Use the following script to create a new service principal (you'll use its credentials for the Kubernetes image pull secret). スクリプトを実行する前に、環境に合わせて ACR_NAME 変数を変更してください。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"

これで、サービス プリンシパルの資格情報を Kubernetes のイメージ プル シークレットに格納し、AKS クラスターがコンテナーを実行するときに参照できるようになりました。You can now store the service principal's credentials in a Kubernetes image pull secret, which your AKS cluster will reference when running containers.

次の kubectl コマンドを使用して、Kubernetes シークレットを作成します。Use the following kubectl command to create the Kubernetes secret. <acr-login-server> を Azure コンテナー レジストリの完全修飾名に置き換えます ("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"). <service-principal-ID> および <service-principal-password> を、前のスクリプトを実行して取得した値に置き換えます。Replace <service-principal-ID> and <service-principal-password> with the values you obtained by running the previous script. <email-address> を整形式の任意の電子メール アドレスに置き換えます。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>

imagePullSecrets パラメーターに名前を指定することで (この場合は、"acr auth")、ポッドのデプロイメントで Kubernetes シークレットを使用できるようになりました。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