4. KubeFed 实战:跨集群资源分发与调度策略配置

KubeFed(Kubernetes Federation)是社区主推的多集群管理项目,它通过 Federation API 将多个 Kubernetes 集群抽象为一个逻辑控制面。本章聚焦 KubeFed 的核心能力:跨集群资源分发与副本调度策略(ReplicaSchedulingPreference),帮助你在生产环境中实现应用的多集群部署与流量分担。

前置条件:已部署 KubeFed v2 控制平面,并完成集群注册(Join)。本章所有操作基于 KubeFed v2 API(federation.k8s.io/v1beta1)。

4.1 KubeFed 资源分发模型

KubeFed 使用 FederatedDeployment 作为跨集群 Deployment 的抽象。当你在 Host 集群创建 FederatedDeployment 时,KubeFed 控制器会根据 Placement 和 Overrides 策略,将实际 Deployment 分发到指定的 Member 集群。

KubeFed 跨集群资源分发流程 Host 集群 FederatedDeployment Placement + Overrides 分发 Federation Controller 调度 & 同步 同步 Member 集群 A Deployment (5 副本) Member 集群 B Deployment (3 副本) 关键说明 • FederatedDeployment 是用户唯一需要创建的 API 对象。 • Placement 决定资源分发到哪些 Member 集群。 • Overrides 允许对不同集群的 Deployment 做差异化配置(如镜像标签、环境变量)。

4.2 创建 FederatedDeployment 并设置 Placement

以下示例展示如何创建一个跨集群的 Nginx 部署,并将其分发到两个 Member 集群。

4.2.1 定义 FederatedDeployment

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: nginx-federated
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.25
            ports:
            - containerPort: 80
  placement:
    clusters:
    - name: cluster-a
    - name: cluster-b
  overrides:
  - clusterName: cluster-b
    clusterOverrides:
    - path: "/spec/replicas"
      value: 5
    - path: "/spec/template/spec/containers/0/image"
      value: nginx:1.26
最佳实践:Overrides 中的 path 使用 JSON 指针格式。建议只对必须差异化的字段进行覆盖,保持模板一致性。

4.2.2 验证分发状态

创建后,使用以下命令查看资源在各集群的同步状态:

# 查看 FederatedDeployment 状态
kubectl get federateddeployment nginx-federated -o yaml

# 查看每个 Member 集群中的实际 Deployment
kubectl --context cluster-a get deployment nginx-federated -n default
kubectl --context cluster-b get deployment nginx-federated -n default

预期输出中,cluster-a 将运行 10 个副本(默认),cluster-b 运行 5 个副本(Overrides 覆盖)。

4.3 ReplicaSchedulingPreference(RSP)详解

RSP 是 KubeFed 提供的 高级副本调度策略,它允许你基于权重、最大/最小副本数、集群可用资源等条件,动态计算每个集群应分配的副本数,而不是手动在 Overrides 中写死。

字段 类型 说明
totalReplicas int32 全局期望副本总数
clusters map[string]ClusterPreferences 按集群名称定义权重、最小/最大副本数
rebalance bool 是否允许重新平衡(默认 false)
stickyClusters bool 是否保持已有副本不迁移(默认 false)

4.3.1 RSP 配置示例

apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: nginx-rsp
  namespace: default
spec:
  targetKind: FederatedDeployment
  totalReplicas: 20
  clusters:
    cluster-a:
      minReplicas: 5
      maxReplicas: 15
      weight: 2
    cluster-b:
      minReplicas: 3
      maxReplicas: 10
      weight: 1
  rebalance: true
调度计算逻辑:KubeFed 控制器根据权重比例分配副本数,同时受 min/max 约束。若 cluster-a 权重为 2、cluster-b 权重为 1,则默认分配比例为 2:1,即 cluster-a 约 13 副本,cluster-b 约 7 副本。若某集群达到 max,剩余副本自动分配给其他集群。

4.4 RSP 调度流程与动态调整

下图展示 RSP 如何与 FederatedDeployment 协同工作,实现副本的动态调度。

ReplicaSchedulingPreference 调度流程 用户创建 RSP totalReplicas: 20 RSP 控制器 权重计算 + 约束校验 cluster-a 分配 13 副本 (weight=2) cluster-b 分配 7 副本 (weight=1) 状态反馈 & 重新平衡 动态调整场景 • 当 cluster-a 节点故障导致资源不足时,RSP 自动将超出 maxReplicas 的副本迁移到 cluster-b。 • 设置 rebalance: true 后,控制器会定期检查集群负载并重新分配副本。 • 生产环境建议配合 stickyClusters: true 减少不必要的 Pod 迁移。

4.5 常见问题与避坑指南

  • RSP 不生效:检查 targetKind 是否与 FederatedDeployment 的 Kind 匹配(通常为 FederatedDeployment)。
  • 副本数超出预期:确认 Overrides 中的 replicas 是否与 RSP 冲突。RSP 优先级高于 Overrides 中的副本覆盖。
  • 集群间副本分布不均:检查各集群的 minReplicas 和 maxReplicas 是否设置合理,避免权重被约束截断。
  • 重新平衡导致 Pod 频繁重启:生产环境建议先设置 rebalance: false,手动触发调整。
注意:KubeFed v2 已进入维护模式,新项目建议评估 Karmada 或 OCM。但 KubeFed 的 RSP 设计思想被后续项目广泛借鉴,理解其原理对掌握多集群调度至关重要。

4.6 本章小结

通过本章实战,你应掌握:

  1. 使用 FederatedDeployment + Placement 实现基础跨集群资源分发。
  2. 利用 Overrides 对不同集群做差异化配置。
  3. 配置 ReplicaSchedulingPreference 实现基于权重的动态副本调度。
  4. 理解 RSP 的约束条件与重新平衡机制。