多集群配置漂移清单审计与跨团队交接 - 第2节

2.1 集群联邦:多集群的“大脑”与统一入口

在单集群时代,Kubernetes 控制平面直接管理一个集群内的所有节点和 Pod。进入多集群时代后,我们需要一个更高层次的抽象来协调多个集群——这就是集群联邦。集群联邦不是一个新的 Kubernetes 发行版,而是一组扩展组件,它让多个独立的 Kubernetes 集群对外表现为一个逻辑上的“大集群”。

核心价值:集群联邦解决了多集群场景下的“信息孤岛”问题,提供统一的资源分发、服务发现和故障转移能力。

2.1.1 集群联邦的架构分层

集群联邦通常采用“中心-叶子”的星型拓扑,由以下三个核心角色组成:

  • 控制平面(Control Plane / Host Cluster):联邦的大脑,运行联邦 API 和控制器。它不运行业务负载,只负责存储联邦资源、调度策略和状态同步。
  • 成员集群(Member Clusters):实际运行工作负载的“叶子”集群。它们可以是不同云厂商、不同区域、不同版本的 Kubernetes 集群。
  • 联邦 API(Federation API):在原生 Kubernetes API 之上扩展的联邦资源对象,例如 FederatedDeployment、FederatedService、ClusterPropagatedPolicy。
集群联邦三层架构图 集群联邦三层架构 控制平面(Host Cluster) 联邦 API · 调度器 · 状态同步控制器 资源分发策略 · 调度策略 · 覆盖策略 ClusterPropagatedPolicy / ReplicaSchedulingPreference 成员集群 A AWS us-east-1 成员集群 B GCP us-central1 成员集群 C Azure eastus2 💡 控制平面不运行业务 Pod,只负责策略下发和状态收集 成员集群通过 kubeconfig 注册到联邦控制平面

2.2 控制平面:联邦的决策中枢

控制平面是集群联邦的核心组件,它运行在独立的 Host Cluster 上,通过扩展的 API Server 和一系列控制器来管理成员集群。控制平面不直接处理用户请求,而是负责资源模板的存储、调度策略的评估以及资源在成员集群间的同步。

2.2.1 控制平面的关键组件

组件职责关键行为
Federation API Server提供联邦资源对象的 CRUD 接口存储 FederatedDeployment、ClusterPropagatedPolicy 等资源
Resource Scheduler根据策略决定资源分发到哪些成员集群评估集群标签、资源配额、地域亲和性
Sync Controller将联邦资源推送到目标成员集群处理创建、更新、删除操作,支持差异化覆盖
Status Collector从成员集群收集资源状态并聚合汇总各集群的 Pod 副本数、Service 端点、错误信息
DNS Controller管理跨集群的服务发现自动创建全局 DNS 记录,实现地理感知路由
生产建议:控制平面集群建议使用 3 节点或 5 节点的高可用部署,并与其他业务集群物理隔离。控制平面故障不会导致成员集群上的已有 Pod 停止运行,但会中断新的资源分发和状态同步。

2.3 成员集群:实际承载工作负载

成员集群是联邦体系中的“执行单元”,它们可以是任何符合 CNCF 标准的 Kubernetes 集群。成员集群不需要安装联邦组件,只需要在控制平面注册一个具有管理员权限的 kubeconfig 即可被纳管。

2.3.1 成员集群的注册与纳管

将成员集群加入联邦控制平面的标准流程如下:

  1. 准备 kubeconfig:在成员集群上创建一个 ServiceAccount,并绑定 cluster-admin 角色,导出其 kubeconfig。
  2. 执行 join 命令:在控制平面使用 kubefedctl join 命令注册集群。
  3. 验证状态:通过 kubectl get clusters 查看成员集群的健康状态和 API 版本。
  4. 打标签:为成员集群添加地域、环境、云厂商等标签,用于后续的调度策略匹配。
# 注册成员集群示例
kubefedctl join member-cluster-1 \
  --host-cluster-context host-cluster \
  --cluster-context member-cluster-1-context \
  --v=2

# 查看已注册的成员集群
kubectl get clusters -n kube-federation-system
NAME                READY   AGE
member-cluster-1    True    5m
member-cluster-2    True    5m

