4. 跨集群调度策略类型:duplicated、divided、static、weighted 分布策略对比与适用场景

在 Kubernetes Federation 中,跨集群调度策略决定了工作负载(Deployment、Service 等)如何被分发到成员集群。Federation 提供了四种核心策略:Duplicated、Divided、Static 和 Weighted。理解每种策略的调度模型、数据一致性要求以及适用边界,是调试跨集群调度问题的前提。

核心原则:策略选择直接影响跨集群的流量分配、资源利用率以及故障域隔离。生产环境中,通常需要组合使用多种策略来满足多租户与多集群的复杂需求。

4.1 四种策略核心对比

策略类型 调度模型 Pod 副本分布 跨集群一致性 典型场景
Duplicated 全量复制 每个集群运行相同数量的副本 强一致(完全同步) 灾备、全局服务、边缘缓存
Divided 按比例拆分 根据集群权重或容量自动拆分 最终一致(独立调度) 多区域负载均衡、资源池化
Static 手动指定 仅部署到指定集群 无自动同步 合规隔离、专用硬件集群
Weighted 加权分配 按权重比例分配副本 最终一致(权重驱动) 灰度发布、流量倾斜、成本优化

4.2 策略详解与调度流程

4.2.1 Duplicated(全量复制策略)

Federation 控制平面将工作负载的完整定义复制到所有目标集群。每个集群独立运行相同数量的 Pod 副本。该策略适用于需要全局一致性的场景,例如全局 DNS 服务、配置中心或灾备集群。

  • 优点:部署逻辑简单,故障切换快(任一集群均可独立提供服务)。
  • 缺点:资源消耗大,所有集群必须保持相同的副本数,不适合资源异构环境。
  • 调试要点:检查每个集群的 ReplicaSet 是否都达到期望副本数;注意跨集群的 ConfigMap/Secret 同步延迟。

4.2.2 Divided(拆分策略)

Federation 将总副本数按集群的 maxReplicas 或可用容量进行自动拆分。每个集群只运行总副本的一部分。该策略适用于多区域负载均衡或资源池化场景。

  • 优点:资源利用率高,自动适应集群容量差异。
  • 缺点:调度依赖集群容量报告,容量信息延迟可能导致调度不均。
  • 调试要点:验证 ClusterResourceOverride 或 ReplicaSchedulingPreference 中的容量配置;检查集群状态是否被正确上报。

4.2.3 Static(静态指定策略)

管理员手动指定工作负载只部署到特定的一个或多个集群。Federation 不进行自动调度或副本拆分。该策略适用于合规要求(数据必须留在特定地域)或专用硬件集群(GPU、ARM 节点)。

  • 优点:完全可控,无自动调度风险。
  • 缺点:需要人工维护集群列表,无法自动故障转移。
  • 调试要点:确认 FederatedDeployment 的 spec.placement.clusterNames 列表是否正确;检查目标集群是否处于 Ready 状态。

4.2.4 Weighted(加权分配策略)

Federation 根据管理员为每个集群设置的权重值,按比例分配 Pod 副本。权重可以基于集群的 CPU 配额、内存配额或自定义指标。该策略是生产中最灵活的调度方式,常用于灰度发布、流量倾斜和成本优化。

  • 优点:细粒度控制,支持动态调整权重,适合渐进式发布。
  • 缺点:权重配置错误可能导致流量雪崩;需要配合健康检查使用。
  • 调试要点:检查 weights 字段是否在 ReplicaSchedulingPreference 中正确配置;验证权重总和是否为 100 或预期比例;监控实际 Pod 分布与权重比例的偏差。
生产建议:在灰度发布场景中,建议将 Weighted 策略与 maxReplicas 上限结合使用,防止权重调整导致某个集群瞬间被大量 Pod 淹没。

4.3 策略选择决策流程

跨集群调度策略选择决策流程 开始选择策略 是否需要每个集群都运行完整服务? (灾备/全局服务) 是 Duplicated 策略 否 是否需要手动指定目标集群? (合规/专用硬件) 是 Static 策略 否 是否需要按权重比例分配副本? (灰度/流量倾斜) 是 Weighted 策略 否 Divided 策略 完成策略选择

4.4 策略组合与租户隔离

在实际的多租户 Federation 环境中,单一策略往往无法满足所有需求。常见的组合模式包括:

  • Duplicated + Weighted:核心服务使用 Duplicated 保证全局可用,非核心服务使用 Weighted 进行流量分配。
  • Static + Divided:合规集群使用 Static 锁定数据,计算集群使用 Divided 自动扩缩。
  • 租户级别策略绑定:通过 FederatedNamespace 的注解(annotation)为不同租户绑定不同的调度策略,实现租户间的调度隔离。
常见调试陷阱:当同时使用 Divided 和 Weighted 策略时,Federation 控制平面会优先处理 Divided 的容量拆分,再应用 Weighted 的权重分配。如果权重配置与集群容量冲突,可能导致部分集群副本数为 0。务必在 ReplicaSchedulingPreference 中同时设置 maxReplicas 和 weights 的合理上限。

4.5 策略配置示例(FederatedDeployment)

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: app-frontend
  namespace: production
spec:
  template:
    metadata:
      labels:
        app: frontend
    spec:
      replicas: 6
      selector:
        matchLabels:
          app: frontend
      template:
        metadata:
          labels:
            app: frontend
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
  placement:
    clusters:
    - name: cluster-asia
    - name: cluster-eu
    - name: cluster-us
  overrides:
  - clusterName: cluster-asia
    clusterOverrides:
    - path: "/spec/replicas"
      value: 2
  - clusterName: cluster-eu
    clusterOverrides:
    - path: "/spec/replicas"
      value: 2
  - clusterName: cluster-us
    clusterOverrides:
    - path: "/spec/replicas"
      value: 2
---
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: app-frontend-rsp
  namespace: production
spec:
  targetKind: FederatedDeployment
  totalReplicas: 6
  clusters:
    cluster-asia:
      minReplicas: 1
      maxReplicas: 3
      weight: 30
    cluster-eu:
      minReplicas: 1
      maxReplicas: 3
      weight: 30
    cluster-us:
      minReplicas: 1
      maxReplicas: 3
      weight: 40

上述示例中,FederatedDeployment 定义了基础模板和副本数,ReplicaSchedulingPreference 通过 weight 字段实现了 Weighted 策略,同时通过 minReplicas 和 maxReplicas 限制了每个集群的副本范围,防止调度偏差。

4.6 策略调试清单

策略类型 关键检查项 常见异常 修复方向
Duplicated 所有集群的 ReplicaSet 状态 部分集群副本数不一致 检查集群网络连通性、Federation 控制平面日志
Divided ClusterResourceOverride 容量报告 副本分布严重不均 调整 maxReplicas 或手动触发容量同步
Static placement.clusters 列表 Pod 未调度到预期集群 确认集群名称拼写、集群是否处于 Ready 状态
Weighted weights 总和与比例 实际 Pod 分布与权重比例偏差 > 10% 检查 minReplicas 是否限制了权重生效;调整权重值
调试命令速查:
kubefedctl federate deployment <name> -n <ns> — 将 Deployment 转换为 FederatedDeployment
kubectl get federateddeployment <name> -n <ns> -o yaml — 查看调度策略配置
kubectl get replicaschedulingpreference <name> -n <ns> -o yaml — 查看权重与容量配置