使用Azure Developer CLI实现容器化应用的“一次构建,随处部署”

本文详细介绍了如何利用Azure Developer CLI v1.20.0的分层基础设施功能与“一次构建,随处部署”模式,将Flask容器化应用高效、安全地从开发环境部署到生产环境,涵盖了技术架构、配置流程与CI/CD实现。

Azure Developer CLI: 基于分层基础设施实现Azure容器应用的开发到生产部署

本指南将演示如何利用Azure Developer CLI v1.20.0中的新功能,即分层基础设施配置与azd publishazd deploy --from-package命令的组合,在Azure容器应用中实现“一次构建,随处部署”的模式。你将学习如何部署同一个容器化应用到多个环境(如开发和生产),同时保持职责分离。

这是Azure Developer CLI系列文章的第三篇,建立在我们之前对Azure应用服务与GitHub Actions、Azure DevOps流水线的探索基础之上。

目标与挑战

如果你在生产环境中使用过容器,可能遇到过以下由azd deploy一站式打包(构建容器、推送到注册表、部署)带来的问题:

  • 你希望在所有环境中使用同一个Azure容器注册表。
  • 你需要在无需重新构建容器的情况下“一次构建,随处部署”。
  • 你希望对哪些特定的容器版本可以部署到生产环境进行安全控制。
  • 你需要灵活性,以便为每个环境部署具有不同配置的相同容器。

解决方案:分层基础设施与分离的容器操作

Azure Developer CLI v1.20.0引入了两项关键能力来解决这些挑战:

  1. 分离的容器操作
    • azd publish:构建容器并将其推送到你的注册表。
    • azd deploy --from-package:将特定的容器版本部署到环境(无需重新构建)。
  2. 分层基础设施
    • 按顺序分层部署基础设施,并管理好依赖关系。
    • 在环境之间共享资源(如ACR),同时将环境特定的资源分开。
    • 早期层的输出会自动成为后续层的输入。

示例应用与架构

示例应用是一个基于Flask的简单文件管理器,它演示了以下核心概念:

  • 功能:上传文件、列出文件和查看文件(后端使用Azure Blob存储)。
  • 安全方法:使用Azure托管标识,无需存储任何连接字符串。

基础设施采用分层方法进行组织,将共享资源与环境特定资源分离:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 示例 azure.yaml 中的分层配置
name: dev-prod
infra:
  layers:
    - name: foundation       # 第1层:基础 - 每个环境的核心基础设施
      path: infra/foundation
    - name: shared-acr       # 第2层:共享ACR - 所有环境共用的注册表
      path: infra/shared-acr
    - name: acr-role         # 第3层:ACR角色分配 - 安全配置
      path: infra/acr-role
    - name: container-app    # 第4层:容器应用 - 应用程序部署
      path: infra/container-app

各层的作用如下:

  • 基础层:根据AZURE_ENV_TYPE设置核心资源,包括容器应用环境和托管标识。
  • 共享ACR层:创建集中式的容器注册表(除非已存在)。
  • ACR角色分配层:为托管标识授予适当的权限(开发环境获取推送+拉取权限,生产环境仅获取拉取权限)。
  • 容器应用层:最终部署你的应用程序,此时它已具备适当的ACR访问权限。

实践步骤

先决条件

  • 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

重要提示:对于生产环境,应通过CI/CD流水线进行部署,本地azd provision仅用于前期设置。生产环境的基础设施变更应经过严格的审批流程。

4. 设置CI/CD流水线

在代码仓库中配置GitHub Actions流水线:

1
2
azd env select myapp-dev
azd pipeline config

GitHub Actions工作流详解

该工作流遵循清晰的三阶段模式:构建 → 部署到开发环境 → 部署到生产环境。其核心在于“一次构建,多次部署”。

构建阶段

  1. 启用Alpha功能。
  2. 设置环境名称。
  3. 使用联合凭证登录Azure。
  4. 预配开发环境基础设施。
  5. 构建容器并将其发布到ACR(使用azd publish)。
  6. 获取生成的镜像名称。

开发环境部署阶段

  1. 启用Alpha功能。
  2. 登录Azure。
  3. 使用azd deploy app --from-package <容器镜像>部署到开发环境。
  4. 运行验证测试(如冒烟测试)。

生产环境部署阶段

  1. 启用Alpha功能。
  2. 登录Azure。
  3. 使用同一个容器镜像(通过工作流输出传递)部署到生产环境(使用azd deploy app --from-package <同一个容器镜像>)。

总结

本文介绍了如何利用Azure Developer CLI v1.20.0的新功能,在Azure容器应用中实现“一次构建,随处部署”的模式。通过结合分层基础设施和分离的容器操作,你可以在享受azd up便捷性的同时,为生产环境添加所需的控制和安全性。

涵盖的关键内容包括:

  • 容器应用集成azd如何与Azure容器应用开箱即用地协作。
  • 分层基础设施:具有适当依赖关系管理的顺序部署。
  • 环境分离:在保持开发便利性的同时,添加生产就绪的控制措施。

具体的实现细节会根据团队的实际需求(如高级网络、复杂的合规性要求、不同的部署策略等)而有所不同。我们希望本文能为你提供一个起点和可供参考的范例。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计