你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

配置容器映像以执行部署

Azure 部署环境 (ADE) 支持扩展性模型,使你能够使用偏好的 IaC 模板框架配置环境定义。 可以在容器注册表(例如 Azure 容器注册表 (ACR) 或 Docker Hub)中存储自定义映像,然后在环境定义中引用它们以部署环境。

本文介绍了如何生成自定义 Bicep 容器映像,以在 ADE 中部署环境定义。 了解如何使用 Microsoft 提供的标准映像,或者如何使用 Bicep 基础结构即代码 (IaC) 框架配置自定义映像预配基础结构。

本文介绍如何生成自定义 Terraform 容器映像,以使用 Azure 部署环境 (ADE) 创建部署环境。 了解如何配置自定义映像以使用 Terraform 基础结构即代码 (IaC) 框架来预配基础结构。

本文介绍如何利用 Pulumi 进行 ADE 中的部署。 了解如何使用 Pulumi 提供的标准映像,或者如何使用 Pulumi 基础结构即代码 (IaC) 框架配置自定义映像来预配基础结构。

先决条件

将容器映像与 ADE 配合使用

可以采用以下方法之一将容器映像与 ADE 配合使用:

  • 使用标准容器映像:对于简单场景,请使用 ADE 提供的标准 ARM-Bicep 容器映像。
  • 创建自定义容器映像:对于较复杂的场景,请创建满足特定要求的自定义容器映像。

使用标准容器映像

ADE 支持 Azure 资源管理器 (ARM) 和 Bicep,而无需任何额外的配置。 你可以通过将模板文件(例如 azuredeploy.jsonenvironment.yaml)添加到目录来为部署环境创建用来部署 Azure 资源的环境定义。 然后,ADE 使用标准 ARM-Bicep 容器映像来创建部署环境。

在 environment.yaml 文件中,runner 属性指定要使用的容器映像的位置。 若要使用在 Microsoft 工件注册表上发布的标准映像,请使用相应的标识符 runner

以下示例演示了引用标准 ARM-Bicep 容器映像的 runner

    name: WebApp
    version: 1.0.0
    summary: Azure Web App Environment
    description: Deploys a web app in Azure without a datastore
    runner: Bicep
    templatePath: azuredeploy.json

可以在 ARM-Bicep 映像的 Runner-Images 文件夹下的 ADE 标准存储库中看到标准 Bicep 容器映像。

有关如何创建使用 ADE 容器映像部署 Azure 资源的环境定义的详细信息,请参阅添加和配置环境定义

创建自定义容器映像

  • 使用脚本创建自定义映像
  • 手动创建自定义映像

使用脚本创建自定义容器映像

通过创建自定义容器映像,可以自定义部署来满足你的要求。 你可以使用 Microsoft 提供的快速入门脚本基于 ADE 标准映像创建和生成映像,并将其推送到容器注册表。 你可以在部署环境存储库中找到该脚本。 若要使用该快速入门脚本,请创建该存储库的分支,然后在本地运行该脚本。

该脚本将生成映像并将其推送到存储库“ade”下的指定 Azure 容器注册表 (ACR) 和标记“latest”。 此脚本要求提供自定义映像的注册表名称和目录,已在 PATH 变量中安装 Azure CLI 和 Docker Desktop,并要求你有权推送到指定的注册表。

若要使用该快速入门脚本快速生成此示例映像并将其推送到 Azure 容器注册表,需要:

  • 在个人帐户中创建此存储库的分支。
  • 确保 Azure CLI 和 Docker Desktop 应用程序已安装在你的计算机上并位于 PATH 变量中。
  • 确保有权将映像推送到所选的 Azure 容器注册表。

可以在 PowerShell 中使用以下命令调用脚本:

.\quickstart-image-build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}'

此外,如果要推送到特定的存储库和标记名称,可以运行:

.\quickstart-image.build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}' -Repository '{YOUR_REPOSITORY}' -Tag '{YOUR_TAG}'

若要在环境部署中使用映像,需要将映像的位置添加到清单文件,将映像连接到环境定义,并且可能需要配置 ACR 的权限,以使自定义映像可用于 ADE

将容器映像与 ADE 配合使用

