Azure 容器应用 是一项完全托管的无服务器容器托管服务,用于部署微服务和容器化应用程序。
使用 Azure 时, 可靠性是共同的责任。 Azure 提供了一系列支持复原和恢复的功能。 你负责了解这些功能如何在你使用的所有服务中工作,并选择满足业务目标和运行时间目标所需的功能。
本文介绍如何使容器应用能够灵活应对各种潜在的中断和问题,包括暂时性故障、可用性区域中断、区域中断和服务维护。 它还介绍了如何使用备份从其他类型的问题中恢复,并重点介绍有关容器应用服务级别协议(SLA)的一些关键信息。
生产部署建议
若要了解如何部署容器应用以支持解决方案的可靠性要求,以及可靠性如何影响体系结构的其他方面,请参阅 Azure Well-Architected Framework 中 Azure 容器应用的体系结构最佳做法。
可靠性体系结构概述
使用容器应用时,部署一个环境,该 环境充当基础部署单元,并表示一组容器应用周围的安全边界。 环境用于配置核心设置,包括可用性区域支持和网络配置。 有两种类型的环境:工作负载概况环境和仅供消耗的环境。 有关详细信息,请参阅 Azure 容器应用中的计算和计费结构。
在单个环境中,可以部署多个应用,每个 应用运行一个或多个 容器。 环境还可以运行一个或多个表示非交互式任务的 作业。 有关详细信息,请参阅 Azure 容器应用中的容器 和 Azure 容器应用中的作业。
每个应用都有一个或多个 副本,表示应用的运行实例。 你可以控制应用缩放方式,包括最小和最大副本数,以及应用如何动态添加和删除副本。 平台的计划程序可确保在满足最低副本计数要求的同时,跨物理主机进行最佳分发。 有关详细信息,请参阅在 Azure 容器应用中设置缩放规则。
容器应用旨在支持使用各种功能的应用程序的可靠性,包括:
自动健康监控。 内置入口控制器自动对正常副本的流量进行负载均衡。 如果副本运行状况检查失败或其底层基础结构长时间不可用,服务会自动重启失败的容器或创建替换副本,重新分发离开不正常的副本的流量,并管理群集中的网络重试。 此自动恢复过程无需客户干预并维护指定的副本计数。 有关详细信息,请参阅 健康探测。
通过 Dapr 实现应用程序复原能力。 容器应用提供与 Dapr 的紧密集成,该框架为运行生产级微服务和容器化应用程序提供各种功能,包括针对其他服务中问题的复原能力。 有关详细信息,请参阅 使用 Azure 容器应用的微服务。
系统组件的基础结构复原能力,包括控制平面、入口控制器和容器运行时。 在具有可用性区域的区域中,容器应用提供区域冗余。 若要了解详细信息,请参阅 可用性区域故障的复原能力。
暂时性故障的复原能力
暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 暂时性故障在短时间内自行纠正。 应用程序通常可以通过重试受影响的请求来处理暂时性故障,这一点很重要。
与任何云托管的 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅 处理暂时性故障的建议。
容器应用通过其平台级重试机制和运行状况监视自动处理许多暂时性故障。 请遵循以下建议,确保您的应用程序能够抵抗暂时性故障。
配置运行状况探测 ,使平台能够检测和响应特定于应用程序的故障条件。 根据应用程序的启动特性设置适当的故障阈值和超时时间。例如,对于存活性探测,使用故障阈值为3且周期为10秒,以避免在临时问题期间过早重启容器。 有关详细信息,请参阅 健康探测。
使用服务发现复原策略(预览版) 通过简单的复原策略主动防止、检测和恢复服务请求失败。 例如,使用复原策略时,如果出现暂时性故障,则可能会自动重试对应用的每个传入请求,以防止应用响应。 有关详细信息,请参阅 服务发现复原能力(预览版)。
在应用程序中实现外部服务调用、数据库连接和 API 请求的重试逻辑。
如果应用程序使用 Dapr 与云服务集成,请使用 Dapr 组件复原能力(预览版) 配置重试、超时和断路器。
对于其他依赖项,应用程序必须处理暂时性故障。 调用外部服务时,使用指数退避策略和断路器模式,以防止下游服务中断期间出现级联故障。 容器应用的内置服务发现和负载均衡会自动将流量路由到失败实例之外,但应用程序级重试策略可确保在平台级运行状况检查触发容器重启之前妥善处理暂时性问题。
将作业设计为能够抵抗暂时性故障,包括作业执行过程中的失败或其依赖项的失败。 设计作业以便在重启时能够继续运行,或设计为幂等性,以便可以安全地重新运行作业。
应对可用区故障的弹性
可用性区域 是每个 Azure 区域内物理上独立的数据中心群组。 当某个区域发生故障时,服务可以切换到其他可用的区域。
创建容器应用环境时,可以启用 区域冗余 ,以便在所选 Azure 区域中的多个可用性区域之间分配底层基础结构。 容器应用会自动调度应用实例的跨区域部署。 此分发以透明方式进行 - 无需为单个副本指定区域放置。
区域冗余通过确保容器应用的副本分散到多个区域,增强了应用程序对区域级故障的复原能力。
下图显示了一个示例区域冗余容器应用,该应用具有三个副本,每个副本都在单独的可用性区域中运行:
要求
区域支持: 区域冗余可用于支持容器应用和可用性区域的所有区域。
若要查看哪些区域支持可用性区域,请参阅 具有可用性区域支持的 Azure 区域。
若要查看哪些区域支持容器应用,请参阅 产品可用性(按区域)。
工作负荷配置文件: 区域冗余适用于所有容器应用计划,包括消耗和专用工作负荷配置文件。
在创建环境期间启用区域冗余。 创建环境后,无法更改此设置。
在虚拟网络中部署容器应用环境。 虚拟网络必须位于支持可用性区域的区域中。 确保虚拟网络具有足够大小的子网。 仅消费环境需要具有
/23CIDR 范围或更大的子网,而工作负载环境需要/27CIDR 范围或更大。将最小副本计数配置为至少两 个,以确保跨多个可用性区域分布。 如果满足以下任一条件,请考虑设置更高的最小副本计数:
- 预期峰值负载需要两个以上的副本。
- 需要能够抵御多个同时发生的区域故障。
- 你想要尽量减少在发生区域中断时等待其他区域创建新复制品的时间。
配置可用性区域支持
创建区域冗余的容器应用环境。 有关涵盖 Azure 门户、Azure CLI 和 Azure PowerShell 的部署说明,请参阅 作说明:创建区域冗余容器应用。
迁移到区域冗余部署。 无法在现有容器应用环境中启用区域冗余。 若要升级非区域冗余的现有环境,请在受支持的区域中创建启用了区域冗余的新环境。 然后,重新部署容器应用。
禁用区域冗余。 在创建环境期间启用区域冗余后,无法禁用区域冗余。 如果需要非区域冗余部署,则必须创建新的环境,而无需启用区域冗余选项或部署到不支持可用性区域的区域。
验证。 可以使用 Azure 门户、Azure CLI 和 Azure PowerShell 来验证环境的区域冗余状态。 有关说明,请参阅 “验证区域冗余”。
成本
为容器应用启用区域冗余时,不会产生超出标准容器应用定价的额外费用。 无论是否启用区域冗余,都为计算资源、请求和 vCore 秒支付相同的费率。 有关详细信息,请参阅 Azure 容器应用定价 和 容器应用计费。
容量计划和管理
如果可用性区域不可用,容器应用平台将使用缩放规则来决定何时替换该区域内丢失的副本。 请务必正确配置缩放规则,以便计划程序能够做出适当的计划决策。
若要正确配置缩放规则,请遵循以下原则:
设置应用程序可以容忍的最小副本数。 可能需要一段时间才能替换丢失的副本,因为平台需要检测到旧副本已丢失,然后新副本需要启动并返回正常的就绪情况探测状态,然后才能发送传入请求。 如果不能容忍可能少于指定的最小副本的任何时间段,请考虑 过度预配 以确保即使某个区域变得不可用,应用程序仍保持性能。
为容器适当设置资源请求和限制,以确保容器应用计划程序可以跨区域做出最佳放置决策。 资源需求规格不足可能导致在负载过高时出现分配不均或放置失败。
有关详细信息,请参阅缩放规则以了解配置选项。
所有区域正常时的行为
本部分介绍当容器应用资源配置为区域冗余且所有可用性区域均正常运行时可能遇到的情况。
区域之间的流量路由。 使用区域冗余容器应用,平台在主动/主动模型中运行,其中多个副本同时为流量提供服务。 默认情况下,入口控制器使用轮询负载均衡机制在所有健康的副本之间分配传入请求,而不考虑它们的区域位置。 每个区域独立处理请求,平台不会优先处理任何特定区域进行流量分配。 健康探测源自所有区域,以确保从各个角度准确地评估每个副本的健康状况。
区域之间的数据复制。 容器应用不会在区域之间复制应用程序数据,因为它专为无状态工作负荷而设计。 当容器或副本关闭时,应用存储在 临时存储(包括容器范围的存储和副本范围的存储中)中的任何数据都被删除。
对于有状态数据要求, 请装载 为区域冗余存储配置的 Azure 文件共享,或使用其他 Azure 服务(如 Azure Cosmos DB 或 Azure SQL 数据库)来提供自己的跨区域复制功能。
平台仅复制控制平面元数据,包括应用配置、缩放规则和跨区域机密以实现高可用性。 创建副本时,容器映像会根据需要从容器寄存器提取到每个区域。
区域故障期间的行为
本部分介绍为区域冗余配置应用容器资源并发生可用性区域中断时的预期情况。
检测和响应:Azure 会自动检测区域故障。 容器应用会立即停止调度新副本到失败的区域,并开始将流量重新分发到剩余的区域中的健康副本。 平台会自动处理所有故障转移操作,而无需您的干预。
通知: Azure 不会在区域关闭时自动通知你。 但是,可以使用 Azure 服务运行状况 来了解服务的总体运行状况,包括任何区域故障,并且可以设置 服务运行状况警报 来通知问题。
还可以通过 Azure Monitor 中的容器应用指标监视应用的运行状况。 配置副本数量减少和请求失败率检测的警报,以便在发生区域相关问题时能立即收到通知。
活动请求:对失败区域中的副本的进行中的请求可能会被丢弃,或者可能会遇到超时或连接错误。 受影响区域中运行的任何作业执行都会中止并标记为失败。
预期数据丢失:由于该服务专为无状态工作负荷设计,因此容器应用平台级别不会发生数据丢失。 在终止副本时,存储在可用性区域中 的临时存储 中的任何数据都将丢失,临时存储只能用于临时数据。
预期的停机时间:应用程序在发生区域故障期间可能体验到最少甚至没有停机时间。 实际的影响取决于应用程序的健康探针设置与正常区域中的副本数。 确保客户端遵循 暂时性故障处理指南 ,尽量减少任何影响。
受影响区域中运行的任何作业执行都会中止并标记为失败。 如果需要作业在区域故障时保持弹性,可以配置重试机制或并行度设置,使作业能够运行相同执行的多个副本。 有关详细信息,请参阅 高级作业配置。
重新路由流量:入口控制节点的健康探测能够迅速识别无法访问的副本,并将其从负载均衡池中移除。 根据应用的运行状况探测配置,这通常在大约 30 秒内发生。 后续流入的流量在剩余的可用副本之间分配。 对于继续使用同一应用程序 URL 的客户端,这会以透明方式发生。
如果已启用 会话相关性,并且某个区域出现故障,则以前路由到该区域中副本的客户端将路由到新副本,因为以前的副本不再可用。 与以前的副本关联的任何状态都会丢失。
不会在故障区域中计划任何新的作业执行。
实例管理: 如果自动缩放规则根据负载增加触发,则可能会在正常的区域中创建新的副本实例。
区域恢复
当可用性区域从故障中恢复时,容器应用会自动将区域重新集成到活动服务中,而无需干预。 平台的健康探测检测到恢复区域中的基础设施何时可用,并开始根据缩放配置调度新副本到该区域。 健康区域中的现有副本在此重新集成过程中继续处理流量,从而确保服务不间断。
容器应用程序在正常缩放操作过程中逐渐重新平衡所有可用区的副本分布。 这种自动重新平衡发生在由于缩放事件创建副本或替换不健康的副本时。 平台不会强制立即重新分配现有完好运行的副本,从而防止不必要的容器重启,并在恢复过程中维持应用程序的稳定性。
测试区域故障
容器应用平台管理区域冗余容器应用的流量路由、故障转移和故障恢复。 此功能是完全托管的,因此无需启动或验证可用性区域故障流程。
若要验证应用程序对区域故障的复原能力,请使用受控测试方法模拟应用程序层的区域级中断。 通过缩减应用程序并监视剩余副本如何处理增加的负载来停止或删除特定区域中的副本。 在复原测试期间监视关键指标,包括副本计数、请求成功率、响应时间和自动缩放行为。 确保删除副本时,最小副本计数会保持服务可用性,并验证缩放规则是否可以处理剩余副本上增加的负载。 通过故意使运行状况终结点失败来测试运行状况探测配置,以确认平台在预期时间范围内正确删除不正常的实例。
对区域范围的故障的复原能力
容器应用是单区域服务。 如果区域不可用,则环境和应用也不可用。
用于复原的自定义多区域解决方案
若要降低影响应用程序的单区域故障的风险,可以跨多个区域部署环境。 以下步骤有助于增强复原能力:
- 将应用程序部署到每个区域中的环境。 每个环境都需要自己的虚拟网络配置,子网要求将独立应用于每个区域部署。 您的容器映像必须可以从所有区域访问,可以通过使用已启用地理复制功能的 Azure Container Registry 来实现这一点。
- 使用 Azure Front Door 或 Azure 流量管理器等服务配置负载均衡和故障转移策略。
- 跨区域复制数据,以便恢复最后一个应用程序状态。
备份和还原
容器应用不提供应用程序的内置备份功能或数据。 作为无状态容器托管平台,容器应用希望应用程序通过外部服务管理自己的数据持久性和恢复策略。 应用程序容器及其本地文件系统是临时的,副本重启或移动时,本地存储的任何数据都将丢失。
应用程序更新期间的复原能力
使用修订管理将更新部署到应用程序,而无需停机。 可以使用更新的容器映像创建新的修订,并使用 蓝绿部署策略切换流量,或使用 流量拆分规则逐步迁移流量。 在应用程序更新期间,平台确保在终止旧容器之前创建新的容器来维护最小副本计数,从而防止服务中断。
有关详细信息,请参阅 Azure 容器应用中的更新和部署更改。
服务维护期间的系统弹性能力
容器应用执行自动平台维护以应用安全更新、部署新功能并提高服务可靠性。 该平台使用跨容错域和可用性区域的滚动更新来最大程度地减少对正在运行的应用程序的影响。 在维护时段期间,容器将继续运行,而不会中断,因为将更新应用到分阶段的底层基础结构。
可以指定自己的维护时段,这是你想要对应用执行维护的时间段。 但是,关键更新可能发生在维护时段之外。 有关详细信息,请参阅 Azure 容器应用计划内维护。
服务级别协议
Azure 服务的服务级别协议 (SLA) 描述了每个服务的预期可用性,以及解决方案为实现该可用性预期而必须满足的条件。 有关详细信息,请参阅 联机服务的 SLA。
容器应用的可用性 SLA 基于在应用上设置的规模规则。