Azure Kubernetes 服务中的可靠性 (AKS)

本文介绍 Azure Kubernetes 服务(AKS)中的可靠性支持。 它解决了区域复原、 可用性区域和多区域部署问题。

生产部署建议

有关如何在 AKS 中部署可靠生产工作负荷的建议,请参阅以下文章:

可靠性体系结构概述

创建 AKS 群集时,Azure 平台会自动创建和配置:

  • 一个包含 API 服务器、etcd、调度程序和管理工作负载所需的其他 Pod 的控制平面
  • 一个针对你的订阅的系统节点池,用于托管 kube-system 命名空间中运行的加载项和附加 Pod

完成此初始节点池设置后,可以为自己的用户工作负荷 添加或删除节点池 。 节点池的可靠性不由 AKS 进行管理,因此您必须确保您的工作负荷能够应对基础设施故障。

Kubernetes 控制平面和节点组件的屏幕截图。

复原能力是你和Microsoft之间的共同责任。 作为计算服务,AKS 负责群集可靠性的某些方面,但你负责其他方面:

  • Azure 负责 AKS 的托管组件,如 AKS 控制平面。
  • 对于 AKS 代表你部署和管理的组件,包括附加到服务的节点池和负载均衡器,需要承担双重责任。 需要定义组件应如何配置为满足可靠性要求,然后 Azure 会根据要求部署组件。
  • AKS 群集之外的任何组件(包括存储和数据库)都由你负责。 需要验证这些组件是否满足可靠性要求。 部署工作负荷时,需要遵循这些服务的最佳做法,确保其他 Azure 组件也配置为复原能力。

暂时性故障

暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 经过短暂的时间后,它们就会自我纠正。 应用程序必须能够处理暂时性故障,处理方式通常是重试受影响的请求。

与任何云托管 API、数据库和其他组件通信时,所有云托管应用程序都应遵循 Azure 的暂时性故障处理指南。 要详细了解如何处理暂时性故障,请参阅暂时性故障处理建议

