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) マネージド IDAcrPull ロールが割り当てられます。 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 共同管理者のロールが必要です。
  • 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 の正常性の詳細を理解してください。