可以采用以下方法之一将容器映像与 ADE 配合使用:

  • 使用脚本创建自定义容器映像:使用已发布的脚本创建特定于 Terraform 的映像。
  • 利用 GitHub 工作流创建自定义容器映像:使用“通过 Terraform 利用 ADE 的扩展性模型”存储库中的已发布 GitHub 工作流。
  • 手动创建自定义容器映像:手动创建特定于 Terraform 的自定义映像

创建自定义容器映像

使用脚本创建自定义容器映像

通过创建自定义容器映像,可以自定义部署来满足你的要求。 你可以使用 Microsoft 提供的快速入门脚本基于 ADE 标准映像生成映像,并将其推送到容器注册表。 你可以在 Terraform 部署环境存储库中找到该脚本。 若要使用该快速入门脚本,请创建该存储库的分支,然后在本地运行该脚本。

若要使用该快速入门脚本快速生成此示例映像并将其推送到 Azure 容器注册表,需要:

  • 在个人帐户中创建此存储库的分支。
  • 确保 Azure CLI 和 Docker Desktop 应用程序已安装在你的计算机上并位于 PATH 变量中。
  • 确保有权将映像推送到所选的 Azure 容器注册表。

该脚本将生成映像并将其推送到存储库“ade”下的指定 Azure 容器注册表 (ACR) 和标记“latest”。 此脚本要求提供自定义映像的注册表名称和目录,已在 PATH 变量中安装 Azure CLI 和 Docker Desktop,并要求你有权推送到指定的注册表。 可以在 PowerShell 中使用以下命令调用脚本:

.\quickstart-image-build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}'

此外,如果要推送到特定的存储库和标记名称,可以运行:

.\quickstart-image.build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}' -Repository '{YOUR_REPOSITORY}' -Tag '{YOUR_TAG}'

若要在环境部署中使用映像,需要将映像的位置添加到清单文件,将映像连接到环境定义,并且可能需要配置 ACR 的权限,以使自定义映像可用于 ADE

使用 Pulumi 提供的标准容器映像

Pulumi 团队提供了一个预生成映像供你开始操作,你可以在 Runner-Image 文件夹中看到它。 此映像在 Pulumi 的 Docker Hub 中作为 pulumi/azure-deployment-environments 公开提供,因此你可以直接从 ADE 环境定义使用它。

下面是利用预生成映像的示例 environment.yaml 文件

name: SampleDefinition
version: 1.0.0
summary: First Pulumi-Enabled Environment
description: Deploys a Storage Account with Pulumi
runner: pulumi/azure-deployment-environments:0.1.0
templatePath: Pulumi.yaml

可以在 Environments 文件夹中找到一些示例环境定义。

创建自定义映像

通过创建自定义容器映像,可以自定义部署来满足你的要求。 可以根据 Pulumi 标准映像创建自定义映像,并对其进行自定义以满足你的要求。 完成映像自定义后,你必须生成映像并将其推送到容器注册表。

要创建为 ADE 配置的映像,请执行以下步骤:

  1. 基于标准映像创建自定义映像。
  2. 安装所需的程序包。
  3. 配置操作 shell 脚本。
  4. 创建使用 Pulumi CLI 的操作 shell 脚本。

1.基于标准映像创建自定义映像

创建一个 DockerFile,在其中包括一个 FROM 语句,指向 Microsoft 工件注册表上托管的标准映像。

下面是引用标准核心映像的示例 FROM 语句:

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

此语句拉取最近发布的核心映像,并使其成为你的自定义映像的基础。

2.安装所需的程序包

可以将 Pulumi CLI 安装到可执行文件位置,以便在部署和删除脚本中使用它。

下面是安装最新版 Pulumi CLI 的过程示例:

RUN apk add curl
RUN curl -fsSL https://get.pulumi.com | sh
ENV PATH="${PATH}:/root/.pulumi/bin"

可能需要安装一个或多个相应的运行时,具体取决于要用于 Pulumi 程序的编程语言。 Python 运行时已在基础映像中提供。

下面是安装 Node.js 和 TypeScript 的示例:

# install node.js, npm, and typescript
RUN apk add nodejs npm
RUN npm install typescript -g

