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

使用 Azure 容器应用部署微服务

Azure 容器应用
Azure Cosmos DB
Azure 服务总线

此示例方案显示了一个现有工作负载的示例,该工作负载最初设计为在 Kubernetes 上运行,而现在可在 Azure 容器应用中运行。 Azure 容器应用非常适合棕地 (brownfield) 工作负载;在这类工作负载中,团队希望简化复杂的基础结构和容器业务流程。 示例工作负载运行容器化微服务应用程序。

该示例采用 Azure Kubernetes 服务(AKS)上的微服务体系结构 中使用的工作负载,并将其重新托管在 Azure 容器应用中作为其应用程序平台。

提示

GitHub 徽标 该体系结构由示例实现提供支持,该示例实现描述了本文中所述的一些设计选项。

体系结构

显示使用 Azure 容器应用部署的微服务的关系图。

下载此体系结构的 Visio 文件

在此方案中,容器映像源自 Azure 容器注册表并部署到容器应用环境。

共享同一环境的服务受益于:

  • 内部入口和服务发现
  • 用于运行时日志记录的单个 Log Analytics 工作区
  • 安全管理机密和证书

工作流服务容器应用在单一修订模式下运行。 在单一修订模式下运行的容器应用具有单个修订,由零个副本提供支持。 副本由应用程序容器和任何必需的挎斗容器组成。 此示例不使用挎斗容器,因此每个容器应用副本都表示单个容器。 由于此示例不使用缩放,因此每个容器应用只运行一个副本。

工作流使用混合方法来管理机密。 托管标识用于此类实现所需的服务中,无需更改代码。 无人机计划程序和交付服务使用用户分配的托管标识通过 Azure 密钥保管库进行身份验证,以便访问存储在那里的机密。 其余服务通过应用程序级别的容器应用服务来存储机密。

显示解决方案的运行时体系结构的关系图。

此图演示了解决方案的运行时体系结构。

下载此体系结构的 Visio 文件

数据流

  1. 引入服务:接收客户端请求、缓冲这些请求,并通过 Azure 服务总线将其发送到工作流服务。
  2. 工作流服务:使用来自 Azure 服务总线的消息并将其调度到基础服务。
  3. 包服务:管理包。
  4. 无人机计划程序服务:安排无人机并监视无人机飞行。
  5. 配送服务:管理已计划或在途的配送。

组件

无人机配送服务使用一系列相互协作的 Azure 服务。

Azure 容器应用

Azure 容器应用 是一个无服务器容器平台,可简化容器业务流程和管理。 在此体系结构中,容器应用充当所有微服务的主托管平台。

以下功能取代了以前的 AKS 体系结构的许多复杂性:

  • 内置服务发现
  • 完全托管的 HTTP 和 HTTP/2 终结点
  • 集成负载均衡
  • 日志记录和监视
  • 基于基于 Kubernetes 的事件驱动自动缩放(KEDA)支持的 HTTP 流量或事件自动缩放
  • 应用程序升级和版本控制

外部存储和其他组件

  • Azure Key Vault 是一种云服务,用于安全地存储和访问机密,例如 API 密钥、密码和证书。 在此体系结构中,无人机计划程序和交付服务使用用户分配的托管标识对 Key Vault 进行身份验证并检索机密。

  • Azure 容器注册表 是用于存储和管理专用容器映像的托管注册表服务。 在此体系结构中,它是部署到容器应用环境的所有容器映像的源。 也可以使用其他容器注册表,例如 Docker Hub。

  • Azure Cosmos DB 是一种全球分布式多模型数据库服务。 它使用开源 Azure Cosmos DB for MongoDB API 存储数据。 微服务通常是无状态的,它们将自身的状态写入外部数据存储。 在此体系结构中,Azure Cosmos DB 充当用于 MongoDB 和 Cassandra 的开源 API 的主要 NoSQL 数据库,其中无状态微服务写入其状态和应用程序数据。

  • Azure 服务总线 是一种云消息传送服务,提供异步通信功能和混合集成。 在此体系结构中,它处理引入服务和工作流服务之间的异步消息传送。

  • Azure Redis 缓存 是基于 Redis 缓存的内存中缓存服务。 在此体系结构中,它通过提供快速的数据访问并减少无人机交付系统中频繁访问的数据的延迟,从而提高了流量负载的速度和性能。

  • Azure Monitor 是一种全面的监视解决方案,用于收集和分析遥测数据。 在此体系结构中,它通过 Log Analytics 工作区从所有应用程序组件收集和存储指标和日志。 可以使用此数据监视应用程序、设置警报和仪表板,并执行故障的根本原因分析。

  • Application Insights 是一种提供可扩展监视功能的应用程序性能管理服务。 在此体系结构中,使用 Application Insights SDK 检测每个服务,以监视应用程序性能并将数据定向到 Azure Monitor,以便实现详细的服务级别可观测性。

  • Bicep 模板 是用于部署 Azure 资源的基础结构即代码模板。 在此体系结构中,Bicep 模板为容器应用基础结构和无人机交付工作负载提供声明性部署。

