使用服务主体从 Azure 容器注册表部署到 Azure 容器实例

Azure 容器注册表是基于 Azure 的托管容器注册表服务,用于存储专用的 Docker 容器映像。 本文介绍如何在部署到 Azure 容器实例时拉取 Azure 容器注册表中存储的容器映像。 要配置注册表访问权限,一种方法是创建 Microsoft Entra 服务主体和密码,并将登录凭据存储在 Azure 密钥保管库中。

先决条件

Azure 容器注册表:需要一个 Azure 容器注册表(注册表中的至少一个容器映像)才能完成本文中的步骤。 如果需要注册表,请参阅使用 Azure CLI 创建容器注册表

Azure CLI:本文中的命令行示例使用 Azure CLI,并采用适用于 Bash shell 的格式。 可以在本地安装 Azure CLI

限制

配置注册表身份验证

在生产方案中,如果要提供对“无外设”服务和应用程序的访问权限,建议使用服务主体配置注册表访问权限。 使用服务主体可以提供对容器映像的 Azure 基于角色的访问控制 (Azure RBAC)。 例如,可将服务主体配置为拥有注册表的仅限提取的访问权限。

Azure 容器注册表提供了附加的身份验证选项

在以下部分中,将创建一个 Azure 密钥保管库和一个服务主体,并将服务主体的凭据存储在保管库中。

创建 Key Vault

如果 Azure Key Vault 中没有保管库,请在 Azure CLI 中使用以下命令创建一个保管库。

RES_GROUP 变量更新为要在其中创建 Key Vault 的现有资源组的名称,将 ACR_NAME 更新为容器注册表的名称。 为简洁起见,本文中的命令假设你的注册表、密钥保管库和容器实例都是在同一资源组中创建的。

AKV_NAME 中指定新 Key Vault 的名称。 保管库名称必须在 Azure 中唯一、长度必须为 3-24 个字母数字字符、以字母开头、以字母或数字结尾,并且不能包含连续的连字符。

RES_GROUP=myresourcegroup # Resource Group name
ACR_NAME=myregistry       # Azure Container Registry registry name
AKV_NAME=mykeyvault       # Azure Key Vault vault name

az keyvault create -g $RES_GROUP -n $AKV_NAME

创建服务主体并存储凭据

现在请创建服务主体,并将其凭据存储在密钥保管库中。

以下命令使用 az ad sp create-for-rbac 创建服务主体,使用 az keyvault secret set 将服务主体的密码存储在保管库中。 创建时,请务必记下服务主体的 appId。

# Create service principal
az ad sp create-for-rbac \
  --name http://$ACR_NAME-pull \
  --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
  --role acrpull

SP_ID=xxxx # Replace with your service principal's appId

# Store the registry *password* in the vault
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp show --id $SP_ID --query password --output tsv)

上述命令中的 --role 参数使用“acrpull”角色配置服务主体,该角色授予其对注册表的只拉取访问权限。 若要同时授予推送和拉取访问权限,请将 --role 参数更改为“acrpush”。

接下来,将服务主体的 appId(传递给 Azure 容器注册表用于身份验证的用户名)存储在保管库中。

# Store service principal ID in vault (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp show --id $SP_ID --query appId --output tsv)

现已创建 Azure 密钥保管库并在其中存储了两个机密:

  • $ACR_NAME-pull-usr:用作容器注册表用户名的服务主体 ID。
  • $ACR_NAME-pull-pwd:用作容器注册表密码的服务主体密码。

现在,当你或你的应用程序和服务从注册表提取映像时,可以按名称引用这些机密。

使用 Azure CLI 部署容器

将服务主体凭据存储到 Azure Key Vault 机密中后,应用程序和服务可以使用它们来访问专用注册表。

首先,使用 az acr show 命令获取注册表的登录服务器名称。 登录服务器名称全部小写,并且类似于 myregistry.azurecr.cn

ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --resource-group $RES_GROUP --query "loginServer" --output tsv)

执行以下 az container create 命令来部署容器实例。 该命令使用 Azure Key Vault 中存储的服务主体凭据对容器注册表进行身份验证,并假设事先已将 aci-helloworld 映像推送到注册表。 如果想要使用注册表中的不同映像,请更新 --image 值。

az container create \
    --name aci-demo \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/aci-helloworld:v1 \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label aci-demo-$RANDOM \
    --query ipAddress.fqdn

--dns-name-label 值必须在 Azure 中唯一,因此,上述命令会将一个随机数字追加到容器的 DNS 名称标签。 该命令的输出显示容器的完全限定域名 (FQDN),例如:

"aci-demo-25007.chinaeast2.azurecontainer.console.azure.cn"

成功启动容器后,可在浏览器导航到容器的 FQDN,以验证应用程序是否成功运行。

使用 Azure 资源管理器模板进行部署

通过将 imageRegistryCredentials 属性包含到容器组定义中,可以在 Azure 资源管理器模板中指定 Azure 容器注册表的属性。 例如,可以直接指定注册表凭据:

[...]
"imageRegistryCredentials": [
  {
    "server": "imageRegistryLoginServer",
    "username": "imageRegistryUsername",
    "password": "imageRegistryPassword"
  }
]
[...]

有关完整的容器组设置,请参阅资源管理器的模板参考

有关在资源管理器模板中引用 Azure Key Vault 机密的详细信息,请参阅在部署过程中使用 Azure Key Vault 传递安全参数值

使用 Azure 门户仅部署

如果在 Azure 容器注册表中维护容器映像,可通过 Azure 门户在 Azure 容器实例中轻松创建容器。 使用门户从容器注册表部署容器实例时,必须启用注册表的管理员帐户。 管理员帐户专门用于单个用户访问注册表,主要用于测试目的。

  1. 在 Azure 门户中,导航到容器注册表。

  2. 若要确保启用管理员帐户,请选择“访问密钥”,然后在“管理员用户”下选择“启用”

  3. 选择“存储库”,然后选择想要从中进行部署的存储库,右键单击想要部署的容器映像的标记,然后选择“运行实例”

  4. 输入容器和资源组的名称。 也可根据需要更改默认值。

    Create menu for Azure Container Instances

  5. 部署完成后,可从通知窗格导航至容器组,查找其 IP 地址和其他属性。

    Details view for Azure Container Instances container group

后续步骤

有关 Azure 容器注册表身份验证的详细信息,请参阅使用 Azure 容器注册表进行身份验证