Azure コンテナー レジストリから Kubernetes クラスターにイメージをプルするPull images from an Azure container registry to a Kubernetes cluster

minikubekind などの "ローカルな" Kubernetes クラスターを含め、任意の Kubernetes クラスターで、Azure コンテナー レジストリをコンテナー イメージのソースとして使用できます。You can use an Azure container registry as a source of container images with any Kubernetes cluster, including "local" Kubernetes clusters such as minikube and kind. この記事では、Azure Active Directory サービス プリンシパルに基づいて Kubernetes のプル シークレットを作成する方法を示します。This article shows how to create a Kubernetes pull secret based on an Azure Active Directory service principal. 次に、シークレットを使用して、Kubernetes デプロイ内の Azure コンテナー レジストリからイメージをプルします。Then, use the secret to pull images from an Azure container registry in a Kubernetes deployment.

ヒント

マネージド Azure Kubernetes Service を使用している場合は、イメージのプルのために、ターゲットの Azure コンテナー レジストリとクラスターを統合することもできます。If you're using the managed Azure Kubernetes Service, you can also integrate your cluster with a target Azure container registry for image pulls.

この記事では、プライベート Azure コンテナー レジストリを作成済みであることを前提としています。This article assumes you already created a private Azure container registry. また、kubectl コマンドラインツールを介して、Kubernetes クラスターを実行し、アクセス可能にする必要があります。You also need to have a Kubernetes cluster running and accessible via the kubectl command-line tool.

サービス プリンシパルの作成Create a service principal

コンテナー レジストリへのアクセス権を持つサービス プリンシパルを作成するには、Azure Cloud Shell または Azure CLI のローカル インストールで、次のスクリプトを実行します。To create a service principal with access to your container registry, run the following script in the Azure Cloud Shell or a local installation of the Azure CLI. スクリプトは Bash シェル用に書式設定されています。The script is formatted for the Bash shell.

スクリプトを実行する前に、ACR_NAME 変数をコンテナー レジストリの名前で更新します。Before running the script, update the ACR_NAME variable with the name of your container registry. SERVICE_PRINCIPAL_NAME 値は、Azure Active Directory テナント内で一意である必要があります。The SERVICE_PRINCIPAL_NAME value must be unique within your Azure Active Directory tenant. "'http://acr-service-principal' already exists." エラーが発生した場合は、別のサービス プリンシパルの名前を指定します。If you receive an "'http://acr-service-principal' already exists." error, specify a different name for the service principal.

別のアクセス許可を付与する場合は、必要に応じて az ad sp create-for-rbac コマンドの --role の値を変更することができます。You can optionally modify the --role value in the az ad sp create-for-rbac command if you want to grant different permissions. ロールの一覧については、ACR のロールとアクセス許可に関するページを参照してください。For a complete list of roles, see ACR roles and permissions.

スクリプトを実行した後、サービス プリンシパルの IDパスワードを書き留めます。After you run the script, take note of the service principal's ID and password. その資格情報を作成したら、サービス プリンシパルとして、コンテナー レジストリに対する認証を受けるアプリケーションやサービスを構成できます。Once you have its credentials, you can configure your applications and services to authenticate to your container registry as the service principal.

#!/bin/bash

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=<container-registry-name>
SERVICE_PRINCIPAL_NAME=acr-service-principal

