随着云原生技术的发展,其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中,随着 Kubernetes 集群规模的不断扩大,也带来了许多管理挑战,例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问题,Karmada 多集群管理平台应运而生,同时还提供了强大的故障转移能力。
在多云多集群场景中,为了提高业务的高可用性,工作负载可能会被部署在多个不同的集群。在 Karmada 中,当集群发生故障,或是用户不希望在某个集群上继续运行工作负载时,集群状态将被标记为不可用,并被添加上一些污点。Taint-manager 检测到集群故障之后,会从这些故障集群中驱逐工作负载,被驱逐的工作负载将被调度至其他最适合的集群,从而达成故障迁移的目的,保证了用户业务的可用性与连续性。
一、故障迁移的场景
为何需要故障转移?下面来介绍一些多集群故障迁移的场景:
-
管理员在 Karmada 控制面部署了一个离线业务,并将业务 Pod 实例分发到了多个集群。突然某个集群发生故障,管理员希望 Karmada 能够把故障集群上的 Pod 实例迁移到其他条件适合的集群中;
-
普通用户通过 Karmada 控制面在某一个集群上部署了一个在线业务,业务包括服务器实例、配置文件等,服务通过控制面上的 ELB 对外暴露,此时某一集群发生故障,用户希望把整个业务能迁移到另一个情况较适合的集群上,业务迁移期间需要保证服务不断服;
-
管理员将某个集群进行升级,作为基础设施的容器网络、存储等发生了改变,管理员希望在集群升级之前把当前集群上的应用迁移到其他适合的集群中去,业务迁移期间需要保证服务不断服。
二、如何进行故障迁移
上图展示了两种不同的迁移方式
Karmada 支持用户设置分发策略,在集群发生故障后,将故障集群实例进行自动的集中式或分散式的迁移。如图用户在 Karmada 中加入了三个集群,分别为:member1、member2 和 member3。
- 在 Karmada 的控制面部署了一个副本数为 3 的工作负载,并通过部署策略(PropagationPolicy)将其分发到了集群 member1 和 member2 上。
- 当集群 member1发生故障之后,其工作负载上的 Pod 实例将会被驱逐,通过 PropagationPolicy/ClusterPropagationPolicy 的副本调度策略 ReplicaSchedulingStrategy 来控制 Pod 被全部迁移到集群 member2 或是分散迁移至两个集群中。
三、工作负载被驱逐的时间线
下面通过示例,简单讲解在 DCE 5.0 多云编排模块中,一个工作负载被驱逐的时间线:
首先,每一段时间调用一次集群的 API 用以记录集群的健康状态,当集群状态始终为健康时,我们认定集群的健康状态正常。此时我们将 DCE 与集群 APIserver 之间的 TCP 断开,10s-20s 之内,若没有获取到集群的健康状态将认为集群异常,被标记为非健康状态,同时打上 NoSchedule 的污点,如果集群的不健康状态持续一段时间,在指定时间内若集群仍然没有恢复健康,超过指定的驱逐容忍时长后,将被打上 NoExecute 的污点,最终被驱逐。
四、影响故障转移时效的指标
在 Karmada 中启用了 Failover 之后,Karmada 提供了几个参数配置选项,与上图对应,分别为:
ClusterMonitorPeriod:检查集群状态的时间间隔,默认 60s;
ClusterMonitorGracePeriod:运行中标记集群不健康检查时长,默认 40s;
ClusterStartupGracePeriod:启动时标记集群不健康的检查时长,默认 600s;
FailoverEvictionTimeout:驱逐容忍时长,集群被标记为不健康后,超过此时长会给集群打上污点,并进入驱逐状态,默认 30s;
ClusterTaintEvictionRetryFrequency:优雅驱逐超时时长,进入优雅驱逐队列后,最长等待时长,超时后会立即删除,默认 5s。
影响故障转移的延时时效的主要有以下 2 个维度的指标,需要组合配置才能最终达到延迟灵敏度的效果。如何使配置过程更加友好?在我们的 DCE 5.0 多云编排模块中,我们将故障转移的相关配置表单化,能够降低用户的使用门槛,同时提高配置的成功率。
1. 集群维度:标记集群为不健康的检查时长、集群驱逐容忍时长。
2. 工作负载维度:集群污点容忍时长。
当用户创建资源 PropagationPolicy/ClusterPropagationPolicy 后,Karmada 会通过 webhook 为它们自动增加如下集群污点容忍:
五、优化故障转移时效的优势
1、提高应用程序的可靠性和可用性
Karmada 故障转移功能可以确保工作负载在节点或集群出现故障时不会直接停机,从而提高应用程序的可靠性和可用性。这对于一些已经部署了庞大的业务系统的企业来说是非常重要的。
2、提供快速的恢复能力
Karmada 故障转移功能能够快速迁移工作负载到健康节点或集群上,从而缩短节点恢复的时间,减少业务停机时间,大大节约企业的成本和时间。
3、避免业务流量损失
Karmada 故障转移功能能够及时将故障的工作负载迁移至健康节点或集群,从而避免业务流量损失。
今后,相信随着云原生技术的不断发展和完善,Karmada 的故障转移功能在未来能够更加广泛地应用到各个领域,为企业的业务提供更好的保障。