目录

K8s 多集群

从 Federation 到 Karmada:多集群编排方案的演进与选型

在讨论方案之前,先厘清概念。所谓 K8s 多集群(Multi-Cluster),顾名思义就是多个 Kubernetes 集群协同工作。企业或组织可能根据自身需求,出于隔离性、可用性、合规性或使用成本等考虑,将应用运行在一个或多个集群中。在更成熟的形态下,应用实际运行的集群能够动态调度,不同集群间的应用也应支持相互访问。

常见的驱动力包括:

  • 故障隔离:单一集群的故障域过大,多集群可避免全局雪崩。
  • 多活与容灾:跨地域(geo-redundant)部署,做到主备或 active-active。
  • 合规与数据驻留:金融、医疗等行业要求数据不出境或留在指定区域。
  • 混合云/多云:避免厂商锁定(vendor lock-in),按成本或能力选择云厂商。
  • 版本灰度:在新版本集群上灰度验证,再整体切换。
  • 边缘计算:中心集群加边缘集群的分级管理。

K8s 多集群方案大致可分为三类:应用分发编排集群生命周期管理跨集群网络互通。下面按历史演进与生态分布逐一介绍。

Kubernetes Federation v1 是社区最早的联邦方案,它引入一个独立的联邦控制平面,把多个集群的 API server 聚合起来统一调度。但其设计存在硬伤:每种资源类型都需要在联邦控制面单独注册,扩展性差;调度能力薄弱;元数据同步链路复杂。该项目在 2018 年前后被社区废弃,并转向 v2。

KubeFed(Kubernetes Federation v2)改用 CRD(Custom Resource Definition)重新实现,引入 KubeFedClusterKubeFedConfigFederatedDeployment 等对象,通过 EnableDirective 通用地传播任意资源类型,并提供 OverridePolicy 做差异化配置。

然而 KubeFed 仍然缺乏真正的多集群调度器(scheduler),故障转移(failover)能力有限,社区活跃度逐渐下降。Kubernetes SIG Multi-Cluster 已于 2023 年 4 月 25 日将 kubernetes-sigs/kubefed 仓库归档,正式宣告这一路线的终结。

Karmada(取自 Kubernetes Armada 之意)由华为开源,是 Kubernetes Federation v1 和 v2 的延续,继承了早期版本的基本概念,但在架构上做了根本性升级:

  • K8s 原生 API:直接复用 Kubernetes 原生 API,单集群应用到多集群可"零改造"迁移。
  • 真正的调度器:内置调度策略,支持按权重、亲和性(affinity)、拓扑分布(spread)在多集群间分发副本。
  • 自动故障转移:成员集群故障时自动重新调度,无需人工干预。
  • 丰富的 Override 策略:OverridePolicyClusterOverridePolicy 可针对不同集群做差异化渲染。
  • 开放中立:跨云厂商,避免厂商锁定。

Karmada 是目前社区最活跃的多集群应用编排项目之一,已是 CNCF 孵化(Incubating)项目,被互联网、金融、制造、电信、云服务商等多类企业联合采用。

一个最小化的 Karmada 分发策略(PropagationPolicy)示例,将 nginx Deployment 按 2:1 的权重分发到北京、上海两个集群:

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: example-policy
  namespace: default
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - cluster-beijing
        - cluster-shanghai
    replicaScheduling:
      replicaSchedulingType: Divided
      replicaDivisionPreference: Weighted
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames: [cluster-beijing]
            weight: 2
          - targetCluster:
              clusterNames: [cluster-shanghai]
            weight: 1

多集群生态不只有 Karmada,不同问题域有不同方案,选型时常常组合使用:

  • Cluster API(CAPI):Kubernetes SIG Cluster Lifecycle 子项目,用声明式 API 管理集群自身的生命周期(创建、升级、销毁)。它解决的是"如何把集群开起来",而不是"集群里跑什么",与 Karmada 互补。
  • Open Cluster Management(OCM):CNCF Sandbox 项目,采用 hub-spoke(中心-辐射)模型,强项在于策略治理、合规与安全管控,可与 Argo CD、Cluster API、Istio、Submariner 等集成。
  • Submariner:CNCF Sandbox 项目,专注跨集群 Pod/Service 三层互通与服务发现,CNI 无关,支持重叠 CIDR(通过 Globalnet 控制器)。
  • Cilium Cluster Mesh:基于 eBPF 的 Cilium 提供的集群网格能力,支持跨集群 Pod 互通、全局 Service 负载均衡与跨集群网络策略。默认可连接最多 255 个集群(可扩展到 511 个)。
  • Argo CD ApplicationSets:GitOps 路线,通过模板把同一份应用清单下发到多个集群,适合"配置一致性优先"的场景。

简单选型参考:做应用多活与跨云调度选 Karmada;做集群供给选 Cluster API;做跨集群治理选 OCM;只关心网络互通选 Submariner 或 Cilium Cluster Mesh;纯 GitOps 下发用 Argo CD ApplicationSets。

从 Federation v1 → v2 → Karmada,可以看到清晰的演进轨迹:从"聚合 API server"到"CRD 化",再到"原生 API + 调度器"。社区已基本放弃在 API server 层做联邦,转而把多集群视为"调度域"的扩展——保留单集群 API 的兼容性,只在调度与分发层引入多集群语义。这一思路与 Service Mesh、GitOps 等正交,可灵活组合。对绝大多数新场景而言,Federation 已是历史,Karmada 及周边网络/治理项目才是当下值得投入的方向。

相关内容