备选方法

使用 Kubernetes 的此示例的替代方案在 高级 AKS 微服务体系结构中介绍。

方案详细信息

企业可以使用 Azure 容器应用简化微服务容器的部署和管理。 容器应用提供完全托管的无服务器环境,用于生成和部署新式应用程序。

Fabrikam, Inc. (一家虚构的公司)实施无人机交付应用程序,用户要求无人机拿起货物交付。 当客户安排取件时,后端系统会分配一架无人机,并将估计的交付时间告知用户。

微服务应用程序已部署到 AKS 群集。 但是,Fabrikam 团队没有利用高级或特定于平台的 AKS 功能。 他们最终在没有产生太多开销的情况下将应用程序迁移到了 Azure 容器应用。 通过将解决方案移植到 Azure 容器应用,Fabrikam 能够执行以下作:

  • 按近乎原样迁移应用程序:将应用程序从 AKS 移动到 Azure 容器应用时,只需进行非常少量的代码更改。
  • 使用 Bicep 模板部署基础结构和工作负载:部署其应用程序容器不需要 Kubernetes YAML 清单。
  • 通过托管入口公开应用程序:内置支持基于 https 的外部入口来公开引入服务,无需配置自己的入口。
  • 从 ACR 拉取容器映像(Azure 容器注册表):Azure 容器应用不需要特定的基础映像或注册表。
  • 管理应用程序生命周期:修订功能支持运行特定容器应用的多个修订,并在这些修订之间拆分流量,来进行 A/B 测试或实现蓝/绿部署方案。
  • 使用托管标识:Fabrikam 团队能够使用托管标识向 Azure Key Vault 和 Azure 容器注册表进行身份验证。

可能的用例

  • 将基于微服务的应用程序部署到平台即服务(PaaS)中,以简化管理并避免运行容器业务流程协调程序的复杂性。
  • 通过将容器化服务迁移到支持本机缩放到零的平台来优化运营和管理。
  • 执行长时间运行的后台进程,例如单一修订模式下的工作流服务。

容器应用的其他常见用途包括:

  • 在基于消耗的无服务器平台上运行容器化工作负载。
  • 基于 KEDA 支持的 HTTP/HTTPS 流量和/或事件驱动的触发器自动缩放应用程序
  • 最大限度地减少容器化应用程序的维护开销
  • 部署 API 终结点
  • 承载后台处理应用程序
  • 处理事件驱动的处理

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

可靠性

可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅 可靠性的设计评审清单。

使用容器应用可以更轻松地部署、管理、维护和监视应用程序。 可以通过以下关键功能确保可用性:

  • 修订有助于在零停机的情况下部署应用程序更新。 可以使用修订来管理应用程序更新的部署,并在修订之间拆分流量,以支持蓝/绿部署和 A/B 测试(当前未在此示例工作负荷中使用)。
  • 使用容器应用端到端可观测性功能,可以全面了解正在运行的应用程序。 容器应用与 Azure Monitor 和 Log Analytics 集成,可用于跟踪容器应用执行,并根据指标和事件设置警报。
  • 当应用意外终止时,容器应用服务会自动重启它。
  • 可以启用自动缩放规则,以满足流量和工作负载增加时的需求。
  • 容器应用的动态负载均衡功能优化性能(尽管它们未在此示例工作负荷中使用)。

