Azure Kubernetes Service から Azure Container Registry の認証を受ける
Azure Kubernetes Service (AKS) で Azure Container Registry (ACR) を使用するときは、認証メカニズムを確立する必要があります。 ACR と AKS の間で必要なアクセス許可を構成するには、Azure CLI、Azure PowerShell、Azure portal を使用します。 この記事では、Azure CLI または Azure PowerShell を使用してこれらの Azure サービス間の認証を構成する例を示します。
AKS から ACR の統合により、AKS クラスター内のエージェント プールに関連付けられている Azure Active Directory (Azure AD) マネージド ID に AcrPull ロールが割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。
重要
ACR をアタッチするときに、Azure Active Directory グループに関する待ち時間の問題があります。 Azure AD グループに AcrPull ロールが付与されている場合、kubelet ID をグループに追加して RBAC の構成を完了すると、RBAC グループが有効になるまでに遅延が発生する可能性があります。 RBAC 構成を完了する必要がある自動化を実行している場合は、回避策として独自の kubelet ID を使用することをお勧めします。 ユーザー割り当て ID を事前に作成し、それを Azure AD グループに追加した後、その ID を kubelet ID として使って AKS クラスターを作成できます。 これにより、kubelet によってトークンが生成される前に ID が Azure AD グループに追加され、待ち時間の問題が回避されます。
Note
この記事では、AKS と ACR の間の自動認証について説明します。 プライベート外部レジストリからイメージをプルする必要がある場合は、イメージのプル シークレットを使用します。
開始する前に
- Azure サブスクリプションには、所有者、Azure アカウント管理者、または Azure 共同管理者のロールが必要です。
- これらのロールのいずれも必要ないようにするには、代わりに既存のマネージド ID を使って AKS から ACR を認証できます。 詳しくは、ACR での認証への Azure マネージド ID の使用に関する記事をご覧ください。
- Azure CLI を使っている場合、この記事では Azure CLI バージョン 2.7.0 以降を実行する必要があります。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。 - Azure PowerShell を使用している場合、この記事では、Azure PowerShell バージョン 5.9.0 以降実行している必要があります。 バージョンを確認するには、
Get-InstalledModule -Name Az
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure PowerShell のインストールに関するページをご覧ください。 - ACR の構成に Terraform を使用する例と構文については、Terraform リファレンスを参照してください。
ACR 統合を使用して新しい AKS クラスターを作成する
AKS クラスターの作成中に AKS と ACR の統合を設定できます。 AKS クラスターが ACR と対話できるようにするために、Azure AD のマネージド ID が使われます。
ACR を作成する
ACR がまだない場合は、次のコマンドを使って作成します。
# Set this variable to the name of your ACR. The name must be globally unique.
MYACR=myContainerRegistry
az acr create -n $MYACR -g myContainerRegistryResourceGroup --sku basic
新しい AKS クラスターを作成して既存の ACR と統合する
ACR が既にある場合は、次のコマンドを使用して、ACR と統合する新しい AKS クラスターを作成します。 このコマンドを使うと、サブスクリプション内の既存の ACR を承認し、マネージド ID 用の適切な AcrPull ロールを構成できます。 下のパラメーターの有効な値を指定してください。
# Set this variable to the name of your ACR. The name must be globally unique.
MYACR=myContainerRegistry
# Create an AKS cluster with ACR integration.
az aks create -n myAKSCluster -g myResourceGroup --generate-ssh-keys --attach-acr $MYACR
または、次の形式を使うことで、ACR リソース ID を使って ACR の名前を指定することもできます。
/subscriptions/\<subscription-id\>/resourceGroups/\<resource-group-name\>/providers/Microsoft.ContainerRegistry/registries/\<name\>
Note
AKS クラスターから別のサブスクリプションにある ACR を使っている場合は、クラスターとのアタッチまたはデタッチを行うときに ACR の "リソース ID" を使います。
az aks create -n myAKSCluster -g myResourceGroup --generate-ssh-keys --attach-acr /subscriptions/<subscription-id>/resourceGroups/myContainerRegistryResourceGroup/providers/Microsoft.ContainerRegistry/registries/myContainerRegistry
このコマンドは、完了までに数分かかる場合があります。
既存の AKS クラスターに対する ACR 統合を構成する
ACR を AKS クラスターにアタッチする
--attach-acr
パラメーターと acr-name または acr-resource-id の有効な値を使って、既存の ACR と既存の AKS クラスターを統合します。
# Attach using acr-name
az aks update -n myAKSCluster -g myResourceGroup --attach-acr <acr-name>
# Attach using acr-resource-id
az aks update -n myAKSCluster -g myResourceGroup --attach-acr <acr-resource-id>
Note
az aks update --attach-acr
コマンドでは、コマンドを実行しているユーザーのアクセス許可を使って、ACR ロール割り当てが作成されます。 このロールは、kubelet マネージド ID に割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。
AKS クラスターから ACR をデタッチする
--detach-acr
パラメーターと acr-name または acr-resource-id の有効な値を使って、ACR と AKS クラスターの間の統合を削除します。
# Detach using acr-name
az aks update -n myAKSCluster -g myResourceGroup --detach-acr <acr-name>
# Detach using acr-resource-id
az aks update -n myAKSCluster -g myResourceGroup --detach-acr <acr-resource-id>
ACR および AKS の操作
イメージを ACR にインポートする
Docker Hub から ACR にイメージをインポートするには、次のコマンドを実行します。
az acr import -n <acr-name> --source docker.io/library/nginx:latest --image nginx:v1
ACR から AKS にサンプル イメージをデプロイする
適切な AKS 資格情報を持っていることを確認します。
az aks get-credentials -g myResourceGroup -n myAKSCluster
以下のサンプル YAML を使って、acr-nginx.yaml という名前のファイルを作成します。 acr-name を実際の ACR の名前に置き換えます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx0-deployment
labels:
app: nginx0-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx0
template:
metadata:
labels:
app: nginx0
spec:
containers:
- name: nginx
image: <acr-name>.azurecr.io/nginx:v1
ports:
- containerPort: 80
ファイルを作成した後、AKS クラスターで次のデプロイを実行します。
kubectl apply -f acr-nginx.yaml
kubectl get pods
を実行して、デプロイを監視できます。
kubectl get pods
出力に、実行中のポッドが 2 つ表示される必要があります。
NAME READY STATUS RESTARTS AGE
nginx0-deployment-669dfc4d4b-x74kr 1/1 Running 0 20s
nginx0-deployment-669dfc4d4b-xdpd6 1/1 Running 0 20s
トラブルシューティング
az aks check-acr
コマンドを実行して、レジストリに AKS クラスターからアクセスできることを確認します。- ACR の監視の詳細を理解してください。
- ACR の正常性の詳細を理解してください。