ADE 标准映像基于 Azure CLI 映像,并且预安装了 ADE CLI 和 JQ 包。 可以详细了解 Azure CLIJQ 包

若要在映像中安装所需的任何其他包,请使用 RUN 语句。

通过 Pulumi 部署基础结构有四个步骤:

  1. pulumi login - 连接到本地文件系统或 Pulumi Cloud 中的状态存储
  2. pulumi stack select - 创建或选择要用于特定环境的堆栈
  3. pulumi config set - 将部署参数作为 Pulumi 配置值传递
  4. pulumi up - 运行部署以在 Azure 中创建新的基础结构或更新现有基础结构

在核心映像的入口点内,任何现有本地状态文件都被拉取到容器中,目录保存在环境变量 $ADE_STORAGE 下。 若要访问现有状态文件,请运行以下命令:

mkdir -p $ADE_STORAGE
export PULUMI_CONFIG_PASSPHRASE=
pulumi login file://$ADE_STORAGE

若要改为登录到 Pulumi Cloud,请将 Pulumi 访问令牌设置为环境变量,并运行以下命令:

export PULUMI_ACCESS_TOKEN=YOUR_PULUMI_ACCESS_TOKEN
pulumi login

为当前环境设置的任何参数都存储在变量 $ADE_OPERATION_PARAMETERS 下。 此外,所选的 Azure 区域和资源组名称分别通过 ADE_ENVIRONMENT_LOCATIONADE_RESOURCE_GROUP_NAME 传递。 若要设置 Pulumi 堆栈配置,请运行以下命令:

# Create or select the stack for the current environment
pulumi stack select $ADE_ENVIRONMENT_NAME --create

# Store configuration values in durable storage
export PULUMI_CONFIG_FILE=$ADE_STORAGE/Pulumi.$ADE_ENVIRONMENT_NAME.yaml

# Set the Pulumi stack config
pulumi config set azure-native:location $ADE_ENVIRONMENT_LOCATION --config-file $PULUMI_CONFIG_FILE
pulumi config set resource-group-name $ADE_RESOURCE_GROUP_NAME --config-file $PULUMI_CONFIG_FILE
echo "$ADE_OPERATION_PARAMETERS" | jq -r 'to_entries|.[]|[.key, .value] | @tsv' |
  while IFS=$'\t' read -r key value; do
    pulumi config set $key $value --config-file $PULUMI_CONFIG_FILE
  done

此外,若要利用 ADE 权限在订阅中部署基础结构,则在使用 Pulumi Azure Native 或 Azure Classic 提供程序预配基础结构时,脚本需要使用 ADE 托管服务标识 (MSI)。 如果你的部署需要特殊权限才能完成部署(例如特定角色),请将这些权限分配给用于环境部署的项目环境类型的标识。 ADE 设置相关的环境变量,例如核心映像入口点内的客户端、租户和订阅 ID,因此运行以下命令以确保提供程序使用 ADE MSI:

export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID

现在,可以运行 pulumi up 命令来执行部署:

pulumi up --refresh --yes --config-file $PULUMI_CONFIG_FILE

在删除脚本期间,可以改为运行 destroy 命令,如以下示例所示:

pulumi destroy --refresh --yes --config-file $PULUMI_CONFIG_FILE

最后,若要在通过 Azure CLI 访问环境时上传并访问部署的输出,请通过 JQ 包将输出对象从 Pulumi 转换为 ADE 指定的格式。 设置 $ADE_OUTPUTS 环境变量的值,如以下示例中所示:

stackout=$(pulumi stack output --json | jq -r 'to_entries|.[]|{(.key): {type: "string", value: (.value)}}')
echo "{\"outputs\": ${stackout:-{\}}}" > $ADE_OUTPUTS

生成自定义映像

你可以使用 Docker CLI 构建你的映像。 确保计算机上已安装 Docker 引擎。 然后,导航到 Dockerfile 的目录并运行以下命令:

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

例如,如果要将映像保存在名为 customImage 的注册表中的存储库下,并使用 1.0.0 的标记版本进行上传,请运行:

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

使自定义映像可供 ADE 使用

