Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
可以使用 Azure 资源托管标识在另一个Azure资源上对Azure容器注册表进行身份验证,而无需提供或管理注册表凭据。
例如,在 Linux VM 上设置 用户分配的或系统分配的托管标识 ,以便像使用公共注册表一样轻松地从容器注册表访问容器映像。 或者,设置 Azure Kubernetes 服务群集以使用其 托管身份 从 Azure 容器注册表中拉取容器映像,进行 pod 部署。
有关Azure中托管标识的概述,请参阅 什么是Azure资源的托管标识?
你可以为托管身份分配一个角色,该角色可用于对Azure中的一个或多个专用注册表进行仅拉取、推送和拉取,或其他权限分配。 有关注册表角色的完整列表,请参阅 Azure Container Registry 权限和角色概述。
然后,使用标识向 支持托管标识的任何服务进行身份验证,而无需代码中的任何凭据。
在这篇文章中,你将学会如何:
- 在 Azure 虚拟机上启用用户分配的身份或系统分配的身份。
- 授予对Azure容器注册表的标识访问权限
- 使用托管标识访问注册表并拉取容器映像
先决条件
可以使用Azure CLI或Azure PowerShell完成本文中的步骤。 使用任一工具的最新版本。 如果没有安装任何工具,请参阅 install Azure CLI 或 Install Azure PowerShell。
若要设置容器注册表并向其推送容器映像,还必须在本地安装 Docker。 Docker 提供在任意 macOS、Windows 或 Linux 系统上轻松配置 Docker 的包。
如果还没有Azure容器注册表,请创建注册表并将示例容器映像推送到其中。 按照步骤使用 Azure CLI、Azure PowerShell 或 Azure 门户创建注册表。
本文假设你在注册表中存储了 aci-helloworld:v1 容器映像。 以下示例使用注册表名称 myContainerRegistry。 可以将这些值替换为您自己的存储库和镜像名称。
创建和配置已启用 Docker 的 VM
创建已启用 Docker 的 Ubuntu VM 来用于托管的身份。 还需要在虚拟机上安装Azure CLI或Azure PowerShell,具体取决于要使用的工具。
如果您已有在 Azure VM 上安装了 Azure CLI 或 Azure PowerShell,那么可以进入下一部分。
创建 VM
使用 az vm create 部署默认 Ubuntu Azure虚拟机。 以下示例在名为 myResourceGroup 的现有资源组中创建名为 myDockerVM 的 VM:
az vm create \
--resource-group myResourceGroup \
--name myDockerVM \
--image Ubuntu2204 \
--admin-username azureuser \
--generate-ssh-keys
创建 VM 需要几分钟时间。 命令完成后,请注意Azure CLI显示的 publicIpAddress。 在下一步中,使用此地址与 VM 建立 SSH 连接。
在 VM 上安装 Docker
接下来,在 VM 上安装 Docker,以便它可以从Azure Container Registry拉取和运行容器映像。
VM 运行后,建立与 VM 的 SSH 连接。 将 publicIpAddress 替换为 VM 的公共 IP 地址。
ssh azureuser@publicIpAddress
运行以下命令以在 VM 上安装 Docker:
sudo apt update
sudo apt install docker.io -y
安装完成后,运行以下命令验证 Docker 在 VM 上是否正常运行:
sudo docker run -it mcr.microsoft.com/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]
在 VM 上安装Azure CLI或Azure PowerShell
请按照 使用 apt 安装 Azure CLI 中的步骤,在 Ubuntu 虚拟机上安装 Azure CLI。 在本文中,请务必安装最新版本。
安装Azure CLI后,退出 SSH 会话。
使用用户分配的托管标识配置 VM
用户分配的托管标识是一个独立的Azure资源,可以独立于使用的资源进行管理。 可以将用户分配的托管标识与多个Azure资源相关联。
本部分介绍如何使用用户分配的标识配置 VM,以便安全地访问Azure Container Registry。
创建用户分配的托管标识
使用 az identity create 命令在订阅中创建标识。 可以使用以前用于创建容器注册表或虚拟机的同一资源组,或选择其他资源组。
az identity create --resource-group myResourceGroup --name myACRId
若要在以下步骤中配置标识,请使用 az identity show 命令将标识的资源 ID 和服务主体 ID 存储在变量中。
# Get resource ID of the user-assigned identity
userID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)
# Get service principal ID of the user-assigned identity
spID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)
当你从虚拟机登录 CLI 时,需要在稍后的步骤中使用标识的 ID,因此请显示以下值:
echo $userID
ID 的格式如下:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId
使用用户分配的托管标识配置 VM
接下来,将 Docker VM 配置为使用在上一步中创建的用户分配标识。
使用az vm identity assign来配置VM,使用在上一步中检索到的ID:
az vm identity assign --resource-group myResourceGroup --name myDockerVM --identities $userID
授予用户分配的托管标识对容器注册表的访问权限
现在配置标识,使其有权访问容器注册表。
必须分配 Container Registry Repository Reader (对于 已启用 ABAC 的注册表)或 AcrPull (对于非 ABAC 注册表)。 此角色分配为注册表提供拉取权限。
若要同时提供拉取和推送权限,请为已启用 ABAC 的注册表分配Container Registry Repository Writer角色,或为未启用 ABAC 的注册表分配AcrPush角色。
使用 az acr show 获取注册表的资源 ID。
resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)
使用 az role assignment create 将所需角色分配给标识。 此示例分配 Container Registry Repository Reader 角色,该角色仅授予对已启用 ABAC 的注册表的拉取权限:
az role assignment create --assignee $spID --scope $resourceID \
--role "Container Registry Repository Reader" # For ABAC-enabled registries. Otherwise, use AcrPull for non-ABAC registries.
使用用户分配的托管标识访问注册表
通过 SSH 连接到标识配置的 Docker 虚拟机,然后运行以下命令,使标识能够访问容器注册表。
在 VM 上,使用之前检索到的标识使用 az login 对 Azure CLI 进行身份验证。
az cloud set -n AzureChinaCloud
az login --identity --username <userID>
# az cloud set -n AzureCloud //means return to Public Azure.
接下来,使用 az acr login 向注册表进行身份验证。 使用此命令时,CLI 使用运行 az login 时创建的Active Directory令牌,以便与容器注册表无缝验证会话。
az acr login --name myContainerRegistry
应该会看到 Login succeeded 消息。 之后,便可以在不提供凭据的情况下运行 docker 命令。 例如,运行 docker pull 以拉取 aci-helloworld:v1 映像,并指定注册表的登录服务器名称:
docker pull mycontainerregistry.azurecr.cn/aci-helloworld:v1
使用系统分配的托管标识配置 VM
系统分配的托管标识是一项Azure功能,使虚拟机能够在Azure Active Directory中自动管理自己的标识。 本部分介绍如何使用系统分配的标识配置 VM,以便安全地访问Azure Container Registry。
在 VM 上启用系统分配的托管标识
使用 az vm identity assign 将您的 Docker VM 配置为使用系统分配的标识:
az vm identity assign --resource-group myResourceGroup --name myDockerVM
使用 az vm show 将变量设置为 VM 标识的 principalId(服务主体 ID)的值,以在后续步骤中使用:
spID=$(az vm show --resource-group myResourceGroup --name myDockerVM --query identity.principalId --out tsv)
授予系统分配的托管标识对容器注册表的访问权限
现在配置标识,使其有权访问容器注册表。
必须分配 Container Registry Repository Reader (对于 已启用 ABAC 的注册表)或 AcrPull (对于非 ABAC 注册表)。 此角色分配为注册表提供拉取权限。
若要同时提供拉取和推送权限,请为已启用 ABAC 的注册表分配Container Registry Repository Writer角色,或为未启用 ABAC 的注册表分配AcrPush角色。
使用 az acr show 获取注册表的资源 ID。
resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)
使用 az role assignment create 将所需角色分配给标识。 此示例分配 Container Registry Repository Reader 角色,该角色仅授予对已启用 ABAC 的注册表的拉取权限:
az role assignment create --assignee $spID --scope $resourceID \
--role "Container Registry Repository Reader"
使用系统分配的托管标识访问注册表
通过 SSH 连接到标识配置的 Docker 虚拟机,然后运行以下命令,使标识能够访问容器注册表。
在 VM 上,利用系统分配的标识通过 az login 对 Azure CLI 进行身份验证。
az cloud set -n AzureChinaCloud
az login --identity
# az cloud set -n AzureCloud //means return to Public Azure.
接下来,使用az acr login进行身份验证。 使用此命令时,CLI 使用运行 az login 时创建的Active Directory令牌,以便与容器注册表无缝验证会话。
az acr login --name myContainerRegistry
应该会看到 Login succeeded 消息。 之后,便可以在不提供凭据的情况下运行 docker 命令。 例如,运行 docker pull 以拉取 aci-helloworld:v1 映像,并指定注册表的登录服务器名称:
docker pull mycontainerregistry.azurecr.cn/aci-helloworld:v1