你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 容器应用是一项完全托管的无服务器容器服务,可在 Azure 上运行微服务和容器化应用程序。 它提供内置的自动缩放功能,包括缩放到零,并支持多种编程语言和框架。 容器应用与 Azure Kubernetes 服务(AKS)集成,用于高级网络和监视。 它还提供容器化应用程序的无缝部署和管理,而无需管理底层基础结构。 它支持基于 HTTP 的应用程序和事件驱动的应用程序,因此非常适合构建现代、可缩放和可复原的云原生应用程序。
本文假设作为架构师,你已查看 计算决策树 ,并选择“容器应用”作为工作负荷的计算平台。 本文中的指南提供了映射到 Well-Architected 框架支柱原则的体系结构建议。
重要
如何使用本指南
每个部分都有一个 设计清单,该清单提供关注的体系结构区域以及本地化为技术范围的设计策略。
此外,还包括有助于具体化这些策略的技术功能的建议。 这些建议并不表示可用于容器应用及其依赖项的所有配置的详尽列表。 而是列出与设计视角相匹配的关键建议。 使用建议生成概念证明或优化现有环境。
演示关键建议的基础体系结构: 使用 Azure 容器应用的微服务。
技术范围
此次审查重点分析以下 Azure 资源的相关决策:
- 容器应用
可靠性
可靠性支柱的目的是通过 建立足够的复原能力和从故障快速恢复来提供持续的功能。
可靠性设计原则 为各个组件、系统流和整个系统提供高级设计策略。
设计清单
根据可靠性设计评审核对清单开始实施您的设计策略。 确定其与业务需求的相关性,同时记住应用程序的性能和可靠性。 扩展策略以根据需要包含更多方法。
选择适当的 SKU 配置。 选择符合容器应用的资源和性能要求的环境 SKU。
生成冗余以提高复原能力。 对于入口公开的(HTTP 或传输控制协议(TCP)应用,请使用至少三个副本来帮助确保可用性。 为了尽量减少冷启动,请配置最少数量的始终就绪副本。
将可用性区域用作复原策略的一部分,以在部署到单个区域时提高可用性。 许多 Azure 区域提供可用性区域。 这些区域定位得足够近,以确保它们之间的低延迟连接,但相距足够远,以最大程度地降低影响多个区域的本地中断的风险。
对于关键工作负荷,跨多个区域部署容器应用环境,并使用 Azure Front Door 或 Azure 流量管理器 进行流量管理。 这些服务有助于确保高可用性和业务连续性。 如果发生区域性服务中断,可以自动将流量重定向到次要区域,以最大程度地减少停机时间和数据丢失。
实现水平自动缩放。 使用基于 HTTP 请求、TCP 连接或自定义指标(例如 CPU 和内存阈值)的规模规则配置自动缩放。 可以在 Azure 服务总线、Azure 事件中心、Apache Kafka 和 Azure Redis 缓存中定义自定义指标。 使用自动缩放在高峰使用时间动态管理负载和维护高可用性。
确保在高负载下,容器应用仍然可以在服务级别目标(SLO)内为请求提供服务。
监视容器应用的可靠性和整体运行状况指标。 收集日志和指标以监视运行状况、识别性能和可靠性趋势,并解决问题。 有关为工作负荷设计可靠性和运行状况监视解决方案的详细信息,请参阅 工作负载的运行状况建模。
实现监控工具和警报。 激活 Azure Monitor 和 OpenTelemetry 等监视工具。 设置警报以及时检测和响应影响可靠性的事件。
配置健康探针。 为所有服务设置启动、就绪情况和运行情况探测,以监视和维护应用程序运行状况。
配置自我修复机制以自动重启不正常的容器实例。 自动重启可提高应用程序的可靠性和可用性。 它们有助于确保快速从故障中恢复,而无需手动干预。 使用健康探测器检测失败的容器,并配置弹性策略以自动处理重试和断路器。
建议
建议 | 益处 |
---|---|
启用容器应用 可用性区域支持 ,以便自动跨区域中的区域分发副本。 流量会在副本中进行负载均衡。 | 如果发生区域故障,流量将自动路由到其余区域中的副本。 |
定义 资源配额 和限制。 | 防止资源争用,以帮助确保公平分配并避免性能下降。 随着时间的推移,使用监视来观察实际资源使用情况,并相应地调整配额和限制。 |
在有状态的应用程序中,使用卷装载将数据存储在容器外部。 为了增强数据复原能力,请使用 Azure 区域冗余存储(ZRS)来帮助确保数据的高可用性和持久性。 | 确保容器重启和故障之间的数据持久性和完整性。 使用 ZRS 防止因区域性故障导致的数据丢失,为关键有状态应用程序提供可靠的解决方案。 |
为容器应用实现运行情况、就绪情况和启动运行状况探测 。 存活探针检测并重启处于失败状态的容器。 建议的设置: failureThreshold: 3 、periodSeconds: 10 、timeoutSeconds: 5 、successThreshold: 1 和initialDelaySeconds: 10 就绪情况探测可确保只有正常的容器接收流量。 建议的设置: failureThreshold: 60 、periodSeconds: 1 、timeoutSeconds: 1 、successThreshold: 1 和initialDelaySeconds: 5 启动探测允许慢速启动应用正确初始化,从而防止过早重启。 建议的设置: failureThreshold: 60 、periodSeconds: 1 、timeoutSeconds: 1 、successThreshold: 1 和initialDelaySeconds: 0 |
适当的探测配置有助于确保容器应用顺利运行,并且可以处理流量。 不正确的探测配置可能会导致意外重启或停机。 |
使用容器应用内置的 可观测性功能(例如日志流式处理、容器控制台和 Azure Monitor 指标和警报),确保主动监视和高效调试。 | 容器应用提供深度可观测性支持,包括与 .NET Aspire 仪表板和 Java 指标的集成。 这些工具为关键生态系统提供更深入的见解。 还可以使用 OpenTelemetry 收集器进行全面的分布式跟踪和指标收集。 这些功能可提高应用程序可靠性,因为可以快速识别和解决问题。 |
实施服务发现 复原策略,例如重试、超时和断路器,以主动防止、检测和恢复服务请求故障。 | 通过确保更流畅且更具弹性的服务间通信来提高容器应用的可靠性。 |
使用基于 HTTP 请求、TCP 连接或自定义指标(例如 CPU 和内存阈值)的规模规则实现水平 自动缩放 。 可以在服务总线、事件中心、Apache Kafka 和 Azure Redis 缓存中定义自定义指标。 | 工作负荷可以在高峰使用时间动态管理负载和维护高可用性。 |
安全
安全支柱的目的是为工作负荷提供 保密性、完整性和可用性 保证。
安全设计原则通过应用容器应用技术设计的方法,为实现这些目标提供了高级设计策略。
设计清单
根据 设计评审清单制定针对安全 的设计策略,并确定漏洞和控制,以增强安全防御能力。 扩展策略以根据需要包含更多方法。
审查安全基线。 若要增强工作负荷的安全态势,请查看 容器应用的安全基线。
与 Microsoft Entra ID 集成以进行身份和访问管理。 将 基于角色的访问控制(RBAC) 与 Microsoft Entra ID 一起使用,以获得最低权限访问。
将托管标识与 Microsoft Entra ID 配合使用 ,以便安全、无凭据地访问 Azure 资源。
实现分段和网络控制。 部署专用容器应用环境,并使用内部引入模式以隔离公共互联网。
控制出口流量。 为了防止数据外泄,请将容器应用环境集成到具有用户定义的路由的自定义虚拟网络中,以帮助保护出站流量。
维护强化工作负荷的软件供应链。 在安全的持续集成和持续交付(CI/CD)管道中实现容器感知扫描。 此功能可检测漏洞,并帮助确保容器映像的完整性。 有关详细信息,请参阅 容器安全供应链。
减少攻击面。 强化容器映像并删除未使用的组件。 使用精简和最小的基础映像,如 Alpine 和 Chiselled Ubuntu 映像。
与 Microsoft Defender 集成。 使用 Microsoft Defender for Containers 扫描 Azure 容器注册表中的映像。
对静态数据和传输中的数据进行加密。 使用现代行业标准方法保护机密性和完整性。
使用 Azure 密钥保管库。 将敏感配置值和机密存储在 Key Vault 中,以保护它们免受未经授权的访问。
启用相互传输层安全性(mTLS)。 使用 mTLS 对服务之间的流量进行身份验证和加密。 此功能会验证双方,从而增强安全性。
强制实施 HTTPS。 配置 Envoy 代理以将所有 HTTP 流量重定向到 HTTPS。 Envoy 的默认配置为
allowInsecure: false
。实施安全监视策略。 捕获详细日志以进行监视和审核。 将系统和控制台日志发送到 Log Analytics 工作区、事件中心或非Microsoft解决方案,以便进行监视和审核。 从日志中清理敏感数据。 应用中的控制台日志来自
stderr
和stdout
流。
建议
建议 | 益处 |
---|---|
使用 托管身份 访问 Microsoft Entra ID 保护的资源。 将托管标识分配给容器应用以访问受 Entra ID 保护 Microsoft的 Azure 资源(例如存储帐户或密钥保管库),而无需使用密钥或密码。 | 集中标识管理,无需手动凭据管理。 简化对 Azure 资源的安全访问。 |
在 专用网络中 部署容器应用,将其集成到现有虚拟网络中。 使用专用应用程序连接、网络安全组(NSG)附件等功能,以及通过专用 IP 地址进行资源通信。 | 提供与公共 Internet 的隔离,并在容器应用和其他网络资源之间实现安全通信。 |
使用 Key Vault 管理具有增强安全性的证书和应用机密。 Key Vault 将证书和其他应用机密与应用的配置分开。 它还提供访问审核日志,其中详细介绍了何时更新、检索和轮换证书和机密。 | 使用日志记录和证书轮换功能帮助保护敏感信息、确保合规性并支持安全机密管理。 |
在通过反向代理发布容器应用时,使用启用了 Web 应用程序防火墙的 Azure 应用程序网关 来帮助保护 HTTP 和 HTTPS 流量。 Web 应用程序防火墙扫描传入的 HTTP 流量,了解潜在的开放 Web 应用程序安全项目 (OWASP) 攻击。 | 通过防范常见 Web 漏洞并提供集中式流量管理来增强安全性。 |
使用 Microsoft Entra ID 验证至 容器注册表,以避免使用管理凭据。 可以通过 RBAC 控制访问。 | 通过 RBAC 实现精细访问控制以实现容器映像管理,这有助于确保安全且无凭据的身份验证。 |
使用 NSG 规则来帮助保护 访问内部容器应用终结点的流量。 NSG 规则可以更精细地控制哪些虚拟网络可以与容器应用通信。 | 通过限制仅对受信任的网络的访问来增强网络安全,从而最大程度地减少攻击面。 |
使用 用户定义的网络路由控制出站流量。 控制容器如何与容器环境外部的资源通信。 可以将流量路由到 Azure 防火墙、Azure NAT 网关或非Microsoft设备。 | 确保出站流量受控且安全,以支持高级路由和检查策略。 |
配置 日志记录选项 以将日志发送到 Log Analytics 工作区、事件中心或非Microsoft解决方案。 | 支持集中监视、诊断和审核,同时确保符合敏感数据处理策略。 |
成本优化
成本优化侧重于 检测支出模式、优先考虑关键领域的投资,以及优化其他 以满足组织预算,同时满足业务需求。
成本优化设计原则为实现这些目标提供高级设计策略,并在必要时在与容器应用及其环境相关的技术设计中进行权衡。
设计清单
根据投资的成本优化设计评审核对清单开始实施您的设计策略。 微调设计,使工作负荷与为工作负荷分配的预算保持一致。 设计应使用正确的 Azure 功能,监视投资,并查找随时间推移进行优化的机会。
选择适当的定价计划。 根据工作负荷要求和预期的使用模式,为容器应用选择最经济高效的定价计划。
通过承诺使用固定的每小时费率来利用适用于计算的 Azure 节省计划,时间可选择为一年或三年。 与即用即付定价相比,使用节省计划最多可节省 17%。 优化预算并降低长期可预测工作负荷的总体支出。
优化工作负荷组件成本。 定期查看和调整 CPU 和内存分配,以满足应用程序的需求。 这种做法可防止过度预配并最大程度地降低成本。
使用托管磁盘层。 使用卷装载时,请选择适当的托管磁盘层和大小,以优化持久数据的存储成本。 只需为所需内容付费。
使用简化和优化的容器映像 来提高启动时间和资源效率,从而减少存储和网络成本。
优化扩展成本。 配置自动缩放策略,以在低需求期间自动缩减资源,并在高峰期纵向扩展。 这种做法可确保高效的资源使用。
优化网络成本。 优化网络路径,以最大程度地降低数据传输成本,尤其是对于带宽量较高的应用程序。
使用成本管理工具。 使用Microsoft成本管理工具来跟踪和分析支出、设置预算、创建成本警报,以及跨资源实现一致的标记。
这些工具提供对云支出的详细可见性,帮助识别节省成本的机会,确保遵守预算约束,并允许对与特定工作负荷、应用程序和环境相关的成本进行精细跟踪和报告。
建议
建议 | 益处 |
---|---|
定期查看和调整 CPU、内存分配和其他 指标 ,以符合应用程序的实际需求。 | 通过确保对工作负荷的资源进行权限化,防止过度预配并降低不必要的成本。 |
为不需要持续运行的应用实现缩放到零的 自动缩放 规则。 | 在非活动期间消除成本,这可以确保在需要资源时仅支付资源费用。 此方法可显著减少具有可变或不经常使用模式的应用的费用。 |
为有状态应用程序选择适当的 托管磁盘层 。 根据存储性能和容量需求进行选择,并考虑将预留磁盘用于可预测的工作负荷。 | 确保只为必要的存储性能付费,这可以防止过度预配的存储产生超额成本。 与即用即付定价相比,预留磁盘可以通过提供折扣来大幅节省长期存储要求的成本。 |
卓越运营
卓越运营主要侧重于 开发实践、可观测性和发布管理的各个过程。
卓越运营设计原则 提供了一个高级设计策略,用于实现这些运营需求目标。
设计清单
根据 卓越运营的设计评审清单 启动设计策略,以定义与容器应用相关的可观测性、测试和部署过程。
实现基础结构即代码(IaC)部署方法。 使用 Bicep 或 Terraform 等工具实现基于模板的部署。 确保所有部署都是可重复的、可跟踪的,并存储在源代码存储库中。
自动化基础设施和工作负载部署。 使用标准软件解决方案来管理、集成和自动部署工作负载。
设置部署管道 ,以在发生区域性中断时将环境重新部署到另一个区域。 此方法可帮助你快速还原和重新部署另一个区域中的关键数据和配置,从而增强灾难恢复功能,并最大限度地减少区域故障期间的停机时间。
构建自动化流程,通过使用 CI/CD 管道设置具有必要配置和部署的环境。
实施全面的监视策略。 配置诊断设置以捕获日志、指标和诊断数据。 使用 Azure Monitor 和 Application Insights 等工具跟踪应用程序运行状况和性能、识别性能和可靠性趋势以及解决问题。
为工作负荷发射遥测。 设计您的工作负载,以发出遥测数据,包括存活状态和就绪状态,从而便于监视和故障排除。
监视性能指标。 持续监视关键性能指标,例如 CPU、内存和网络使用情况,以确定成本优化和运营效率的机会。
实现混沌工程。 使用 Azure Chaos Studio 等工具应用混沌工程实践,以识别容器应用环境中的潜在可靠性问题。 进行试验,确保应用程序能够承受意外故障。 使用 Azure 负载测试等工具执行性能测试,以确保缩放规则按预期工作,而不会对客户端造成中断。
在所有容器应用和其他工作负荷资源中实现一致的资源标记。 一致的标记有助于高效资源管理、成本跟踪和自动化。
强制实施工作负荷治理。 Azure Policy 有助于确保符合组织标准、自动执行策略,并提供对工作负荷资源的集中可见性和控制。
建议
建议 | 益处 |
---|---|
将容器应用环境配置存储为 IaC,并设置部署管道,以在发生区域性中断时将环境重新部署到另一个区域。 | 确保可以在另一个区域中快速还原和重新部署关键数据和配置,从而增强灾难恢复功能,并最大限度地减少区域故障期间的停机时间。 |
使用修订版实现蓝绿部署或金丝雀部署。 修订版要求对容器映像进行适当的标记和版本设置。 可以在修订上使用标签来促进共享,例如用户验收测试或有限预览版。 |
通过实现安全推出和快速回滚,最大限度地减少停机时间并降低发布过程中的风险。 |
配置 Azure Monitor 和 Application Insights。 | 跟踪容器应用的性能和运行状况,并提供有关应用程序性能和可靠性的详细见解。 使用这些见解主动检测和解决问题。 |
性能效率
性能效率就是通过管理容量来保持用户体验,即使负载增加也不例外。 该策略包括缩放资源、识别和优化潜在瓶颈,以及优化峰值性能。
性能效率设计原则 提供了一个高级设计策略,用于根据预期使用量实现这些容量目标。
设计清单
开始实施设计策略,使用性能效率的设计评审清单,依据容器应用的关键绩效指标来定义基准。
制定详细的容量计划 ,以确保容器应用有足够的资源来处理不同的负载,同时避免过度预配。 容量计划有助于优化成本和性能。
定期更新计划,记录容器应用的正确资源分配、自动缩放设置和故障转移策略。 此方法可确保可以在另一个区域中快速还原和重新部署关键数据和配置,从而增强灾难恢复功能,并最大限度地减少区域故障期间的停机时间。
启用自动缩放。 配置自动缩放策略,以便根据实时需求自动调整容器实例的数量,这可确保在高峰和非高峰时段实现最佳性能。
优化资源分配。 根据性能指标持续监视和调整 CPU 和内存分配,以确保高效的资源使用并防止过度预配。
执行负载测试。 执行常规负载测试,以评估不同条件下容器应用的性能和可伸缩性。 测试有助于确保容器应用能够处理预期的流量级别。
单独的工作负荷。 在单独的容器应用环境中部署关键和敏感的工作负荷,以避免干扰邻居问题。 跨多个环境分配工作负荷,以确保关键应用程序具有专用资源。 此方法还可确保不太关键应用程序的性能需求不会影响关键应用程序。
建议
建议 | 益处 |
---|---|
配置 自动缩放 策略,以自动调整容器实例数以响应资源需求。 | 帮助维护应用程序性能和成本效益。 确保资源在需要时可用,不需要时节约使用。 使用 Azure 负载测试执行负载测试试验,并根据需要调整自动缩放策略。 |
对于需要可预测的性能和保证的资源分配的应用程序,请使用 工作负荷配置文件 专用层。 | 为关键应用程序提供专用资源,确保一致的性能并降低资源争用的风险。 |
使用自定义缩放 指标(如基于应用程序特定数据的指标)来推动自动缩放决策。 | 确保基于相关的工作负载需求进行缩放,以提高容器应用的效率和响应能力。 |
Azure 策略
Azure 提供了一组与容器应用及其依赖项相关的大量内置策略。 可以通过 Azure Policy 审核上述一些建议。 例如,可以检查以下情况:
应启用诊断设置: 为容器应用环境(
microsoft.app/managedenvironments
)启用按类别组进行日志记录,以便将信息发送到存储。 此设置可确保存储始终收集日志和指标,以便监视、故障排除和符合性。应启用容器应用的身份验证: 启用身份验证以防止匿名 HTTP 请求,并在请求到达容器应用环境之前通过令牌对请求进行身份验证。
容器应用环境应使用网络注入: 使用虚拟网络注入配置容器应用环境以将它们与公共 Internet 隔离,启用与本地或其他 Azure 虚拟网络的资源的网络集成,并实现对网络流量的精细控制。
应禁用公用网络访问: 通过内部负载均衡器公开容器应用环境,禁用公共网络访问以提高安全性。 此方法阻止 Internet 访问环境中的所有容器应用。
应禁用外部网络访问: 强制实施仅限内部的入口,以确保容器应用的入站通信仅限于容器应用环境中的调用方。
应强制实施 HTTPS: 确保只能通过 HTTPS 访问容器应用,以保护传输中的数据免受网络层窃听攻击。
应启用托管标识: 要求容器应用环境的托管标识安全地向支持Microsoft Entra ID 身份验证的任何资源进行身份验证。
若要进行全面的治理,请查看 容器应用的 Azure Policy 内置定义 ,以及可能影响网络安全性的其他策略。
Azure 顾问建议
Azure 顾问是一名个性化的云顾问,可帮助你遵循最佳做法来优化 Azure 部署。
有关详细信息,请参阅 Azure 顾问。