3、多集群调度的核心概念:集群联邦(KubeFed)、Cluster API、多集群服务(MCS)的基本原理
在多集群 Kubernetes 架构中,集群联邦(KubeFed)、Cluster API 和 多集群服务(MCS) 是三个最核心的抽象层。它们分别解决了资源分发、集群生命周期管理和跨集群服务发现的问题。理解这三者的定位与协作关系,是设计多集群调度策略的前提。
3.1 集群联邦(KubeFed)—— 资源分发与策略同步
KubeFed(Kubernetes Cluster Federation)是 CNCF 的早期孵化项目,其核心思想是让用户通过一个“控制平面”将 Kubernetes 原生资源(如 Deployment、ConfigMap、Service)同步到多个成员集群中。它不负责实际的 Pod 调度,而是负责策略定义与资源分发。
3.1.1 核心组件与工作流
- Federation API:定义
FederatedDeployment、FederatedConfigMap等 CRD,作为多集群资源的模板。 - Placement 策略:通过
ClusterSelector或ReplicaSchedulingPreference指定资源应分发到哪些集群,以及副本如何按权重或比例分配。 - Sync Controller:监听 Federation API 的变化,将模板和策略下推到目标集群的对应命名空间。
- Status Controller:从各成员集群收集资源状态,聚合后写回 Federation API 的 Status 字段。
3.1.2 调度策略示例:ReplicaSchedulingPreference
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: my-app-rsp
namespace: my-namespace
spec:
targetTemplate:
spec:
replicas: 10
overrides:
- clusterName: cluster-aws
spec:
replicas: 6
- clusterName: cluster-azure
spec:
replicas: 4
totalReplicas: 10
上述配置表示:总副本数为 10,其中 6 个分发到 AWS 集群,4 个分发到 Azure 集群。KubeFed 的调度器会根据权重和集群当前容量自动调整分发比例。
3.2 Cluster API —— 集群生命周期管理
Cluster API(CAPI)是 Kubernetes SIG Cluster Lifecycle 主导的项目,专注于声明式地管理 Kubernetes 集群的创建、升级、扩缩容和销毁。它通过一组 CRD 将基础设施(如虚拟机、网络、负载均衡器)抽象为 Kubernetes 资源。
3.2.1 核心 CRD 与角色
| CRD 名称 | 职责 | 示例提供者 |
|---|---|---|
Cluster |
定义集群的全局配置,包括控制平面和基础设施的引用 | AWSCluster, AzureCluster |
Machine |
代表一个计算节点(虚拟机或裸金属),包含节点规格和启动模板 | AWSMachine, DockerMachine |
MachineDeployment |
类似 Deployment,管理一组 Machine 的滚动更新和扩缩容 | — |
MachineSet |
类似 ReplicaSet,确保指定数量的 Machine 处于运行状态 | — |
KubeadmControlPlane |
使用 kubeadm 初始化和管理控制平面节点 | — |
3.2.2 工作流:从声明到集群就绪
- 用户提交一个
Cluster对象,指定集群名称、Kubernetes 版本、控制平面和 Worker 的 Machine 模板。 - Cluster API Controller 调用基础设施提供者(如 AWS 的 CAPA)创建虚拟机、安全组、负载均衡器等资源。
- 控制平面 Machine 启动后,
KubeadmControlPlaneController 自动执行kubeadm init初始化控制平面。 - Worker Machine 启动后,自动加入集群,成为 Ready 节点。
- 用户可以通过更新
MachineDeployment的replicas或version来扩缩容或升级节点。
3.3 多集群服务(MCS)—— 跨集群服务发现与连通
多集群服务(Multi-Cluster Services,MCS)是 Kubernetes SIG Multicluster 提出的标准,旨在解决跨集群的服务发现和流量路由问题。它定义了一组 API,让 Pod 能够通过统一的 DNS 名称访问其他集群中的 Service。
3.3.1 核心 API 对象
- ServiceExport:将一个命名空间下的 Service 标记为“可被其他集群发现”。
- ServiceImport:在消费集群中创建一个虚拟 Service,代表来自其他集群的导出 Service。
MCS 不定义具体的网络实现(如东西向流量如何穿透集群边界),而是定义控制面接口。底层实现可以是 Submariner、Cilium ClusterMesh、Istio Multi-Primary 等。
3.3.2 DNS 解析与流量模型
当 ServiceImport 被创建后,MCS Controller 会在消费集群的 CoreDNS 中注入一条记录,格式为:
<service-name>.<namespace>.svc.clusterset.local
Pod 通过这个域名访问服务时,流量会被路由到提供该服务的任意集群中的健康端点。MCS 支持两种路由模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| ClusterSet | 所有集群组成一个逻辑集合,服务端点全局可见,流量按权重或延迟分发 | 低延迟、高可用、全局负载均衡 |
| Per-Cluster | 每个集群独立暴露服务,消费方需显式指定目标集群 | 数据本地化、合规要求、严格隔离 |
3.4 三者关系与架构总览
下图展示了 KubeFed、Cluster API 和 MCS 在多集群体系中的分层关系:
3.5 三者的对比与选型建议
| 维度 | KubeFed | Cluster API | MCS |
|---|---|---|---|
| 核心职责 | 资源分发与策略同步 | 集群创建、升级、扩缩容 | 跨集群服务发现与路由 |
| 操作对象 | Deployment、ConfigMap、Service 等 | 虚拟机、网络、负载均衡器 | Service 的导出与导入 |
| 调度粒度 | 副本级别(ReplicaScheduling) | 节点级别(Machine 扩缩) | 流量级别(DNS 路由) |
| 网络依赖 | 控制平面与成员集群可达即可 | 需要访问基础设施 API | 需要集群间网络连通(如 VPN、Cilium) |
| 成熟度 | 稳定但社区活跃度下降 | GA,生产就绪 | Beta,实现多样 |
| 典型组合 | KubeFed + Cluster API 实现 GitOps 多集群 | Cluster API + MCS 实现动态集群池 | KubeFed + MCS 实现全局服务网格 |