Azure Kubernetes 服务 (AKS) 的主动-被动灾难恢复解决方案概述
在 Azure Kubernetes 服务 (AKS) 中创建应用程序并在资源创建期间选择 Azure 区域时,它是单一区域应用。 当该区域在灾难期间变为不可用时,应用程序也变得不可用。 如果在次要 Azure 区域中创建相同的部署,应用程序就不太容易受到单一区域灾难的影响,从而保证业务连续性,并且跨区域的任何数据复制让你能够恢复最近的应用状态。
本指南概述了 AKS 的主动-被动灾难恢复解决方案。 在此解决方案中,我们将两个独立且相同的 AKS 群集部署到两个配对的 Azure 区域,只有一个群集主动提供流量服务。
注意
以下做法已经过内部审查,并与 Microsoft 合作伙伴共同进行了审查。
主动-被动解决方案概述
在此灾难恢复方法中,我们在两个 Azure 区域中部署了两个独立的 AKS 群集。 但任何时候只有其中一个群集主动提供流量服务。 辅助群集(不主动提供流量)包含与主群集相同的配置和应用程序数据,但除非 Azure Front Door 流量管理器指示,否则不接受任何流量。
方案和配置
当托管依赖于资源(例如数据库)的应用程序时,最好实现此解决方案,这些资源在一个区域中主动提供流量服务。 在需要托管跨两个区域部署的无状态应用程序的场景中(例如水平缩放),建议考虑使用主动-主动解决方案,因为主动-被动解决方案会增加延迟。
组件
主动-被动灾难恢复解决方案使用多种 Azure 服务。 此示例体系结构涉及以下组件:
多个群集和区域:可部署多个 AKS 群集,每个群集位于单独的 Azure 区域中。 在正常操作期间,网络流量将路由到在 Azure Front Door 配置中设置的主 AKS 群集。
配置的群集优先级:可以为每个群集设置 1-5 之间的优先级(1 为最高优先级,5 为最低优先级)。 可以将多个群集设置为相同的优先级,并指定每个群集的权重。 如果主群集不可用,流量会自动路由到在 Azure Front Door 中选择的下一个区域。 所有流量都必须通过 Azure Front Door 才能使该系统正常工作。
Azure Front Door:Azure Front Door 会对流量进行负载均衡并将其路由到主要区域中的 Azure 应用程序网关实例(群集必须标记为优先级 1)。 如果该区域出现故障,服务会将流量重定向到优先级列表中的下一个群集。
中心辐射对:为每个区域 AKS 实例部署了一个中心辐射对。 Azure 防火墙管理器策略管理每个区域的防火墙规则。
Key Vault:每个区域都预配了 Azure Key Vault,用于存储机密和密钥。
Log Analytics:区域级 Log Analytics 实例存储区域网络指标和诊断日志。 共享实例可存储所有 AKS 实例的指标和诊断日志。
容器注册表:工作负载的容器映像存储在托管容器注册表中。 使用此解决方案,单个 Azure 容器注册表实例可用于群集中的所有 Kubernetes 实例。 使用适用于 Azure 容器注册表的异地复制,可以将映像复制到所选 Azure 区域,并且即使某个区域遇到服务中断,也可继续访问映像。
故障转移过程
如果某个服务或服务组件在一个区域中不可用,则流量应会路由到该服务可用的区域。 多区域体系结构包含许多不同的故障点。 在本部分中,我们将介绍潜在的故障点。
应用程序 Pod(区域)
Kubernetes 部署对象可创建 Pod 的多个副本 (ReplicaSet)。 如果其中一个不可用,则会在剩余的副本之间路由流量。 Kubernetes ReplicaSet 会尝试启动指定数量的副本并使其保持正常运行。 如果一个实例出现故障,应会重新创建一个新实例。 运行情况探测可检查 Pod 中运行的应用程序或进程的状态。 如果 Pod 无响应,则运行情况探测将移除 Pod,这会强制 ReplicaSet 创建新的实例。
有关详细信息,请参阅 Kubernetes ReplicaSet。
应用程序 Pod(全局)
当整个区域不可用时,群集中的 Pod 将无法再为请求提供服务。 在这种情况下,Azure Front Door 实例会将所有流量路由到剩余的正常区域。 这些区域中的 Kubernetes 群集和 Pod 将继续为请求提供服务。 为了对剩余群集增加的流量和请求进行补偿,请记住以下指导:
- 确保网络和计算资源的大小正确,可承受区域故障转移导致的流量突增。 例如,使用 Azure 容器网络接口 (CNI) 时,请确保有一个子网可以支持所有具有峰值流量负载的 Pod IP。
- 使用水平 Pod 自动缩放程序来增加 Pod 副本计数,以对增加的区域需求进行补偿。
- 利用 AKS 群集缩放程序增加 Kubernetes 实例节点计数,以对增加的区域需求进行补偿。
Kubernetes 节点池(区域)
计算资源有时可能会发生局部故障,例如当一个机架的 Azure 服务器的电源不可用时。 要保护 AKS 节点免受单点区域故障的影响,请使用 Azure 可用性区域。 可用性区域可确保每个可用性区域中的 AKS 节点与另一个可用性区域中定义的节点在物理上分离。
Kubernetes 节点池(全局)
在完全区域故障中,Azure Front Door 会将流量路由到剩余正常的区域。 同样,请确保对剩余群集增加的流量和请求进行补偿。
后续步骤
如果要考虑其他解决方案,请参阅以下文章: