Azure Kubernetes Service (AKS) から Azure Container Registry (ACR) の認証を受ける

Azure Kubernetes Service (AKS) で Azure Container Registry (ACR) を使用するときは、認証メカニズムを確立する必要があります。 Azure CLI、Azure PowerShell、または Azure portal を使用して、ACR と AKS の間で必要なアクセス許可を構成することができます。 この記事では、Azure CLI または Azure PowerShell を使用してこれらの Azure サービス間の認証を構成する例を示します。

AKS から ACR の統合により、AKS クラスター内のエージェント プールに関連付けられている Microsoft Entra ID のマネージド ID に、AcrPull ロールが割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。

重要

ACR をアタッチするときに、Microsoft Entra グループに関する待ち時間の問題があります。 Microsoft Entra グループに AcrPull ロールが付与されていて、RBAC の構成を完了するために kubelet ID をグループに追加した場合、RBAC グループが有効になるまでにしばらく時間がかかる可能性があります。 RBAC 構成を完了する必要がある自動化を実行している場合は、回避策として独自の kubelet ID を使用することをお勧めします。 ユーザー割り当て ID を事前に作成し、それを Microsoft Entra グループに追加した後、その ID を kubelet ID として使って AKS クラスターを作成できます。 このようにすると、kubelet によってトークンが生成される前に ID が Microsoft Entra グループに追加され、待ち時間の問題が回避されます。

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 を作成する

  • ACR がまだない場合は、az acr create コマンドを使用して作成します。 次の例では、MYACR 変数を ACR の名前 mycontainerregistry に設定し、その変数を使用してレジストリを作成します。 ACR 名はグローバルに一意であり、小文字のみを使用する必要があります。

    MYACR=mycontainerregistry
    
    az acr create -n $MYACR -g myContainerRegistryResourceGroup --sku basic
    

新しい AKS クラスターを作成して既存の ACR と統合する

  • 新しい AKS クラスターを作成し、--attach-acr パラメーターを含む az aks create コマンドを使用して既存の ACR と統合します。 このコマンドを使うと、サブスクリプション内の既存の ACR を承認し、マネージド ID 用の適切な AcrPull ロールを構成できます。

    MYACR=mycontainerregistry
    
    az aks create -n myAKSCluster -g myResourceGroup --generate-ssh-keys --attach-acr $MYACR
    

    このコマンドは、完了までに数分かかる場合があります。

    注意

    AKS クラスターとは別のサブスクリプションにある ACR を使用している場合、または 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 の有効な値を含む az aks update コマンドを使用して、既存の 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 の有効な値を含む az aks update コマンドを使用して、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 にインポートする

  • az acr import コマンドを使用して、Docker Hub から ACR にイメージをインポートします。

    az acr import  -n <acr-name> --source docker.io/library/nginx:latest --image nginx:v1
    

ACR から AKS にサンプル イメージをデプロイする

  1. az aks get-credentials コマンドを使用して、適切な AKS 資格情報を持っていることを確認します。

    az aks get-credentials -g myResourceGroup -n myAKSCluster
    
  2. 次のサンプル 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
    
  3. kubectl apply コマンドを使用して、AKS クラスターでデプロイを実行します。

    kubectl apply -f acr-nginx.yaml
    
  4. 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 の正常性の詳細を理解してください。