Azure Developer CLI:使用分层基础设施实现Azure容器应用开发到生产部署
本文介绍如何使用Azure Developer CLI v1.20.0中的新功能azd publish和分层基础设施特性,在Azure容器应用中实现"一次构建,随处部署"模式。您将学习如何跨多个环境部署相同的容器化应用,并实现适当的关注点分离。
我们解决的挑战
如果您在生产环境中使用过容器,可能遇到过这个问题:azd deploy将所有操作捆绑在一起——构建容器、推送到注册表、部署——一次性完成。虽然这对开发非常方便,但在生产场景中会带来一些困扰:
- 您希望在所有环境中使用单个Azure容器注册表(ACR)
- 需要一次构建,随处部署,无需重新构建容器
- 需要对部署到生产环境的特定容器版本进行安全控制
- 需要灵活性,以便在不同环境中使用不同配置部署相同容器
分层基础设施配置
在azure.yaml文件中定义的分层部署策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# Azure容器应用演示:使用共享ACR实现"一次构建,随处部署"
name: dev-prod
# 分层基础设施部署策略
infra:
layers:
# 第1层:基础 - 每个环境的核心基础设施
- name: foundation
path: infra/foundation
# 第2层:共享ACR - 所有环境的单一注册表
- name: shared-acr
path: infra/shared-acr
# 第3层:ACR角色分配 - 安全配置
- name: acr-role
path: infra/acr-role
# 第4层:容器应用 - 应用部署
- name: container-app
path: infra/container-app
|
基础设施组织方式
采用分层方法,将共享资源与环境特定资源分开:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
┌─────────────────────────────────────────────────────────────────┐
│ 共享资源 │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 资源组: rg-acr-shared ││
│ │ ┌─────────────────────────────────────────────────────────┐ ││
│ │ │ Azure容器注册表 (基础SKU) │ ││
│ │ │ - 存储所有环境的容器镜像 │ ││
│ │ │ - 应用容器的单一事实来源 │ ││
│ │ └─────────────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 开发环境 │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 资源组: rg-dev-environment ││
│ │ ┌─────────────────────────────────────────────────────────┐ ││
│ │ │ 容器应用环境 │ ││
│ │ │ ┌─────────────────────────────────────────────────────┐ │ ││
│ │ │ │ 容器应用 (Flask应用) │ │ ││
│ │ │ │ - 用于ACR访问的托管身份 │ │ ││
│ │ │ │ - 启用自动缩放 │ │ ││
│ │ │ └─────────────────────────────────────────────────────┘ │ ││
│ │ └─────────────────────────────────────────────────────────┘ ││
│ │ Azure存储帐户 | 密钥保管库 | Application Insights ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 生产环境 │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 资源组: rg-prod-environment ││
│ │ ┌─────────────────────────────────────────────────────────┐ ││
│ │ │ 容器应用环境 (VNET集成) │ ││
│ │ │ ┌─────────────────────────────────────────────────────┐ │ ││
│ │ │ │ 容器应用 (与开发环境相同的镜像) │ │ ││
│ │ │ │ - 增强的安全配置 │ │ ││
│ │ │ │ - 生产级缩放规则 │ │ ││
│ │ │ └─────────────────────────────────────────────────────┘ │ ││
│ │ └─────────────────────────────────────────────────────────┘ ││
│ │ VNET | 存储 | 密钥保管库 | App Insights | 监控 ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
|
实践步骤
先决条件
- Azure Developer CLI v1.20.0或更高版本
- Docker(用于本地容器测试)
1. 克隆示例存储库
1
|
azd init -t https://github.com/puicchan/azd-dev-prod-aca-storage
|
2. 设置开发环境
1
2
3
4
5
6
7
8
9
|
# 启用分层基础设施的alpha功能
azd config set alpha.layers on
# 创建并配置开发环境
azd env new myapp-dev
azd env set AZURE_ENV_TYPE dev
# 部署所有内容:基础设施 + 构建 + 推送 + 部署
azd up
|
3. 准备生产基础设施
1
2
3
4
5
6
7
8
9
10
|
# 创建生产环境
azd env new myapp-prod
azd env set AZURE_ENV_TYPE prod
# 引用现有的共享ACR
azd env set ACR_RESOURCE_GROUP_NAME rg-shared-acr-resource-group-name
azd env set AZURE_CONTAINER_REGISTRY_ENDPOINT shared-acr-endpoint
# 仅配置基础设施(不构建/推送/部署)
azd provision
|
4. 设置CI/CD流水线
1
2
3
|
# 选择开发环境并配置流水线
azd env select myapp-dev
azd pipeline config
|
GitHub Actions工作流程
工作流程遵循清晰的三阶段模式:构建 → 部署开发 → 部署生产
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
┌─────────────────────────────────────────────────────────────────┐
│ GitHub Actions工作流程 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 作业1: 构建 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 启用alpha功能(分层基础设施) │ │
│ │ 2. 设置环境名称(开发/生产) │ │
│ │ 3. 使用Azure登录(联合凭据) │ │
│ │ 4. 配置基础设施(开发环境) │ │
│ │ 5. 构建并发布容器到ACR │ │
│ │ └─ azd publish app │ │
│ │ └─ 获取镜像: azd env get-value SERVICE_APP_IMAGE_NAME │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 输出: │
│ • container-image: crXXXX.azurecr.io/app:azd-deploy-123456 │
│ • dev-env-name: myapp-dev │
│ • prod-env-name: myapp-prod │
└──────────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 作业2: 部署开发 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 启用alpha功能(分层基础设施) │ │
│ │ 2. 使用Azure登录(联合凭据) │ │
│ │ 3. 部署到开发环境 │ │
│ │ └─ azd deploy app --from-package <container-image> │ │
│ │ 4. 验证应用 │ │
│ │ └─ 运行验证测试、冒烟测试 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 作业3: 部署生产 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 启用alpha功能(分层基础设施) │ │
│ │ 2. 使用Azure登录(联合凭据) │ │
│ │ 3. 部署到生产环境 │ │
│ │ └─ azd deploy app --from-package <相同容器镜像> │ │
│ │ └─ 使用环境变量中的共享ACR │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
|
关键要点:
- 容器在构建阶段仅构建一次
azd env get-value SERVICE_APP_IMAGE_NAME获取已发布的镜像名称
- 开发和生产部署完全相同的容器镜像
- 验证步骤在阶段之间充当质量门控
总结
本文介绍了如何使用Azure Developer CLI v1.20.0中的新功能,在Azure容器应用中实现"一次构建,随处部署"模式。基于我们之前关于Azure应用服务的文章,这种容器应用方法展示了相同的核心原则如何在不同的Azure计算服务中工作。
分层基础设施和分离的容器操作(azd publish + azd deploy --from-package)的组合为您提供了坚实的基础,当您准备超越azd up的简单性,但仍希望保持熟悉的azd开发人员体验时。
我们涵盖的内容:
- 容器应用集成:
azd如何与Azure容器应用开箱即用
- 分层基础设施:具有适当依赖关系管理的顺序部署
- 环境分离:在添加生产就绪控制的同时保持开发便利性