2. 跨集群调度基础:ReplicaSchedulingPreference (RSP) 策略、调度器工作原理、集群权重与容量分配
2.1 ReplicaSchedulingPreference (RSP) 策略
ReplicaSchedulingPreference (RSP) 是 Federation v2 中用于定义跨集群副本调度策略的核心 CRD。它告诉调度器“应该把 Pod 副本如何分布到不同的成员集群中”。RSP 策略是声明式的,用户只需描述期望的分布状态,调度器负责将其实现。
2.1.1 RSP 关键字段与语义
| 字段 | 类型 | 说明 |
|---|---|---|
spec.targetTemplate |
Object | 定义被调度的资源模板(如 Deployment、Job) |
spec.totalReplicas |
int32 | 期望的全局副本总数 |
spec.clusters |
[]ClusterPreferences | 集群级别的偏好设置,包含权重、最小/最大副本数 |
spec.rebalance |
bool | 是否允许调度器在集群间重新平衡已有副本 |
2.1.2 集群偏好 (ClusterPreferences) 结构
每个集群的偏好配置决定了副本在该集群的分布行为:
- weight:集群权重,决定副本按比例分配的基础。
- minReplicas:该集群最少保留的副本数,保证基础容量。
- maxReplicas:该集群最多容纳的副本数,防止过载。
关键原则: 调度器先满足所有集群的
minReplicas,再将剩余副本按 weight 比例分配,最后受 maxReplicas 上限约束。
2.1.3 RSP 示例 YAML
apiVersion: scheduling.federation.k8s.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: my-app-rsp
spec:
targetTemplate:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.21
totalReplicas: 10
clusters:
- name: cluster-a
weight: 3
minReplicas: 2
maxReplicas: 6
- name: cluster-b
weight: 1
minReplicas: 1
maxReplicas: 4
rebalance: true
2.2 调度器工作原理
Federation 调度器是一个独立的控制器,持续监听 RSP 对象和成员集群的状态。其工作流程分为四个阶段:
- 读取 RSP 策略:从 API Server 获取用户定义的 RSP 对象。
- 收集集群状态:查询每个成员集群的当前副本数、资源可用量、节点容量。
- 计算目标分布:根据权重、最小/最大副本数、集群当前负载,计算每个集群应分配的副本数。
- 执行调度:通过 Federated 资源(如 FederatedDeployment)将副本分发到目标集群。
调度触发条件: RSP 变更、集群加入/离开、集群资源状态变化、定时 rebalance 周期。
2.3 集群权重与容量分配
2.3.1 权重分配算法
调度器使用加权比例分配算法,确保副本分布与集群权重成正比。算法步骤如下:
- 计算总权重:所有集群的 weight 之和。
- 计算基础分配:每个集群的初始分配 = totalReplicas × (weight / totalWeight)。
- 应用 minReplicas:如果基础分配小于 minReplicas,则提升到 minReplicas。
- 应用 maxReplicas:如果分配超过 maxReplicas,则截断到 maxReplicas。
- 重新分配剩余副本:将因 min/max 约束产生的剩余副本,按权重重新分配给未达到上限的集群。
2.3.2 容量感知调度
除了权重,调度器还会考虑集群的 实际资源容量(CPU、内存、Pod 数量上限)。当集群资源不足时,调度器会:
- 将该集群的可用副本数限制在资源允许范围内。
- 将无法分配的副本转移到其他有容量的集群。
- 如果所有集群都无法满足 minReplicas,则调度失败并记录事件。
注意: 容量感知调度依赖集群上报的实时资源数据。如果集群状态更新延迟,可能导致调度决策基于过时信息,造成副本分布不均。
2.3.3 权重与容量分配示例
假设 totalReplicas=10,集群配置如下:
| 集群 | 权重 | minReplicas | maxReplicas | 可用容量 (Pod) |
|---|---|---|---|---|
| cluster-a | 3 | 2 | 6 | 5 |
| cluster-b | 1 | 1 | 4 | 3 |
| cluster-c | 1 | 0 | 3 | 2 |
分配过程:
- 总权重 = 3+1+1 = 5
- 基础分配:a=6, b=2, c=2
- minReplicas 约束:a=6(≥2), b=2(≥1), c=2(≥0) → 无变化
- maxReplicas 约束:a=6(≤6), b=2(≤4), c=2(≤3) → 无变化
- 容量约束:a=5(容量5), b=2(≤3), c=2(≤2) → a 降为5,剩余1个副本
- 重新分配:剩余1个副本按权重分配给 b(权重1) 和 c(权重1),b 获得1个 → b=3
- 最终分配:a=5, b=3, c=2
2.4 调度策略对比
| 策略类型 | 调度依据 | 适用场景 | 局限性 |
|---|---|---|---|
| 权重优先 | 集群权重比例 | 集群性能/成本差异明显 | 不考虑实时负载 |
| 容量感知 | 集群剩余资源 | 资源紧张、需要负载均衡 | 依赖实时数据上报 |
| 地域亲和 | 集群地理位置/区域 | 数据本地化、合规要求 | 需要额外标签配置 |
| 自定义策略 | 用户定义的调度插件 | 复杂业务逻辑 | 开发维护成本高 |
2.5 常见问题与调试建议
调试命令速查:
kubectl get rsp -n <namespace> — 查看 RSP 策略kubectl describe rsp <name> -n <namespace> — 查看调度详情和事件kubectl get federateddeployment <name> -o yaml — 查看实际分发状态kubectl logs -n federation-system <scheduler-pod> — 查看调度器日志
- 副本分布不均:检查集群权重配置是否合理,确认集群容量数据是否及时更新。
- 调度失败:查看 RSP 事件,确认 minReplicas 是否超过集群总容量。
- rebalance 不生效:确认 RSP 中
rebalance: true已设置,检查调度器日志是否有 rebalance 触发记录。 - 集群状态延迟:监控 federation-controller-manager 的健康状态,确保集群心跳正常。