容器应用将尝试重启失败的容器,并对用户隐藏硬件。 Microsoft处理暂时性故障,并确保支持计算资源的高可用性。

通过 Log Analytics 和 Azure Monitor 进行性能监视,可以评估负载下的应用程序。 指标和日志记录信息提供识别趋势所需的数据,以防止故障,并在故障发生时执行根本原因分析。

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅 安全的设计评审清单。

机密

  • 容器应用可以将敏感值作为机密进行存储和检索。 为容器应用定义机密后,该应用程序和任何关联的缩放规则都可以使用它。 如果以多修订模式运行,则所有修订共享相同的机密。 由于机密被视为应用程序范围的更改,因此如果更改机密的值,不会创建新的修订。 但是,对于任何正在运行的修订以加载新的机密值,需要重启它们。 在此方案中,使用应用程序和环境变量值。
  • 环境变量:敏感值可以安全地存储在应用程序级别。 更改环境变量后,容器应用将生成新的修订。

网络安全性

  • 入口:为了限制外部访问,仅为外部入口配置引入服务。 只能通过容器应用环境中的内部虚拟网络来访问后端服务。 仅在需要时向 Internet 公开服务。 由于此体系结构使用内置的外部入口功能,因此此解决方案不提供完全定位 Web 应用程序防火墙(WAF)后的入口点或将其包含在 DDoS 防护计划中的能力。 所有面向 Web 的工作负载都应置于 Web 应用程序防火墙之后。
  • 虚拟网络:创建环境时,可提供自定义虚拟网络;否则,虚拟网络由 Microsoft 自动生成和管理。 无法通过添加网络安全组(NSG)或强制将流量隧道发送到出口防火墙来操作此Microsoft托管的虚拟网络。 此示例使用自动生成的虚拟网络。

有关更多网络拓扑选项,请参阅 Azure 容器应用中的网络体系结构

工作负载标识

  • 容器应用支持 Microsoft Entra 托管的标识,应用可通过这些标识向其他受 Microsoft Entra ID 保护的资源(例如 Azure Key Vault)验证其自身,而无需在容器应用中管理凭据。 容器应用可以使用系统分配的托管标识、用户分配的托管标识,或同时使用两者。 对于不支持 AD 身份验证的服务,应在 Azure Key Vault 中存储机密,并使用托管标识来访问机密。
  • 使用托管标识进行 Azure 容器注册表访问。 Azure 容器应用允许对工作负荷使用不同于容器注册表访问的托管标识。 建议使用此方法实现对托管标识的精细访问控制。

成本优化

成本优化是研究减少不必要的开支和提高运营效率的方法。 有关详细信息,请参阅 成本优化的设计评审清单。

卓越运营

卓越运营涵盖部署应用程序并使其在生产环境中运行的运营流程。 有关详细信息,请参阅 卓越运营的设计评审清单。

为了实现卓越运营,容器应用服务提供以下功能:

  • GitHub Actions 集成,用于设置自动化 CI/CD 部署。
  • 具有流量拆分的多修订模式,用于测试对应用程序代码和缩放规则的更改。
  • 与 Azure Monitor 和 Log Analytics 集成,提供对容器化应用程序的见解。
  • Log Analytics 提供日志聚合,用于跨每个容器应用环境收集信息。

性能效率

性能效率是工作负荷的缩放能力,以满足用户以高效方式满足它的需求。 有关详细信息,请参阅 性能效率的设计评审清单。

此解决方案中的性能注意事项:

  • 工作负载分布在多个微服务应用程序中。
  • 每个微服务都是独立的,不与其他微服务共享任何内容,因此它们可以独立缩放。
  • 随着工作负载的增加,可以启用自动缩放。
  • 请求是动态均衡负载的。
  • 指标(包括 CPU 和内存利用率、带宽信息和存储利用率)可通过 Azure Monitor 获得。

部署此方案

按照 Azure 容器应用示例存储库中 README.md 中的步骤操作。

供稿人

Microsoft 会维护本文。 它最初是由以下贡献者撰写的。

主要作者:

后续步骤