Karmada跨集群优雅故障迁移特性解析
Karmada社区
node-controller
会为节点打上污点,以避免新的实例调度到当前节点上、以及将已有的 Pod 实例迁移到其他节点上。
Cluster Registration
(http://karmada.io/docs/next/userguide/clustermanager/cluster-registration/)。Karmada 根据集群的心跳来判定集群当前的状态。集群心跳探测有两种方式:
.status
字段(包括 Push 和 Pull 两种模式);
karmada-cluster
命名空间下的 Lease 对象,每个 Pull 集群都有一个关联的 Lease 对象。
clusterStatus-controller
将定期执行集群状态的收集任务;对于 Pull 集群,集群中部署的 karmada-agent 组件负责创建并定期更新集群的 .status
字段。集群状态的定期更新任务可以通过 --cluster-status-update-frequency
标签进行配置(默认值为10秒)。集群的 Ready
条件在满足以下条件时将会被设置为 False
:
--cluster-failure-threshold
标签进行配置(默认值为30秒)。
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
key: cluster.karmada.io/not-ready effect: NoSchedule
· 当集群 Ready 状态为 Unknown 时,将被添加如下污点:key: cluster.karmada.io/unreachable effect: NoSchedule 如果集群的不健康状态持续一段时间(该时间可以通过 --failover-eviction-timeout 标签进行配置,默认值为5分钟)仍未恢复,集群将会被添加上Effect值为NoExecute的污点,具体情况为:
当用户创建 PropagationPolicy/ClusterPropagationPolicy
资源后,Karmada 会通过 webhook
为它们自动增加如下集群污点容忍(以 PropagationPolicy
为例):
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
namespace: default
spec:
placement:
clusterTolerations:
- effect: NoExecute
key: cluster.karmada.io/not-ready
operator: Exists
tolerationSeconds: 600
- effect: NoExecute
key: cluster.karmada.io/unreachable
operator: Exists
tolerationSeconds: 600
...
其中,tolerationSeconds
值可以通过 --default-not-ready-toleration-seconds 与--default-unreachable-toleration-seconds
标签进行配置,这两个标签的默认值均为600。
PropagationPolicy/ClusterPropagationPolicy
容忍时,该集群将被从资源调度结果中移除,随后,karmada-scheduler 重调度相关工作负载。重调度的过程有以下几个限制:
PropagationPolicy/ClusterPropagationPolicy
的约束,如 ClusterAffinity
或 SpreadConstraints
。
Duplicated
调度类型
对于 Duplicated
调度类型,当满足分发策略限制的候选集群数量不小于故障集群数量时,将根据故障集群数量将工作负载重新调度到候选集群;否则,不进行重调度。
...
placement:
clusterAffinity:
clusterNames:
- member1
- member2
- member3
- member5
spreadConstraints:
- maxGroups: 2
minGroups: 2
replicaScheduling:
replicaSchedulingType: Duplicated
...
假设有5个成员集群,初始调度结果在 member1
和 member2
集群中。当 member2
集群发生故障,触发 karmada-scheduler
重调度。
需要注意的是,重调度不会删除原本状态为 Ready 的集群 member1 上的工作负载。在其余3个集群中,只有 member3
和 member5
匹配 clusterAffinity
策略。由于传播约束的限制,最后应用调度的结果将会是 [member1, member3]
或 [member1, member5]
。
-分发 Divided
调度类型
对于 Divided
调度类型,karmada-scheduler
将尝试将应用副本迁移到其他健康的集群中去。
...
placement:
clusterAffinity:
clusterNames:
- member1
- member2
replicaScheduling:
replicaDivisionPreference: Weighted
replicaSchedulingType: Divided
weightPreference:
staticWeightList:
- targetCluster:
clusterNames:
- member1
weight: 1
- targetCluster:
clusterNames:
- member2
weight: 2
...
ResourceBinding/ClusterResourceBinding
中增加了 GracefulEvictionTasks
字段来表示优雅驱逐任务队列:
// GracefulEvictionTasks holds the eviction tasks that are expected to perform
// the eviction in a graceful way.
// The intended workflow is:
// 1. Once the controller(such as 'taint-manager') decided to evict the resource that
// is referenced by current ResourceBinding or ClusterResourceBinding from a target
// cluster, it removes(or scale down the replicas) the target from Clusters(.spec.Clusters)
// and builds a graceful eviction task.
// 2. The scheduler may perform a re-scheduler and probably select a substitute cluster
// to take over the evicting workload(resource).
// 3. The graceful eviction controller takes care of the graceful eviction tasks and
// performs the final removal after the workload(resource) is available on the substitute
// cluster or exceed the grace termination period(defaults to 10 minutes).
//
// +optional
GracefulEvictionTasks []GracefulEvictionTask `json:"gracefulEvictionTasks,omitempty"`
当故障集群被 taint-manager
从资源调度结果中删除时,它将被添加到优雅驱逐任务队列中。gracefulEvction-controller
负责处理优雅驱逐任务队列中的任务。在处理过程中,gracefulEvction-controller
逐个评估优雅驱逐任务队列中的任务是否可以从队列中移除。判断条件如下:
graceful-evction-timeout
标签进行配置(默认为10分钟)。如果超过,则满足条件。
项目地址:
https://github.com/karmada-io/karmada
Slack地址:
https://slack.cncf.io/
- 点赞
- 收藏
- 关注作者
评论(0)