使用 Azure 容器注册表 (ACR) 从 Azure Kubernetes 服务 (AKS) 进行身份验证

Azure 容器注册表 (ACR) 与 Azure Kubernetes 服务 (AKS) 配合使用时,需要建立身份验证机制。 可以使用 Azure CLI、Azure PowerShell 或 Azure 门户配置 ACR 和 AKS 之间所需的权限。 本文提供了使用 Azure CLI 或 Azure PowerShell 在这些 Azure 服务之间配置身份验证的示例。

ACR 集成的 AKS 将 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 --name $MYACR --resource-group myContainerRegistryResourceGroup --sku basic
    

创建新的 AKS 群集并将其与现有 ACR 集成

  • 使用带有 --attach-acr 参数az aks create 命令创建新的 AKS 群集并与现有 ACR 集成。 使用此命令可以在订阅中授权现有 ACR,并为托管标识配置适当的 AcrPull 角色。

    MYACR=mycontainerregistry
    
    az aks create --name myAKSCluster --resource-group myResourceGroup --generate-ssh-keys --attach-acr $MYACR
    

    此命令可能需要几分钟才能完成。

    注意

    如果你使用的 ACR 位于与 AKS 群集不同的订阅中,或者你希望使用 ACR 资源 ID 而不是 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 群集

  • 使用带有 --attach-acr 参数acr-nameacr-resource-id 有效值的 az aks update 命令,将现有 ACR 与现有 AKS 群集集成。

    # Attach using acr-name
    az aks update --name myAKSCluster --resource-group myResourceGroup --attach-acr <acr-name>
    
    # Attach using acr-resource-id
    az aks update --name myAKSCluster --resource-group myResourceGroup --attach-acr <acr-resource-id>
    

    注意

    az aks update --attach-acr 命令使用运行此命令的用户的权限来创建 ACR 角色分配。 此角色分配给 kubelet 托管标识。 有关 AKS 托管标识的详细信息,请参阅托管标识摘要

从 AKS 群集拆离 ACR

  • 使用带有 --detach-acr 参数acr-nameacr-resource-id 有效值的 az aks update 命令,删除 ACR 与 AKS 群集之间的集成。

    # Detach using acr-name
    az aks update --name myAKSCluster --resource-group myResourceGroup --detach-acr <acr-name>
    
    # Detach using acr-resource-id
    az aks update --name myAKSCluster --resource-group myResourceGroup --detach-acr <acr-resource-id>
    

使用 ACR 和 AKS

将映像导入 ACR

  • 使用 az acr import 命令将映像从 Docker Hub 导入 ACR。

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

将示例映像从 ACR 部署到 AKS

  1. 使用 az aks get-credentials 命令确保你具有正确的 AKS 凭据。

    az aks get-credentials --resource-group myResourceGroup --name 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.cn/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
    

疑难解答