开源 Clusternet 项目
Clusternet ( Cluster Internet ) 是腾讯云开源的兼具多集群管理和跨集群应用编排的云原生项目,让管控多集群就像上网一样简单。。
无论你的 Kubernetes 集群是运行在公有云、私有云、混合云还是边缘云上,都拥有一致的管理/访问体验,利用 K8s API 集中部署和协调多集群的应用程序和服务。Clusternet 采用 Addon 插件的方式,方便用户一键安装、运维及集成,轻松地管理数以百万计的 Kubernetes 集群,让云计算像 Internet一样无所不在,自由便捷。
以 Clusternet 项目为基础实现多云多集群管理平台,为用户提供跨云、跨集群、跨 region/zone 的分布式容器服务,将更好的满足多种场景需求。
- 多租户
- 高可用与容灾
- 多云多中心
- 服务边缘计算
架构理念
Clusternet 面向未来云原生多云多集群而设计,领先的架构支持用户以全局视角统一管理各个集群及应用,轻松地将用户业务发布至全球,一次发布处处运行。
集群管理集群
Clusternet 遵循云原生理念,所有管理组件通过 Addon 的方式灵活部署在 Kubernetes 集群中,实现 K8s-on-K8s 集群管理集群。
对比社区其他多集群管理方案,无需学习和维护复杂的平台软件和系统,也无需维护额外的控制面的组件及 etcd。Clusternet 集群管理完全复用已有的 Kubernetes 集群及端口,通过 AA (Aggregated APIServer[1]) 的方式进行工作,方便灵活扩展,大大减轻运维复杂度和资源消耗。
Clusternet 架构上保证轻量化和精简,组件包括:
1、 clusternet-hub
组件 clusternet-hub 部署和运行在父集群中,通过 AA (Aggregated APIServer)的方式进行工作。
主要负责:
- 批准各个子集群的注册请求,并为其创建专属的资源,如命名空间(namespace)、服务帐户(ServiceAccount)和 RBAC 规则等。
- 维护父集群跟各个子集群的长链接。
- 提供 Kubernetes 风格 的 REST API 用于访问各个子集群,尤其是对于边缘子集群的访问,同时还支持子集群的服务互访。
- 支持多集群的应用分发及治理。
2、clusternet-agent
组件 clusternet-agent 部署在各个子集群中。
主要负责:
- 将当前集群自动注册到父集群中作为子集群。
- 建立与父集群的 TCP 全双工的 websocket 安全隧道。支持通过 FeatureGate “SocketConnection” 选择是否要建立安全隧道。如果关闭该特性的话,即意味着父集群可以通过直连的方式访问子集群。
- 上报集群的心跳信息,包括 Kubernetes 版本、平台信息healthz/readyz/livez 健康状态、集群容量、节点状态等。
基于 Clusternet 轻量和灵活的架构,支持父集群自注册,Clusternet-hub 可向自身所在集群发布应用,该种方式最大化的利用父集群资源,并可以快速地扩展用户现有的集群,轻松具备管理海量公有云、私有云、边缘云集群的能力。
任意资源类型的多集群分发
Clusternet 支持向不同集群分发和管理各种应用资源,包括原生 Kubernetes 各类资源(Deployment/StatefulSet/ConfigMap/Secret 等)、各类 CRD 资源,以及 HelmChart 应用等等。
下图是 Clusternet 的多集群应用分发模型,其中绿色的模块是需要用户去创建的,紫色的模块是 Clusternet 内部做流转的资源对象。Clusternet 提供了 kubectl 插件,可以通过 “kubectl clusternet apply” 命令来创建资源。
Clusternet 资源分发模型采用松耦合的设计,用户无须更改或重新编写已有的资源对象,仅需要额外定义分发策略 (Subscription)和差异化配置(Localization/Globalization)即可实现多集群的应用分发。
- 兼容任意资源类型 完全兼容 K8s 的标准资源,比如Deployment、StatefulSet、DaemonSet,以及各种自定义的 CRD 等,无需学习复杂的多集群资源的 CRD 定义。
- Subscription 定义希望安装到集群中的资源。对于每个匹配的集群,将在其专属的命名空间中创建相应的Base对象。
- Localization & Globalization 在多集群应用分发的时,还可以利用 Localization 和 Globalization 差异化策略用于不同集群间的差异化配置。其中Localization描述 namespace-scoped (命名空间作用域)的差异化配置策略,Globalization 描述 cluster-scoped (集群作用域) 的差异化配置策略,两者均支持按照 Priority(优先级)进行管理和配置。这个特性对于面向多集群的蓝绿发布、金丝雀发布、版本升级等场景非常灵活实用。
- Base & Description Clusternet 会自动生成 Base 和 Description 对象,用以观察和跟踪各个应用资源的分发情况。其中 Description 是 Base 对象通过 Localization 和 Globalization 差异化配置渲染后得到的对象,即描述着最终要部署到目标子集群的对象定义。
云原生生态完全兼容
Clusternet 在项目设计之初,就全面兼容云原生生态。Clusternet 提供了多平台的版本支持,包括常见的 Linux 各平台,比如 x86,arm64,armv6,ppc64le,s390x。
Clusternet 还提供了 kubectl 插件 (kubectl-clusternet[2]),直接通过 kubectl 命令行进行操作,无需引入额外 CLI 工具,也无需切换 kubeconfig 的 context,即可进行多集群资源的创建、更新、编辑、删除、扩缩容等操作,方便兼容用户现有的 CICD 发布系统。
此外,Clusternet 还提供了对 client-go 的支持,完全兼容各版本的 client-go。Clusternet 通过 wrapperFunc 以无侵入的方式提供了 Clusternet 多集群对接能力。开发者可以参考文档指引[3],最快通过三行代码,就可在您的系统里实现多集群和应用管理能力。
Clusternet 支持云原生生态的软件和项目,从 v0.2.0 版本开始就支持对 Helm Charts 的多集群分发。基于 Clusternet 对任意 K8s 资源的原生支持,所有 K8s 生态的项目和软件都可通过 Clusternet 项目实现多集群能力。
注:kubectl-clusternet 即将添加成为 Kubectl 官方 plugin[4] ,详细信息参考 PR[5] ,未来可通过 “kubectl krew install clusternet” 一键安装该插件,现阶段可以先通过直接下载二进制文件的方式来使用。
未来展望
Clusternet 是腾讯最新开源的多集群管理与应用治理项目,全新的架构设计遵循云原生理念,完全兼容原生 K8s 资源并扩展至多集群,支持用户快捷和低成本的对接 K8s 云原生生态,助力您的业务向未来分布式云的转型。
当前 Clusternet 仍在快速开发迭代中,即将发布 v0.4.0 版本,带来更多优秀的特性,欢迎大家持续关注。Clusternet 愿与各个领域的同仁一起,求实创新,砥砺前行,共同开创万物智联、虚实共生和全真互联的新时代。