從 Azure Kubernetes Service (AKS) 對 Azure Container Registry (ACR) 進行驗證

當您搭配 Azure Kubernetes Service (AKS) 使用 Azure Container Registry (ACR) 時,您必須建立驗證機制。 您可以使用 Azure CLI、Azure PowerShell 或 Azure 入口網站,設定 ACR 與 AKS 之間的必要權限。 本文提供使用 Azure CLI 或 Azure PowerShell 在這些 Azure 服務之間設定驗證的範例。

AKS 與 ACR 整合會將 AcrPull 角色指派給與 AKS 叢集中的代理程式集區相關聯的 Microsoft Entra ID 受控識別。 如需 AKS 受控識別的詳細資訊,請參閱受控識別的摘要

重要

附加 ACR 時,Microsoft Entra 群組發生延遲問題。 如果 AcrPull 角色授與 Microsoft Entra 群組,而且 kubelet 身分識別會新增至群組以完成 RBAC 設定,則 RBAC 群組生效之前可能會有延遲。 如果您正在執行需要完成 RBAC 設定的自動化,建議您使用自備 kubelet 身分 識別作為因應措施。 您可以預先建立使用者指派的身分識別,並將其新增至 Microsoft Entra 群組,然後使用身分識別作為 kubelet 身分識別來建立 AKS 叢集。 這可確保身分識別會在 kubelet 產生權杖之前新增至 Microsoft Entra 群組,以避免延遲問題。

注意

此文章涵蓋 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
  • 您可以在 Terraform 參考中找到使用 Terraform 設定 ACR 的範例和語法。

建立新的 ACR

  • 如果您還沒有 ACR,請使用 az acr create 命令建立一個。 下列範例會將 MYACR 變數設定為 ACR 的名稱 mycontainerregistry,並使用該變數來建立登錄。 您的 ACR 名稱必須是全域唯一的,而且只使用小寫字母。

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

建立新的 AKS 叢集,並與現有的 ACR 整合

  • 使用 az aks create 命令搭配 --attach-acr 參數,建立新的 AKS 叢集並與現有的 ACR 整合。 下列命令可讓您授權訂用帳戶中的現有 ACR,並為受控識別設定適當的 AcrPull 角色。

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

    此命令可能需要幾分鐘的時間才能完成。

    注意

    如果您使用 ACR,其位於與 AKS 叢集不同的訂用帳戶中,或偏好使用 ACR 資源識別碼,而不是 ACR 名稱,您可以使用下列語法來執行此動作:

    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 叢集

  • 使用 az aks update 命令搭配 --attach-acr 參數acr-nameacr-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>
    

    注意

    az aks update --attach-acr 命令會使用執行命令的使用者權限來建立 ACR 角色指派。 此角色會指派給 kubelet \(英文\) 受控識別。 如需 AKS 受控識別的詳細資訊,請參閱受控識別的摘要

從 AKS 叢集中斷連結 ACR

  • 使用 az aks update 命令搭配 --detach-acr 參數acr-nameacr-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

  • 使用 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 的名稱取代 acr-name

    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
    

    輸出應該會顯示兩個執行中的 Pod,如下列範例輸出所示:

    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx0-deployment-669dfc4d4b-x74kr   1/1     Running   0          20s
    nginx0-deployment-669dfc4d4b-xdpd6   1/1     Running   0          20s
    

疑難排解