使用 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 共同管理员角色。
- 为了避免需要其中一个角色,可以改用现有的托管标识对 AKS 中的 ACR 进行身份验证。 有关详细信息,请参阅使用 Azure 托管标识向 ACR 验证身份。
- 如果你使用的是 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-name 或 acr-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>
从 AKS 群集拆离 ACR
使用带有
--detach-acr
参数和 acr-name 或 acr-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
使用
az aks get-credentials
命令确保你具有正确的 AKS 凭据。az aks get-credentials --resource-group myResourceGroup --name 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.cn/nginx:v1 ports: - containerPort: 80
使用
kubectl apply
命令在 AKS 群集中运行部署。kubectl apply -f acr-nginx.yaml
使用
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
疑难解答
- 使用
az aks check-acr
命令验证可从 AKS 群集访问注册表。 - 详细了解 ACR 监视。
- 详细了解 ACR 运行状况。