2.3.2 成员集群的差异化配置

不同成员集群可能存在资源规格、网络插件、存储类等差异。联邦通过 Override Policy 机制允许用户为特定集群定制资源参数:

  • 镜像覆盖:为私有集群替换镜像仓库地址。
  • 副本数覆盖:为小规格集群减少 Pod 副本数。
  • 环境变量覆盖:为不同区域集群注入不同的配置项。
成员集群差异化配置流程 成员集群差异化配置流程 联邦资源模板 replicas: 5 image: nginx:1.25 ClusterOverridePolicy 集群标签匹配: region=cn 覆盖: replicas=3, image=nginx:1.24 集群 A (region=us) replicas: 5, image: nginx:1.25 集群 B (region=cn) replicas: 3, image: nginx:1.24 🔧 Override Policy 支持按集群标签、集群名称、集群分组进行差异化覆盖 未匹配覆盖策略的集群使用联邦资源模板的默认值

2.4 工作负载分布策略:如何调度 Pod 到多个集群

工作负载分布策略是集群联邦的核心价值所在。它决定了“哪个工作负载应该被分发到哪些成员集群,以及每个集群运行多少副本”。联邦提供了多种内置策略,同时也支持自定义调度器。

2.4.1 四种内置分布策略

策略类型调度依据适用场景示例配置
ReplicaSchedulingPreference按集群权重或静态副本数分配固定比例分发,如 70% 流量到主集群totalReplicas: 10
clusters: {A: 7, B: 3}
ClusterSelector按集群标签匹配(地域、环境、GPU)将 GPU 任务只调度到带 GPU 标签的集群matchLabels: {gpu: "true"}
MaxClusterLimit限制最大分发集群数量灰度发布,先发到 1 个集群验证maxClusters: 2
WeightedDistribution按集群剩余资源动态调整权重负载均衡,优先调度到资源空闲的集群weights: {A: 50, B: 30, C: 20}

2.4.2 策略执行流程

当用户创建一个 FederatedDeployment 时,控制平面内部的调度流程如下:

  1. 策略评估:调度器读取 FederatedDeployment 关联的 ClusterPropagatedPolicy,获取分发规则。
  2. 集群过滤:根据 ClusterSelector 或标签匹配,过滤出符合条件的候选集群列表。
  3. 副本计算:根据 ReplicaSchedulingPreference 或 WeightedDistribution 计算每个集群应分配的副本数。
  4. 资源推送:Sync Controller 将计算后的 Deployment 资源(含差异化覆盖)推送到目标集群。
  5. 状态聚合:Status Collector 从各集群拉取 Deployment 状态,汇总后更新 FederatedDeployment 的 status 字段。
常见陷阱:如果成员集群的可用资源不足,联邦调度器默认不会自动回退到其他集群。生产环境中建议结合 ClusterResourceOverride 和 调度预选 机制,避免因资源不足导致 Pod 一直处于 Pending 状态。

2.4.3 策略配置示例

以下是一个完整的 FederatedDeployment 与 ClusterPropagatedPolicy 的 YAML 示例:

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: nginx-federated
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      replicas: 6
      template:
        spec:
          containers:
          - image: nginx:1.25
            name: nginx
  placement:
    clusterSelector:
      matchLabels:
        environment: production
  overrides:
  - clusterName: cn-cluster
    clusterOverrides:
    - path: "/spec/replicas"
      value: 3
    - path: "/spec/template/spec/containers/0/image"
      value: "nginx:1.24"
---
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: nginx-rsp
  namespace: default
spec:
  targetKind: FederatedDeployment
  totalReplicas: 6
  clusters:
    us-cluster:
      weight: 2
    eu-cluster:
      weight: 1
    cn-cluster:
      weight: 1
关键解读:上述配置中,FederatedDeployment 通过 clusterSelector 筛选出所有 environment=production 的集群,然后 ReplicaSchedulingPreference 按权重 2:1:1 将 6 个副本分配到 us、eu、cn 三个集群。同时,cn-cluster 通过 overrides 将副本数强制改为 3,并将镜像降级为 1.24 版本。