为了使用自定义映像,需要将它们存储在容器注册表中。 你可以使用公共容器注册表,也可以使用专用容器注册表。 强烈建议使用 Azure 容器注册表 (ACR),由于它与 ADE 紧密集成,因此可以发布映像,但不允许进行公共匿名拉取访问。 必须生成自定义容器映像并将其推送到容器注册表,才能在 ADE 中使用它。

也可以将映像存储在另一个容器注册表(例如 Docker Hub 容器注册表)中,但这种情况下它需要可供公开访问。

注意

将容器映像存储在具有匿名(未经身份验证)拉取访问权限的注册表中,会使其可公开访问。 如果映像中包含任何敏感信息,请不要这样做。 相反,请将其存储在禁用了匿名拉取访问的 Azure 容器注册表 (ACR) 中。

若要使用存储在 ACR 中的自定义映像,需确保 ADE 具有访问映像的相应权限。 创建 ACR 实例时,默认情况下它是安全的,并且仅允许经过身份验证的用户访问。

可以使用 Pulumi 创建 Azure 容器注册表并将映像发布到该注册表。 有关在 Azure 帐户中创建所有所需资源的自包含 Pulumi 项目,请参阅预配/自定义映像示例。

请选择相应的选项卡来了解有关每种方法的详细信息。

使用具有安全访问权限的专用注册表

默认情况下,只有已经过身份验证的用户才拥有从 Azure 容器注册表拉取或推送内容的访问权限。 可以通过限制来自某些网络的访问并分配特定角色来进一步保护对 ACR 的访问。

若要通过 Azure CLI、Azure 门户、PowerShell 命令等创建 ACR 的实例,请遵循相应的快速入门

限制网络访问

为了保护对 ACR 的网络访问,可以限制对你自己的网络的访问,或者完全禁用公用网络访问。 如果限制网络访问,则必须启用防火墙例外“允许受信任的 Microsoft 服务访问此容器注册表”

若要禁用从公用网络进行的访问,请执行以下操作:

  1. 创建 ACR 实例或使用现有实例。

  2. 在 Azure 门户中,转到要配置的 ACR。

  3. 在左侧菜单上的“设置”下,选择“网络”。

  4. 在“网络”页的“公共访问”选项卡的“公用网络访问”下选择“禁用”。

    Azure 门户的屏幕截图,显示了 ACR 网络设置,其中突出显示了“公共访问”和“禁用”。

  5. 在“防火墙例外”下,检查是否已选中“允许受信任的 Microsoft 服务访问此容器注册表”,然后选择“保存”

    ACR 网络设置的屏幕截图,其中突出显示了“允许受信任的 Microsoft 服务访问此容器注册表”和“保存”。

分配 AcrPull 角色

使用容器映像创建环境的操作使用 ADE 基础结构,其中包括项目和环境类型。 每个项目都有一个或多个项目环境类型,这些项目环境类型需要对容器映像(用于定义要部署的环境)的读取访问权限。 为了安全地访问 ACR 中的映像,请将 AcrPull 角色分配给每个项目环境类型。

若要将 AcrPull 角色分配给项目环境类型,请执行以下操作:

  1. 在 Azure 门户中,转到要配置的 ACR。

  2. 在左侧菜单中,选择“访问控制 (IAM)”。

  3. 选择“添加”>“添加角色分配”。

  4. 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 选择“AcrPull”
    将访问权限分配到 选择“用户、组或服务主体”。
    成员 输入需要访问容器中映像的项目环境类型的名称。

    项目环境类型如下例所示:

    “选择成员”窗格的屏幕截图,显示了项目环境类型列表,突出显示了名称的一部分。

在此配置中,ADE 使用 PET 的托管标识,无论该标识是系统分配的还是用户分配的。

提示

必须针对每种项目环境类型进行此角色分配。 它可以通过 Azure CLI 自动完成。

准备好将映像推送到注册表后,请运行以下命令:

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

将映像连接到环境定义

创作环境定义以在其部署中使用自定义映像时,请编辑清单文件(environment.yaml 或 manifest.yaml)上的 runner 属性。

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

若要详细了解如何创建使用 ADE 容器映像部署 Azure 资源的环境定义,请参阅添加和配置环境定义