多集群配置漂移清单审计与跨团队交接 - 第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。
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 成员集群的注册与纳管
将成员集群加入联邦控制平面的标准流程如下:
- 准备 kubeconfig:在成员集群上创建一个 ServiceAccount,并绑定 cluster-admin 角色,导出其 kubeconfig。
- 执行 join 命令:在控制平面使用
kubefedctl join命令注册集群。 - 验证状态:通过
kubectl get clusters查看成员集群的健康状态和 API 版本。 - 打标签:为成员集群添加地域、环境、云厂商等标签,用于后续的调度策略匹配。
# 注册成员集群示例
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 副本数。
- 环境变量覆盖:为不同区域集群注入不同的配置项。
2.4 工作负载分布策略:如何调度 Pod 到多个集群
工作负载分布策略是集群联邦的核心价值所在。它决定了“哪个工作负载应该被分发到哪些成员集群,以及每个集群运行多少副本”。联邦提供了多种内置策略,同时也支持自定义调度器。
2.4.1 四种内置分布策略
| 策略类型 | 调度依据 | 适用场景 | 示例配置 |
|---|---|---|---|
| ReplicaSchedulingPreference | 按集群权重或静态副本数分配 | 固定比例分发,如 70% 流量到主集群 | totalReplicas: 10clusters: {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 时,控制平面内部的调度流程如下:
- 策略评估:调度器读取 FederatedDeployment 关联的 ClusterPropagatedPolicy,获取分发规则。
- 集群过滤:根据 ClusterSelector 或标签匹配,过滤出符合条件的候选集群列表。
- 副本计算:根据 ReplicaSchedulingPreference 或 WeightedDistribution 计算每个集群应分配的副本数。
- 资源推送:Sync Controller 将计算后的 Deployment 资源(含差异化覆盖)推送到目标集群。
- 状态聚合: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 版本。