プル シークレットを使用して Azure コンテナー レジストリから Kubernetes クラスターにイメージをプルする

minikubekind などの "ローカルな" Kubernetes クラスターを含め、任意の Kubernetes クラスターで、Azure コンテナー レジストリをコンテナー イメージのソースとして使用できます。 この記事では、Azure コンテナー レジストリの資格情報を使用して Kubernetes プル シークレットを作成する方法について説明します。 次に、シークレットを使用して、ポッド デプロイ内の Azure コンテナー レジストリからイメージをプルします。

この例では、Microsoft Entra のサービス プリンシパルの資格情報を使用して、プル シークレットを作成します。 また、リポジトリ スコープのアクセス トークンなど、他の Azure コンテナー レジストリの資格情報を使用して、プル シークレットを構成することもできます。

Note

プル シークレットは一般的に使用されますが、追加の管理オーバーヘッドが発生します。 Azure Kubernetes Service を使用している場合は、クラスターのマネージド ID やサービス プリンシパルなどの他のオプションを使用し、各ポッドで imagePullSecrets を追加設定することなく、イメージを安全にプルすることをお勧めします。

前提条件

この記事では、プライベート Azure コンテナー レジストリを作成済みであることを前提としています。 また、kubectl コマンドラインツールを介して、Kubernetes クラスターを実行し、アクセス可能にする必要があります。

サービス プリンシパルの作成

コンテナー レジストリへのアクセス権を持つサービス プリンシパルを作成するには、Azure Cloud Shell または Azure CLI のローカル インストールで、次のスクリプトを実行します。 スクリプトは Bash シェル用に書式設定されています。

スクリプトを実行する前に、ACR_NAME 変数をコンテナー レジストリの名前で更新します。 SERVICE_PRINCIPAL_NAME の値は、Microsoft Entra テナント内で一意である必要があります。 "'http://acr-service-principal' already exists." エラーが発生した場合は、別のサービス プリンシパルの名前を指定します。

別のアクセス権を付与する場合は、必要に応じて --role コマンドの --role の値を変更することができます。 ロールの一覧については、ACR のロールとアクセス許可に関するページを参照してください。

スクリプトを実行した後、サービス プリンシパルの IDパスワードを書き留めます。 その資格情報を作成したら、サービス プリンシパルとして、コンテナー レジストリに対する認証を受けるアプリケーションやサービスを構成できます。

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# 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=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# 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
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $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: $USER_NAME"
echo "Service principal password: $PASSWORD"

既存のサービス プリンシパルの使用

既存のサービス プリンシパルにレジストリへのアクセスを与えるには、サービス プリンシパルに新しいロールを割り当てる必要があります。 新しいサービス プリンシパルの作成と同様に、特に、プル、プッシュとプル、所有者のアクセスを付与できます。

次のスクリプトでは、az role assignment create コマンドを使って、SERVICE_PRINCIPAL_ID 変数で指定したサービス プリンシパルにプル アクセス許可を付与します。 異なるレベルのアクセスを付与する場合は、--role の値を調整します。

#!/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=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal

# 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 コマンドでリセットできます。

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

このコマンドでは、サービス プリンシパルの新しい有効なパスワードが返されます。

イメージのプル シークレットを作成する

Kubernetes では、イメージのプル シークレットを使用して、認証に必要な情報をレジストリに格納します。 Azure コンテナー レジストリのプル シークレットを作成するには、サービス プリンシパルの ID、パスワード、およびレジストリ URL を指定します。

次の kubectl コマンドを使用してイメージのプル シークレットを作成します。

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>

各値の説明:

説明
secret-name イメージのプル シークレットの名前 (例: acr-secret)
namespace シークレット格納先の Kubernetes 名前空間
シークレットを、既定の名前空間以外の名前空間に配置する場合にのみ必要
container-registry-name Azure コンテナー レジストリの名前。例: myregistry

--docker-server はレジストリ ログイン サーバーの完全修飾名です
service-principal-ID レジストリにアクセスするために Kubernetes によって使用されるサービス プリンシパルの ID
service-principal-password サービス プリンシパルのパスワード

イメージのプル シークレットを使用する

イメージのプル シークレットを作成したら、それを使用して Kubernetes のポッドとデプロイを作成できます。 デプロイ ファイルの imagePullSecrets の下にシークレットの名前を指定します。 次に例を示します。

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 はそのレジストリにアクセスするために作成したプル シークレットの名前です。 ポッドをデプロイすると、イメージがクラスター上にまだ存在しない場合、Kubernetes によって、レジストリからイメージが自動的にプルされます。

次のステップ