Azure コンテナー レジストリは、 minikube や 種類などの "ローカル" Kubernetes クラスターなど、任意の Kubernetes クラスターでコンテナー イメージのソースとして使用できます。 この記事では、Azure コンテナー レジストリの資格情報を使用して Kubernetes プル シークレットを作成する方法について説明します。 次に、シークレットを使用して、ポッド デプロイ内の Azure コンテナー レジストリからイメージをプルします。
この例では、Microsoft Entra サービス プリンシパルの資格情報を使用してプル シークレットを作成します。 必要に応じて、 Microsoft Entra ベースのリポジトリのアクセス許可を使用して、サービス プリンシパルのプルアクセス許可のスコープをレジストリ内の特定のリポジトリに設定できます。
Microsoft Entra 以外のトークン ベースのリポジトリアクセス許可の使用など、他の Azure コンテナー レジストリ資格情報を使用してプル シークレットを構成することもできます。
注
プル シークレットは一般的に使用されますが、追加の管理オーバーヘッドが発生します。
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
の値を変更することができます。 ロールの完全な一覧については、「 Azure Container Registry Entra のアクセス許可とロールの概要」を参照してください。
スクリプトを実行したら、サービス プリンシパルの 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"
既存のサービス プリンシパルの使用
既存のサービス プリンシパルにレジストリへのアクセスを与えるには、サービス プリンシパルに新しいロールを割り当てる必要があります。 新しいサービス プリンシパルを作成する場合と同様に、ロールの割り当てを実行して、サービス プリンシパルにアクセス許可を付与する必要があります。 Azure Container Registry Entra のアクセス許可とロールの概要を参照してください。
次のスクリプトでは、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 によって、レジストリからイメージが自動的にプルされます。
次のステップ
- サービス プリンシパルと Azure Container Registry の操作の詳細については、サービス プリンシパルを使用した Azure Container Registry 認証に関するページを参照してください。
- Kubernetes ドキュメントでイメージ プル シークレットの詳細を確認する