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 对象和成员集群的状态。其工作流程分为四个阶段:

  1. 读取 RSP 策略:从 API Server 获取用户定义的 RSP 对象。
  2. 收集集群状态:查询每个成员集群的当前副本数、资源可用量、节点容量。
  3. 计算目标分布:根据权重、最小/最大副本数、集群当前负载,计算每个集群应分配的副本数。
  4. 执行调度:通过 Federated 资源(如 FederatedDeployment)将副本分发到目标集群。
调度触发条件: RSP 变更、集群加入/离开、集群资源状态变化、定时 rebalance 周期。
Federation 调度器工作流程 Federation 调度器工作流程 RSP 策略 集群状态收集 目标分布计算 执行调度 状态反馈 / rebalance 触发条件: RSP变更 / 集群状态变化 定时rebalance / 集群加入

2.3 集群权重与容量分配

2.3.1 权重分配算法

调度器使用加权比例分配算法,确保副本分布与集群权重成正比。算法步骤如下:

  1. 计算总权重:所有集群的 weight 之和。
  2. 计算基础分配:每个集群的初始分配 = totalReplicas × (weight / totalWeight)。
  3. 应用 minReplicas:如果基础分配小于 minReplicas,则提升到 minReplicas。
  4. 应用 maxReplicas:如果分配超过 maxReplicas,则截断到 maxReplicas。
  5. 重新分配剩余副本:将因 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

分配过程:

  1. 总权重 = 3+1+1 = 5
  2. 基础分配:a=6, b=2, c=2
  3. minReplicas 约束:a=6(≥2), b=2(≥1), c=2(≥0) → 无变化
  4. maxReplicas 约束:a=6(≤6), b=2(≤4), c=2(≤3) → 无变化
  5. 容量约束:a=5(容量5), b=2(≤3), c=2(≤2) → a 降为5,剩余1个副本
  6. 重新分配:剩余1个副本按权重分配给 b(权重1) 和 c(权重1),b 获得1个 → b=3
  7. 最终分配:a=5, b=3, c=2
权重与容量分配示例 权重与容量分配示例 (totalReplicas=10) cluster-a 权重: 3 min:2 max:6 容量:5 分配: 5 cluster-b 权重: 1 min:1 max:4 容量:3 分配: 3 cluster-c 权重: 1 min:0 max:3 容量:2 分配: 2 分配步骤: ① 基础分配 (权重比例): a=6, b=2, c=2 ② min/max 约束: a=6(≤6), b=2(≥1), c=2(≤3) → 无变化 ③ 容量约束: a=5(容量5), b=2(≤3), c=2(≤2) → a降为5, 剩余1 ④ 重新分配剩余1: b(权重1)获得1 → b=3 最终: a=5, b=3, c=2 (总计10)

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 的健康状态,确保集群心跳正常。