# Obtain the full registry ID for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
SP_PASSWD=$(az ad sp create-for-rbac --name http://$SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query password --output tsv)
SP_APP_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $SP_APP_ID"
echo "Service principal password: $SP_PASSWD"

既存のサービス プリンシパルの使用Use an existing service principal

既存のサービス プリンシパルにレジストリへのアクセスを与えるには、サービス プリンシパルに新しいロールを割り当てる必要があります。To grant registry access to an existing service principal, you must assign a new role to the service principal. 新しいサービス プリンシパルの作成と同様に、特に、プル、プッシュとプル、所有者のアクセスを付与できます。As with creating a new service principal, you can grant pull, push and pull, and owner access, among others.

次のスクリプトでは、az role assignment create コマンドを使って、SERVICE_PRINCIPAL_ID 変数で指定したサービス プリンシパルにプル アクセス許可を付与します。The following script uses the az role assignment create command to grant pull permissions to a service principal you specify in the SERVICE_PRINCIPAL_ID variable. 異なるレベルのアクセスを付与する場合は、--role の値を調整します。Adjust the --role value if you'd like to grant a different level of access.

#!/bin/bash

# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=mycontainerregistry
SERVICE_PRINCIPAL_ID=<service-principal-ID>

# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull

サービス プリンシパルのパスワードを保存していない場合や覚えていない場合は、az ad sp credential reset コマンドでリセットできます。If you don't save or remember the service principal password, you can reset it with the az ad sp credential reset command:

az ad sp credential reset  --name http://<service-principal-name> --query password --output tsv

このコマンドでは、サービス プリンシパルの新しい有効なパスワードが返されます。This command returns a new, valid password for your service principal.

イメージのプル シークレットを作成するCreate an image pull secret

Kubernetes では、イメージのプル シークレットを使用して、認証に必要な情報をレジストリに格納します。Kubernetes uses an image pull secret to store information needed to authenticate to your registry. Azure コンテナー レジストリのプル シークレットを作成するには、サービス プリンシパルの ID、パスワード、およびレジストリ URL を指定します。To create the pull secret for an Azure container registry, you provide the service principal ID, password, and the registry URL.

次の kubectl コマンドを使用してイメージのプル シークレットを作成します。Create an image pull secret with the following kubectl command:

kubectl create secret docker-registry <secret-name> \
    --namespace <namespace> \
    --docker-server=<container-registry-name>.azurecr.io \
    --docker-username=<service-principal-ID> \
    --docker-password=<service-principal-password>

各値の説明:where:

Value 説明Description
secret-name イメージのプル シークレットの名前 (例: acr-secret)Name of the image pull secret, for example, acr-secret
namespace シークレット格納先の Kubernetes 名前空間Kubernetes namespace to put the secret into
シークレットを、既定の名前空間以外の名前空間に配置する場合にのみ必要Only needed if you want to place the secret in a namespace other than the default namespace
container-registry-name Azure コンテナー レジストリの名前。例: myregistryName of your Azure container registry, for example, myregistry

--docker-server はレジストリ ログイン サーバーの完全修飾名ですThe --docker-server is the fully qualified name of the registry login server
service-principal-ID レジストリにアクセスするために Kubernetes によって使用されるサービス プリンシパルの IDID of the service principal that will be used by Kubernetes to access your registry
service-principal-password サービス プリンシパルのパスワードService principal password

イメージのプル シークレットを使用するUse the image pull secret

イメージのプル シークレットを作成したら、それを使用して Kubernetes のポッドとデプロイを作成できます。Once you've created the image pull secret, you can use it to create Kubernetes pods and deployments. デプロイ ファイルの imagePullSecrets の下にシークレットの名前を指定します。Provide the name of the secret under imagePullSecrets in the deployment file. 次に例を示します。For example:

apiVersion: v1
kind: Pod
metadata:
  name: my-awesome-app-pod
  namespace: awesomeapps
spec:
  containers:
    - name: main-app-container
      image: myregistry.azurecr.io/my-awesome-app:v1
      imagePullPolicy: IfNotPresent
  imagePullSecrets:
    - name: acr-secret

前の例では、my-awesome-app:v1 は、Azure コンテナー レジストリからプルするイメージの名前であり、acr-secret は、レジストリにアクセスするために作成したプル シークレットの名前です。In the preceding example, my-awesome-app:v1 is the name of the image to pull from the Azure container registry, and acr-secret is the name of the pull secret you created to access the registry. ポッドをデプロイすると、イメージがクラスター上にまだ存在しない場合、Kubernetes によって、レジストリからイメージが自動的にプルされます。When you deploy the pod, Kubernetes automatically pulls the image from your registry, if it is not already present on the cluster.

次のステップNext steps