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 会导致副本频繁迁移,可能影响应用稳定性。建议在非生产环境或维护窗口期使用。对于有状态应用,建议关闭自动重新平衡。
RSP 调度决策流程 RSP 策略定义 加权比例分配 totalReplicas × (weight_i / Σweight) min/max 约束裁剪 确保 minReplicas ≤ 分配 ≤ maxReplicas rebalance? true false 触发重新分配 迁移副本到目标集群 保持当前分布 仅影响后续扩缩容 最终副本分布

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 时,调度器会报错,因为无法同时满足所有约束。

min/max 约束对副本分配的影响 无约束分配 cluster-a: 8 副本 cluster-b: 2 副本 cluster-c: 2 副本 应用约束 约束后分配 cluster-a: 6 副本 max=6 截断 cluster-b: 2 副本 min=2 提升 cluster-c: 2 副本 正常分配 约束调整规则 1. 若按权重分配 < minReplicas,则提升到 minReplicas 2. 若按权重分配 > maxReplicas,则截断到 maxReplicas 3. 截断后多出的副本重新按权重分配给未达 max 的集群 4. 若所有集群均达 max 或 min 总和超过 total,则报错

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 时,权重变更不会迁移现有副本,需手动触发或等待扩缩容。