Karmada跨集群优雅故障迁移特性解析

2022-11-23 00:00:00 集群 故障 调度 迁移 状态

本文分享自华为云社区《Karmada跨集群优雅故障迁移特性解析》,作者:Karmada社区。

在多云多集群应用场景中,为了提高业务的高可用性,用户的工作负载可能会被部署在多个集群中。然而当某个集群*发生故障时,为保证业务的可用性与连续性,用户希望故障集群上的工作负载被自动的迁移到其他条件适合的集群中去,从而达成故障迁移的目的。

Karmada 在 v1.0 版本发布之前便已支持跨集群故障迁移能力,经历过社区多个版本的开发迭代,跨集群故障迁移能力不断完善。在 Karmada 新版本 v1.3 (https://github.com/karmada-io/karmada/tree/release-1.3)中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑。

下面我们对该特性展开解析。

▍回顾:单集群故障迁移

在 Kubernetes 的架构中,Node 作为运行 Pod 实例的单元,不可避免地面临出现故障的可能性,故障来源不限于自身资源短缺、与 Kubernetes 控制面失去连接等。提供服务的可靠性、在节点故障发生后保持服务的稳定一直是 Kubernetes 关注的重点之一。在 Kubernetes 管理面,当节点出现故障或是用户不希望在节点上运行 Pod 时,节点状态将被标记为不可用的状态,node-controller 会为节点打上污点,以避免新的实例调度到当前节点上、以及将已有的 Pod 实例迁移到其他节点上。

▍集群故障判定

相较于单集群故障迁移,Karmada 的跨集群故障迁移单位由节点变为了集群。Karmada 支持Push 和 Pull 两种模式来管理成员集群,有关集群注册的信息可以参考Cluster Registration(http://karmada.io/docs/next/userguide/clustermanager/cluster-registration/)。Karmada 根据集群的心跳来判定集群当前的状态。集群心跳探测有两种方式:1.集群状态收集,更新集群的 .status 字段(包括 Push 和 Pull 两种模式);2.控制面中 karmada-cluster 命名空间下的 Lease 对象,每个 Pull 集群都有一个关联的 Lease 对象。

集群状态收集

对于 Push 集群,Karmada 控制面中的 clusterStatus-controller 将定期执行集群状态的收集任务;对于 Pull 集群,集群中部署的 karmada-agent 组件负责创建并定期更新集群的 .status 字段。集群状态的定期更新任务可以通过 --cluster-status-update-frequency 标签进行配置(默认值为10秒)。集群的 Ready 条件在满足以下条件时将会被设置为 False :· 集群持续一段时间无法访问;· 集群健康检查响应持续一段时间不正常。上述持续时间间隔可以通过 --cluster-failure-threshold 标签进行配置(默认值为30秒)。

集群 Lease 对象更新

每当有 Pull 集群加入时,Karmada将为该集群创建一个 Lease 对象和一个 lease-controller。每个 lease-controller 负责更新对应的 Lease 对象,续租时间可以通过 --cluster-lease-duration 和 --cluster-lease-renew-interval-fraction 标签进行配置(默认值为10秒)。由于集群的状态更新由 clusterStatus-controller 负责维护,因此 Lease 对象的更新过程与集群状态的更新过程相互独立。Karmada 控制面中的 cluster-controller 将每隔 --cluster-monitor-period 时间(默认值为5秒)检查 Pull 集群的状态,当 cluster-controller 在 --cluster-monitor-grace-period 时间段(默认值为40秒)内没有收到来着集群的消息时,集群的 Ready 条件将被更改为 Unknown 。

检查集群状态

你可以使用 kubectl 命令来检查集群的状态细节:kubectl describe cluster

▍故障迁移过程

集群污点添加

当集群被判定为不健康之后,集群将会被添加上Effect值为NoSchedule的污点,具体情况为: · 当集群 Ready 状态为 False 时,将被添加如下污点:key: cluster.karmada.io/not-ready effect: NoSchedule· 当集群 Ready 状态为 Unknown 时,将被添加如下污点:key: cluster.karmada.io/unreachable effect: NoSchedule 如果集群的不健康状态持续一段时间(该时间可以通过 --failover-eviction-timeout 标签进行配置,默认值为5分钟)仍未恢复,集群将会被添加上Effect值为NoExecute的污点,具体情况为:

·当集群 Ready 状态为 False 时,将被添加如下污点:key: cluster.karmada.io/not-ready effect: NoExecute

·当集群 Ready 状态为 Unknown 时,将被添加如下污点:key: cluster.karmada.io/unreachable effect: NoExecute

容忍集群污点

当用户创建 PropagationPolicy/ClusterPropagationPolicy 资源后,Karmada 会通过 webhook 为它们自动增加如下集群污点容忍(以 PropagationPolicy 为例):

相关文章