使用 AKS 时,可能会由于各种原因(包括应用程序崩溃、Pod 缩放和均衡作、节点修补和临时基础结构故障(如硬件或网络问题)而发生暂时性故障。

由于无法消除所有暂时性故障,因此访问 AKS 托管应用程序的客户端应准备好重试失败的请求并遵循其他暂时性故障处理建议。 同时,仍可以通过在部署中遵循 Kubernetes 和 Azure 最佳做法来尽量降低暂时性故障的可能性,并避免或缓解故障时间, 例如:

  • 在 Pod YAML 中设置 Pod 中断预算(PDB),以指定在任何给定时间点需要处于 状态的 Pod 数量Ready。 设置后,AKS 确保在运行操作以隔离和排出节点时最小副本的可用性。 如果在升级等过程中不能满足 PDB,Pod 继续运行,且操作可能失败。 有关详细信息,请参阅 Pod 中断预算 (PDB)
  • maxUnavailable 以定义在任何给定时间点可能不可用的最大副本数。 例如,如果要执行滚动重启,AKS 确保在给定时间点改动的 Pod 数不超过 maxUnavailable。 有关详细信息,请参阅 maxUnavailable
  • 遵循部署最佳做法。 Pod 副本也可能因应用程序问题而失败。 有关如何处理这些问题的详细信息,请参阅 AKS 群集可靠性的部署级别最佳做法

注释

如果希望 AKS 验证部署是否符合最佳做法,并在必要时提供阻止或警告通知,则可以使用部署保障(预览版),该托管产品/服务有助于在代码部署到群集之前强制实施产品最佳做法。 有关详细信息,请参阅 使用部署安全措施在 Azure Kubernetes 服务(AKS)(预览版)中强制实施最佳做法

可用性区域支持

可用性区域是每个 Azure 区域内在物理上独立的数据中心组。 当某个区域发生故障时,服务可以切换到其他可用的区域。

有关 Azure 中可用性区域的详细信息,请参阅什么是可用性区域?

将 AKS 群集部署到支持可用性区域的区域中时,不同的组件需要不同类型的配置。

默认情况下,AKS 控制平面具有区域复原能力,在发生区域故障时,不需要任何配置或管理来实现复原能力。 但是,控制平面复原不足以使群集在发生区域故障时保持运行状态。 对于系统节点池和您部署的任何用户节点池,必须启用可用区支持,以确保您的工作负荷能够应对可用区故障。

区域支持

区域可复原的 AKS 群集可以部署到支持可用性区域的任何区域中。

注意事项

若要增强区域中 AKS 生产工作负荷的可靠性与复原能力,需要通过进行以下配置来配置 AKS 来实现区域冗余:

  • 部署多个副本:Kubernetes 基于节点标签跨节点分布 Pod。 若要跨区域分散工作负荷,需要确保部署 Pod 的多个副本。 例如,如果将节点池配置为包含三个可用区,但仅部署 Pod 的单个副本,则您的部署将不会具有区域故障恢复能力。
  • 启用自动缩放:Kubernetes 节点池提供手动和自动缩放选项。 通过手动缩放,可以根据需要添加或删除节点,且挂起的 Pod 等待,直到你纵向扩展节点池。 借助 AKS 托管缩放(使用群集自动缩放程序节点自动预配 (NAP)),AKS 基于订阅 SKU 配额和容量中的 Pod 需求缩放节点池。 这确保你的 Pod 被安排在上行区域的可用节点上。
  • 设置 Pod 拓扑约束:使用 Pod 拓扑分布约束来控制 Pod 分布到不同节点或区域的方式。 这有助于实现高可用性和复原能力和高效的资源利用率。 如果希望严格地跨区域分布,可以将它们设置为强制 Pod 进入挂起状态,以保持跨区域的 Pod 平衡。 有关详细信息,请参阅 Pod 拓扑分布约束
  • 配置区域复原网络:如果 Pod 提供外部流量,请使用 Azure 应用程序网关 v2标准负载均衡器或 Azure Front Door 等服务配置群集网络体系结构。
  • 确保依赖项具有区域复原能力:大多数 AKS 应用程序使用其他服务进行存储、安全性或网络。 确保同时查看这些服务的区域复原建议。

成本

在 AKS 中启用可用性区域支持无需额外付费。 需要为在可用性区域中部署的虚拟机(VM)和其他资源付费。

配置可用性区域支持

  • 创建具有可用性区域支持的新 AKS 群集:若要配置可用性区域支持,请参阅 创建使用可用性区域的 Azure Kubernetes 服务 (AKS) 群集
  • 迁移:创建群集后无法启用可用性区域支持。 相反,需要创建启用了可用性区域支持的新群集,并删除旧群集。
  • 禁用可用性区域支持:创建群集后无法禁用可用性区域支持。 而你需要创建一个启用了可用性区域支持的新群集,并删除旧群集。

常规操作

  • 区域之间的流量路由: 部署使用可用性区域的 AKS 群集时,请务必确保网络组件也具有区域复原能力。 根据使用的负载均衡器和其他网络组件,可能需要显式配置它们,以将流量路由到正确区域中的正确节点,并响应区域中断。 若要了解详细信息,请参阅 Azure Kubernetes 服务(AKS)的区域复原注意事项

  • 区域之间的数据复制: 如果运行的是无状态工作负荷,则应使用托管的 Azure 服务(例如 Azure 数据库Azure Redis 缓存Azure 存储 )来存储应用程序数据。 使用这些服务可确保流量可以跨节点和区域移动,而不会造成数据丢失或影响用户体验的风险。 可以使用 Kubernetes 部署服务运行状况探测来管理无状态 Pod,并确保均匀分布到各个区域。

    如果需要使用 Azure 磁盘在群集中存储状态,请使用 Azure 区域冗余存储(ZRS),以确保数据跨多个可用性区域复制。 有关详细信息,请参阅 根据应用程序需求选择正确的磁盘类型

区域关闭体验

  • 检测和响应:发生区域中断时,控制平面自动故障转移。 如果节点池使用可用性区域并遵循区域复原最佳做法,则可以预期 AKS 在启动和运行的区域中启动节点和副本。 使用群集自动缩放程序或 NAP 等托管解决方案时,会自动完成此作。 如果没有自动缩放,它们将保持挂起状态,并等待手动干预以纵向扩展节点池。 AKS 还尝试在正常区域中再平衡 Pod。 如果选择在区域关闭的场景中手动缩放节点池,则当正常区域中没有可用节点时,Pod 可能处于挂起状态。 此外,剩余区域中的横向扩展还取决于使用的 VM SKU 的配额和容量的可用性。

  • 通知:AKS 当前不会在区域关闭时通知你。 可以使用节点或 Pod 运行状况指标来监视节点和 Pod 的运行状况。

  • 活动请求:任何活动请求都可能会遇到中断。 当工作负载故障转移到另一个区域时,某些请求可能会失败,延迟可能会增加。

  • 预期数据丢失:如果使用 Azure 磁盘在群集中存储状态,并且使用区域冗余存储,则区域故障不会造成任何数据丢失。

  • 预期停机时间:如果为群集和 Pod 正确配置了区域复原能力,则区域故障不会导致 AKS 工作负荷停机。 若要了解详细信息,请参阅 Azure Kubernetes 服务(AKS)的区域复原注意事项

  • 流量重新路由:负载均衡器负责将新的传入请求重新路由到在正常节点上运行的 Pod。 若要了解详细信息,请参阅 Azure Kubernetes 服务(AKS)的区域复原注意事项

故障回复

当可用性区域恢复时,故障回复行为因组件而异:

  • 控制平面:AKS 自动还原所有可用性区域中的控制平面操作。 无需手动干预。
  • 节点池和节点:故障回复后,节点立即保留在先前正常的区域中,不会还原到恢复的区域中。 但是,下次执行节点缩放操作时,例如扩展节点池时,节点池可以在恢复的区域中创建节点。
  • Pod:故障回复后,Pod 立即继续在它们已在其上运行的节点上运行。 创建新 Pod 或重新创建现有 Pod 时,它们有资格使用恢复区域中的节点。
  • 存储: 附加到 Pod 的任何存储会根据 区域冗余存储的工作原理进行恢复。

对区域故障进行测试

可以使用以下方法测试可用性区域故障的复原能力:

多区域支持

AKS 群集是单区域资源。 如果区域不可用,AKS 群集也不可用。

备选多区域方法

如果需要将 Kubernetes 工作负荷部署到多个 Azure 区域,可以使用两类选项来管理这些群集的业务流程:

  • Azure Kubernetes Fleet Manager(Fleet) 提供更简单、更托管的体验。 通过舰队,可以:
    • 将一组 AKS 群集作为单个单元进行管理,这些群集可以分布在多个 Azure 区域。
    • 自动执行群集管理的某些方面,例如群集和节点映像升级。
    • 使用舰队流量分配功能,将流量分布到各群集中,并在某个区域不可用时自动故障转移。
  • 如果工作负荷需要对区域间故障转移的不同组件进行更细微的控制,请通过手动主动-主动或主动-被动部署模型协调故障转移。 有关详细信息,请参阅 Azure Kubernetes 服务的高可用性和灾难恢复概述(AKS)。

备份

使用 Azure 备份,您可以使用备份扩展来备份 AKS 群集资源以及附加到该群集的持久性卷。 备份保管库通过扩展与 AKS 群集通信以执行备份和还原操作。

如果 AKS 群集位于 配对区域,则可以将备份配置为存储在地理冗余存储中。 可以将异地冗余备份还原到配对区域中。

如需了解更多信息,请参阅以下文章:

对于大多数解决方案,不应只依赖于备份。 请改用本指南中所述的其他功能来支持复原要求,并努力使用无状态群集来最大程度地减少备份需求。 将数据存储在外部存储系统和数据库中,而不是在群集中存储数据。

如果在群集中保持状态,备份会防范其他方法未出现的某些风险。 有关详细信息,请参阅 什么是冗余、复制和备份?

服务级别协议

Azure 逻辑应用的服务级别协议 (SLA) 描述了服务的预期可用性。 此协议还描述了实现此期望的条件。 若要了解这些条件,请确保查看联机服务的服务级别协议 (SLA)

AKS 为群集管理提供三个定价层:免费、标准和高级。 有关详细信息,请参阅 Azure Kubernetes 服务(AKS)群集管理的免费、标准和高级定价层。 免费层允许您使用 AKS 来测试您的工作负载。 标准和高级层专为生产工作负荷而设计。 部署启用了可用性区域的 AKS 群集时,SLA 中定义的运行时间百分比会增加。 但是,仅当在标准或高级定价层中部署群集时,SLA 才会涵盖此情况。