集群故障迁移过程解析
让我们对 Karmada 集群故障迁移的过程进行解析。
添加集群污点
当集群状态变得不健康之后,集群将会被添加上 taint{effect: NoSchedule},具体情况为:
- 当集群状态中的
ReadyCondition 变为False时,Karmada 控制器将为目标集群对象添加如下污点:
key: cluster.karmada.io/not-ready
effect: NoSchedule
- 当集群状态中的
ReadyCondition 变为Unknown时,Karmada 控制器将为目标集群对象添加如下污点:
key: cluster.karmada.io/unreachable
effect: NoSchedule
此外,Karmada 控制器不会为集群对象主动添加 NoExecute 污点,用户可以通过集群污点管理功能对集群对象上的污点,包括 NoExecute 污点,进行主动管理。
故障迁移
当 Karmada 控制器发现某个集群被打上了 NoExecute 污点,且该污点不能被受影响的 PropagationPolicy/ClusterPropagationPolicy 中的容忍策略所容忍时,Karmada 控制器会将该集群从 PropagationPolicy/ClusterPropagationPolicy 所命中的资源的调度结果中移除,随后 Karmada 调度器将重新调度这些受影响的资源。
重调度的过程有以下几个限制:
- 对于每个重调度的工作负载,仍然需要满足
PropagationPolicy/ClusterPropagationPolicy的约束,如ClusterAffinity或SpreadConstraints。 - 应用初始调度结果中健康的集群在重调度过程中仍将被保留。
Duplicated 调度类型
对于调度类型为 Duplicated 的资源,集群故障之后重新调度时,只有当满足分发策略限制的候选集群数量大于等于发生故障的集群数量时,调度才会继续执行,否则不执行。其中,候选集群是指在本次调度过程中新计算出的集群调度结果,区别于已调度集群。
以Deployment资源为例:
unfold me to see the yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
- member2
- member3
- member5
spreadConstraints:
- maxGroups: 2
minGroups: 2
replicaScheduling:
replicaSchedulingType: Duplicated
假设 Karmada 实例管理了 5 个集群:member1,member2,member3,member4,member5,Deployment default/nginx 的初始调度结果为 member1、member2 集群。当 member2 集群发生故障后,Karmada 调度器将对该负载进行重调度。
需要注意的是,重调度不会删除原本状态为 Ready 的集群 member1 上的工作负载。在其余 3 个集群中,只有 member3 和 member5 匹配 clusterAffinity 策略。
由于分发约束的限制,最后应用调度的结果将会是 [member1, member3] 或 [member1, member5]。