作者:David Eads(@deads2k)、王泽锋(@kevin-wangzefeng)
目前的用户会知道,KubeFed[1]是对多个 Kubernetes 集群集中管理的早期解决方案——但随着自 2020 年以来社区参与该项目的速度放缓,它现在已经到了 EOL,许多人正在寻找替代方案。今天,我们有两个 CNCF 项目为 KubeFed 提出的问题提供了现代答案。Karmada[2]和Open Cluster Management(OCM)[3]拥有活跃的社区支持,他们将迎接挑战,管理混合和多云计算环境中的集群。
KubeFed 的局限性
Kubernetes SIG KubeFed[4]项目允许用户从一个托管集群中的一组应用程序接口协调多个 Kubernetes 集群的配置。Federation v1 可以将服务分发到多个 Kubernetes 集群,但是不能处理其他类型的对象。该项目已被 Kubernetes-SIG 归档,从未成为核心功能。KubeFed v2 很快取代了 v1,并被世界各地的运营人员使用。它允许单个 Kubernetes 集群将多种对象部署到多个其他 Kubernetes 集群。KubeFed v2 还允许“控制平面”主集群管理其他集群,包括它们的资源和策略。
更广泛采用 KubeFed 的障碍:
- Kubernetes API 的不兼容性——当用户从单集群迁移到多集群架构时,联邦资源 API 会导致额外的学习和采用工作。
- 缺乏可扩展性——用户无法通过 KubeFed 的僵化本质来满足不同的用例。这导致了高度分化的分叉的爆发,并使得围绕标准化实现构建社区变得困难。
考虑到推广 CRD 的困难和可扩展性的限制,KubeFed 项目中缺少解决这些问题的路线图或有意义的开发。让我们来看看两个被全球用户迅速采用的替代方案。
Karmada:开放、多云、多集群的 Kubernetes 编排
Karmada(Kubernetes Armada)是一个 Kubernetes 管理系统,使你能够跨多个 Kubernetes 集群和云运行你的云原生应用程序,而无需更改你的应用程序。通过使用 Kubernetes 原生的 API 和提供高级调度功能,Karmada 实现了真正开放的、多云端的 Kubernetes。
Karmada 旨在为多云和混合云场景中的多集群应用管理提供交钥匙自动化,具有集中式多云管理、高可用性、故障恢复和流量调度等关键功能。
作为Federation[5](v1)和KubeFed[6](v2)的天然继承者,Karmada 从这两个版本中继承了很多概念。例如:
- 资源模板:Karmada 使用 Kubernetes Native API 定义作为其联邦资源模板,以便于与已经采用 Kubernetes 的现有工具集成。
- 传播策略:Karmada 提供了一个独立的 Propagation(placement) Policy API 来定义多集群调度和传播需求。
- 覆盖策略:Karmada 提供了一个独立的 Override Policy API,用于专门化集群相关的配置自动化。
更多细节请参考Karmada 概念[7]。
Karmada 的主要特性
- Kubernetes Native API 兼容
- 与 ArgoCD 集成[8]
- 与 Flux 集成[9]
- Karmada 不要求用户有一个"联邦 CRD”
- 无缝集成现有的 Kubernetes 工具链,如
- 富有成效的多集群调度策略
- 根据强大的调度策略将工作负载传播到成员集群。
- 跨多集群的基于污点的故障转移。
- 支持推和拉集群管理模式[10]
- 推模式:像 KubeFed 一样,Karmada 控制平面直接与成员集群对话。
- 拉模式:委托 Karmada 代理将工作负载应用到成员集群。
KubeFed 中的大部分功能都在 Karmada 中进行了改造。此外,Karmada 还提供了额外的功能,如更强大的调度策略、聚合 Kubernetes API,定制资源解释器、多集群服务发现、多集群入口等。
Open Cluster Management:大规模简化开放式混合云中的设备管理
Open Cluster Management(OCM)提供了一个框架,使 Kubernetes 生态系统中的任何功能都能够跨多个集群和云提供商进行协调。内置原语允许理解集群清单、集群工作负载放置和集群工作负载分布。OCM 的中心代理模型允许新类型的代理行为被容易地注入到被管理的集群中。新行为可以进一步配置集群或收集关于集群的信息(如可观测性数据或搜索索引)。该项目还提供了两种现成的多集群功能:应用交付、编排和基于策略的治理。
OCM 的主要特性
- 高度可扩展、易于使用的 Kubernetes 原生 API 控制平面
- 不需要"联邦 CRD”,易于从单集群到多集群的采用。
- 分布式“Hub-spoke”架构[11]。
- 简化的集群注册流程,相比之下,KubeFed 的注册流程更加手动密集。
- 通过集群放置实现强大的工作负载分布
- 实现 Kubernetes-SIG Work API 项目。
- Placement API[12]——标签、污点、容忍、传播策略和位置都允许消费者跨多个云、数据中心和边缘进行广泛的计划。
- ManifestWork API[13]用于将资源从中心(hub)集群调度到分支(spoke)集群。
- 灵活的可扩展性框架
- 模块化 API 设计提供了一个集成点,使其他 Kubernetes 项目能够感知多集群。
- Addon 框架[14]帮助开发者开发扩展,在定制的情况下与多个集群一起工作。
- 与 Submariner.io、ArgoCD、Istio 等热门项目合作。以简化对多个集群的管理。
Karmada 和 OCM 的区别
这两个项目都准备好应对跨混合云和多云环境管理集群的挑战,但在解决这个问题时,它们有不同的理念。Karmada 提供更完整的全栈端到端解决方案。OCM 提供了一个强大的模块化框架和 API,使其他 Kubernetes 生态系统项目能够与之集成,以释放多集群功能。
在未来,将会有很多 Karmada 和 OCM 可以互补的使用案例。Kubernetes SIG-Multicluster 社区中的两个项目维护者之间已经有了一个正在进行的合作,以标准化 Work API,这是一个在集群之间分发 Kubernetes 对象的项目。
总结
Kubernetes 社区正在拼命寻找 KubeFed 的替代品。今天,我们探讨了两个激动人心的项目 Karmada 和 Open Cluster Management,这两个项目都增强了多集群管理的规模和功能,远远超过了 KubeFed 提供的功能。我们呼吁 Kubernetes 社区尝试这两个项目,让我们继续朝着多集群的未来前进。
关于作者
- David Eads(@deads2k)是 Red Hat 的高级首席软件工程师,也是 Kubernetes 的贡献者和 Kubernetes SIG-apimachinery 的联合负责人,以及 SIG-auth 的名誉负责人。
- 王泽锋(@kevin-wangzefeng)是华为云的云原生开源团队的负责人,也是 Kubernetes 的贡献者。Kevin 的团队为 Kubernetes Federation v1 和 v2(KubeFed)做出了许多重大贡献。
参考
- KubeFed
- GitHub[15]
- 关于归档的讨论[16]
- Karmada
- 主要概念[17]
- GitHub[18]
- Open Cluster Management
- 主要概念[19]
- GitHub[20]
- Work API
- GitHub[21]
- Kubernetes SIG-multicluster
- GitHub[22]
参考资料
[1]
KubeFed: https://github.com/kubernetes-sigs/kubefed
[2]
Karmada: https://karmada.io/
[3]
Open Cluster Management(OCM): https://open-cluster-management.io/
[4]
KubeFed: https://github.com/kubernetes-sigs/kubefed
[5]
Federation: https://github.com/kubernetes-retired/federation
[6]
KubeFed: https://github.com/kubernetes-sigs/kubefed
[7]
Karmada 概念: https://karmada.io/docs/core-concepts/concepts
[8]
与 ArgoCD 集成: https://karmada.io/docs/userguide/cicd/working-with-argocd
[9]
与 Flux 集成: https://karmada.io/docs/userguide/cicd/working-with-flux
[10]
推和拉集群管理模式: https://karmada.io/docs/userguide/clustermanager/cluster-registration
[11]
“Hub-spoke”架构: https://open-cluster-management.io/concepts/architecture/#hub-spoke-architecture
[12]
Placement API: https://open-cluster-management.io/concepts/placement/
[13]
ManifestWork API: https://open-cluster-management.io/concepts/manifestwork/
[14]
Addon 框架: https://open-cluster-management.io/concepts/addon/
[15]
GitHub: https://github.com/kubernetes-sigs/kubefed
[16]
关于归档的讨论: https://groups.google.com/g/kubernetes-sig-multicluster/c/lciAVj-_ShE/m/-UMPGjFnBgAJ
[17]
主要概念: https://karmada.io/docs/core-concepts/concepts
[18]
GitHub: https://github.com/karmada-io/karmada
[19]
主要概念: https://open-cluster-management.io/concepts/
[20]
GitHub: https://github.com/open-cluster-management-io
[21]
GitHub: https://github.com/kubernetes-sigs/work-api
[22]
GitHub: https://github.com/kubernetes/community/blob/master/sig-multicluster/