3. RSP 策略深度解析:总副本数、集群权重、重新平衡策略、最小与最大副本限制
ReplicaSchedulingPreference(RSP)是 KubeFed 中控制跨集群副本分布的核心策略对象。它定义了调度器如何将工作负载的副本总数分配到多个成员集群中,并决定了在集群故障、扩缩容或权重变更时是否触发重新平衡。理解 RSP 的四个核心参数——总副本数、集群权重、重新平衡策略、最小与最大副本限制——是掌握 Federation 调度的关键。
3.1 RSP 策略结构总览
一个典型的 RSP 资源定义如下,它通过 spec 字段声明调度意图:
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: my-app-rsp
namespace: my-namespace
spec:
totalReplicas: 10
clusters:
- name: cluster-a
weight: 2
minReplicas: 1
maxReplicas: 8
- name: cluster-b
weight: 1
minReplicas: 0
maxReplicas: 5
rebalance: true
下表总结了 RSP 各字段的作用与约束:
| 字段 | 类型 | 说明 | 默认值 |
|---|---|---|---|
totalReplicas |
int32 | 所有集群副本总数,调度器保证各集群副本之和等于此值 | 无(必填) |
clusters[].weight |
int64 | 集群权重,决定副本分配比例;权重越高,分配副本越多 | 1 |
clusters[].minReplicas |
int64 | 集群最小副本数,即使权重很低也至少保留此数量 | 0 |
clusters[].maxReplicas |
int64 | 集群最大副本数,防止单个集群承载过多负载 | 无限制 |
rebalance |
bool | 是否允许调度器在集群状态变化时自动重新分配副本 | false |
实践建议:在定义 RSP 时,
totalReplicas 应与对应 FederatedDeployment 的 spec.replicas 保持一致,否则调度器会以 RSP 为准覆盖 Deployment 的副本数。
3.2 总副本数与集群权重分配算法
调度器使用加权比例分配算法将 totalReplicas 分配到各集群。基本公式为:
集群 i 的分配副本 = totalReplicas × (weight_i / Σ(所有集群权重))
分配结果会经过 minReplicas 和 maxReplicas 的裁剪,并做整数舍入处理。以下是一个计算示例:
| 集群 | 权重 | 比例 | 理论分配 | min/max 约束 | 最终分配 |
|---|---|---|---|---|---|
| cluster-a | 2 | 2/3 ≈ 66.7% | 6.67 | min=1, max=8 | 7 |
| cluster-b | 1 | 1/3 ≈ 33.3% | 3.33 | min=0, max=5 | 3 |
| 合计 | 3 | 100% | 10 | — | 10 |
当权重总和发生变化(例如新增集群或修改权重)时,调度器会重新计算分配,但是否立即调整现有副本取决于 rebalance 策略。
关键点:权重是相对值,而非值。将 cluster-a 权重从 2 改为 4 后,其分配比例从 66.7% 变为 80%(假设 cluster-b 权重仍为 1),副本分配会相应变化。
3.3 重新平衡策略:rebalance 字段详解
rebalance 字段控制调度器在以下场景是否主动调整已部署的副本:
- 集群加入/离开 Federation:新集群加入时,若
rebalance=true,调度器会从现有集群迁移副本到新集群。 - 权重变更:修改
clusters[].weight后,调度器按新比例重新分配。 - totalReplicas 变更:扩缩容时,调度器按当前权重和约束重新计算。
- 集群故障恢复:故障集群重新加入后,若
rebalance=true,副本会迁回。
下表对比了 rebalance=true 与 rebalance=false 的行为差异:
| 场景 | rebalance=true | rebalance=false |
|---|---|---|
| 新增集群 | 立即从其他集群迁移副本到新集群 | 新集群不获得副本,除非手动调整 |
| 权重变更 | 自动触发重新分配,副本迁移 | 仅影响后续扩缩容,不迁移现有副本 |
| 集群故障 | 故障集群副本被重新调度到健康集群 | 故障集群副本保持 pending,不迁移 |
| 集群恢复 | 副本从健康集群迁回恢复的集群 | 副本不迁回,保持当前分布 |
注意:启用
rebalance=true 会导致副本频繁迁移,可能影响应用稳定性。建议在非生产环境或维护窗口期使用。对于有状态应用,建议关闭自动重新平衡。
3.4 最小与最大副本限制:minReplicas 与 maxReplicas
minReplicas 和 maxReplicas 为每个集群设置副本数量的硬边界,优先级高于权重分配。它们的作用如下:
- minReplicas:保证集群至少运行指定数量的副本,即使权重很低或 totalReplicas 减少。常用于:
- 为关键集群保留基础容量,确保故障时仍有服务能力。
- 满足地域合规要求,在特定区域始终运行最小副本数。
- maxReplicas:限制集群最多承载的副本数,防止单集群过载。常用于:
- 控制云成本,避免某个集群因权重过高而分配过多副本。
- 配合集群资源配额,确保副本数不超过集群容量。
约束优先级:minReplicas > maxReplicas > 权重比例。当 min 和 max 冲突时(例如 min > max),调度器会报错并拒绝创建 RSP。
以下示例展示了约束如何影响最终分配:
| 集群 | 权重 | min | max | 按权重分配(total=10) | 约束后分配 | 说明 |
|---|---|---|---|---|---|---|
| cluster-a | 5 | 3 | 6 | 8.3 → 8 | 6 | 被 max=6 截断 |
| cluster-b | 1 | 2 | 4 | 1.7 → 2 | 2 | 被 min=2 提升 |
| cluster-c | 1 | 0 | 3 | 1.7 → 2 | 2 | 正常分配 |
| 合计 | 7 | — | — | 12(超出 total) | 10 | 调度器自动调整 |
当所有集群的 minReplicas 之和超过 totalReplicas 时,调度器会报错,因为无法同时满足所有约束。
3.5 综合配置示例与调试建议
以下是一个生产级 RSP 配置,结合了所有参数:
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: production-app-rsp
spec:
totalReplicas: 20
clusters:
- name: us-east
weight: 3
minReplicas: 4
maxReplicas: 10
- name: eu-west
weight: 2
minReplicas: 2
maxReplicas: 8
- name: ap-southeast
weight: 1
minReplicas: 1
maxReplicas: 5
rebalance: false
调试 RSP 策略时,常用以下命令验证分配结果:
# 查看 RSP 状态
kubectl get rsp production-app-rsp -n my-namespace -o yaml
# 查看调度器日志
kubectl logs -n kube-federation-system deployment/kubefed-controller-manager | grep -i rsp
# 手动触发重新平衡(如果 rebalance=false)
kubectl annotate rsp production-app-rsp kubefed.io/force-rebalance="true"
调试技巧:当副本分布不符合预期时,检查以下常见问题:
1. 各集群的 minReplicas 之和是否超过 totalReplicas?
2. 权重比例是否被 maxReplicas 截断导致其他集群分配不足?
3. rebalance=false 时,权重变更不会迁移现有副本,需手动触发或等待扩缩容。
1. 各集群的 minReplicas 之和是否超过 totalReplicas?
2. 权重比例是否被 maxReplicas 截断导致其他集群分配不足?
3. rebalance=false 时,权重变更不会迁移现有副本,需手动触发或等待扩缩容。