随着 Kubernetes 在企业中应用的越来越广,越来越多的公司在生产环境中运维多个集群。如何统一管理K8S多集群以及充分利用多集群的优势将非常重要,本文主要介绍目前主要的多集群管理社区方案,为大家技术选型提供参考。
Karmada
Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。
CNCF Sandbox项目
整体架构
关键特性
https://karmada.io/zh/docs/next/key-features/features
跨云多集群多模式管理
- 每个集群一个ns
- 成员集群和控制面连接支持Push和Pull模式
- 支持多云
多策略的多集群调度
- 不同 调度策略 下的集群分发能力:
- ClusterAffinity:基于ClusterName、Label、Field的定向调度。
- Toleration:基于Taint和Toleration的调度。
- SpreadConstraint:基于集群拓扑的调度。
- ReplicasScheduling:针对有实例的工作负载的复制模式与拆分模式。
- 差异化配置( OverridePolicy ):
- ImageOverrider:镜像的差异化配置。
- ArgsOverrider:运行参数的差异化配置。
- CommandOverrider:运行命令的差异化配置。
- PlainText:自定义的差异化配置。
- 支持 重调度 :
- Descheduler(karmada-descheduler):根据成员集群内实例状态变化触发重调度。
- Scheduler-estimator(karmada-scheduler-estimator):为调度器提供更精确的成员集群运行实例的期望状态。
- 支持多调度组
- 自定义调度器
调度流程
重调度流程
应用的跨集群故障迁移
- 集群故障迁移
- 集群污点设置
- 服务不断服
应用迁移示意图
全局统一资源视图
- 资源状态收集与聚合 :借助资源解释器(Resource Interpreter),将状态收集并聚合到资源模板
- 用户自定义,触发Webhook远程调用。
- 对于一些常见资源,在Karmada中固定编码。
- 缓存查询:支持全局模糊搜索、全局精确搜索。
- 第三方存储:支持搜索引擎(Elasticsearch或OpenSearch)、关系型数据库、图数据库。
可以通过karmada-apiserver连接和操作所有成员集群
可以通过karamda-apiserver检查和搜索所有成员集群的资源
跨集群服务治理
- 多集群服务发现 :
- 使用ServiceExport和ServiceImport,实现跨集群的服务发现。
- 多集群网络支持 :
- 使用Submariner打通集群间容器网络。
最佳生产实践
- 统一认证鉴权 :
- 聚合API统一访问入口。
- 访问权限控制与成员集群一致。
- 全局资源配额(FederatedResourceQuota):
- 全局配置各成员集群的ResourceQuota。
- 配置联邦级别的ResourceQuota。
- 实时收集各成员集群的资源使用量。
- 可复用调度策略:
- 资源模板与调度策略解耦,即插即用。
厂商
- 华为开源
KubeFed
https://github.com/kubernetes-sigs/kubefed
kubefed v2
社区项目
整体架构
基本概念
- Type configuration 用来描述将被联邦托管的资源类型
- Templates 用于描述被联邦的资源
- Placement 用来描述将被部署的集群
- Overrides 允许对面向集群的部分资源进行覆写
- Cluster configuration 用来保存被联邦托管的集群的 API 认证信息
- Propagation 用来描述资源分发策略,将资源分发到被联邦的集群
- Status collects the status of resources distributed by KubeFed across all federated clusters
- Policy determines which subset of clusters a resource is allowed to be distributed to
- Scheduling refers to a decision-making capability that can decide how workloads should be spread across different clusters similar to how a human operator would
主要特性
多集群管理
kubefedctl join <集群名称> --cluster-context <要接入集群的 context 名称> --host-cluster-context <HOST 集群的 context>
只支持push模式
资源管理
联邦资源类型通过CRD扩展,类型为federatedxxx,提供命令行完成转换实现K8S资源可以被联邦管理
kubefedctl enable <target kubernetes API type>
多集群调度
Kubefed 目前只支持手工指定集群间调度策略,调度方式主要分为两部分,一是直接在资源中指定目的集群,二是通过 ReplicaSchedulingPreference 进行比例分配。
支持差异化配置overrides
跨集群访问
跨集群间的网络访问。Kubefed 通过引入外部 DNS,将 Ingress Controller 和 metallb 等外部 LB 结合起来,使跨集群的流量可配置。
厂商
社区
已集成平台
- kubesphere
参考
https://cloud.tencent.com/developer/article/1804669
混合云下的 Kubernetes 多集群管理与应用部署:
https://kubesphere.io/zh/blogs/kubernetes-multicluster-kubesphere/#kubesphere-on-kubefed
OCM
https://open-cluster-management.io/
CNCF Sandbox
整体架构
主要特性
多集群管理
- 每个集群一个ns
- hub-agent架构,pull模式
ManagedCluster/逻辑托管集群
无论是集群在接管流程上的灵活性,还是对基础设施的耦合性、依赖性均是面向ManagedCluster模型进行操作的,然后被托管集群注册到OCM中枢上,在中枢里就可以操作ManagedCluster模型以及查看对应的集群级别的的元数据
资源管理
ManifestWork/资源下发
当多个集群注册到OCM中枢上,就可以面向多个ManagedCluster进行下发资源,在下发资源的过程中,需要拟定义一个ManifestWork的资源,在Work API中定义需要下发内容,例如要下发Deployment应用与对应的Service,将其打包到API里并与ManagedCluster建立对应关系,就可以在对应集群上发布标记的资源。目前ManifestWork已经是社区中公共的标准;
多集群调度
Placement/多集群路由
Placement,即多集群路由或者称为多集群的匹配或调度,如何将下发的资源与对应的集群进行关联,将需要定义的资源关联到一个路由策略上,这个路由策略决定了将这组资源复制或者粘贴到哪些集群上面;
插件框架
Add-On插件是为了提高多集群的可扩展性,类似K8s中Control Runtime,是面向开发者自定义Operator Controller的一个框架。
插件框架具备以下特性:
- 自由扩展;
- 自由拆卸;
- 持续运维和升级;
Knnoectivity多集群隧道/Cluster-Proxy
Knnoectivity是K8s原生的技术,用来解决控制面网络与节点网络不在同一平面问题,利用网络隧道技术可以跨越任何网络拓扑,解决了在多集群中枢网络平面向被托管集群网络平面推送请求时需要的证书、网络IP等问题。
多集群资源状态回流
可扩展的基于评分的多集群调度
可扩展的基于评分多集群调度是基于打分机制将不同的应用部署到不同的集群中,适应于多集群细粒度调度、主备容灾等场景。
厂商
由红帽,阿里云,微软等多个云厂商共同推动的CNCF官方的多集群开源云原生项目。
已集成平台
- kubevela
- 阿里ACK等产品
clusternet
https://github.com/clusternet/clusternet
CNCF Sandbox
整体架构
Clusternet 是一个轻量级插件,由“clusternet-agent”、“clusternet-scheduler”和“clusternet-hub”三个组件组成.
clusternet-agent 负责
- 自动将当前集群注册到父集群作为子集群,也称为“ManagedCluster”;
- 报告当前集群的心跳,包括Kubernetes版本、运行平台、healthz/readyz/livez、状态等;
- 建立一个 websocket 连接,它通过单个 TCP 连接来提供全双工通信通道到父集群;
clusternet-scheduler 负责
- 基于SchedulingStrategy来调度资源/feeds到匹配的子集群;
clusternet-hub 负责
- 批准集群注册请求并为每个子集群创建专用资源,例如命名空间、服务帐户和 RBAC 规则;
- 作为aggregated apiserver (AA) 服务。提供 shadow APIs,并用作 websocket 服务器,来维护子集群的多个活动 websocket 连接;
- 提供 Kubernstes 风格的 API, 将请求重定向/代理/升级到每个子集群;
- 利用 API, 协调和部署应用程序到多个集群;
主要特性
- Kubernetes Multi-Cluster Management and Governance
- managing Kubernetes clusters running in cloud providers, such as AWS, Google Cloud, Tencent Cloud, Alibaba Cloud, etc
- managing on-premise Kubernetes clusters
- managing any Certified Kubernetes Distributions, such as k3s
- managing Kubernetes clusters running at the edge
- automatically discovering and registering clusters created by cluster-api
- parent cluster can also register itself as a child cluster to run workloads
- managing Kubernetes upper than v1.17.x (Learn more about Kubernetes Version Skew)
- visiting any managed clusters with dynamic RBAC rules (Learn more from this tuorial)
- cluster auto-labelling based on Node Feature Discovery
- Application Coordinations
- Scheduling Framework (in-tree plugins, out-of-tree plugins)
- Cross-Cluster Scheduling
- replication scheduling
- static dividing scheduling by weight
- dynamic dividing scheduling by capacity
- cluster resource predictor framework for in-tree and out-of-tree implementations
- various deployment topologies for cluster resource predictors
- subgroup cluster scheduling
- Various Resource Types
- Kubernetes native objects, such as Deployment, StatefulSet, etc
- CRDs
- helm charts, including OCI-based Helm charts
- Resource interpretation with in-tree or out-of-tree controller
- Setting Overrides
- two-stage priority based override strategies
- easy to rollback overrides
- cross-cluster canary rollout
- Multi-Cluster Services
- multi-cluster services discovery with mcs-api
- CLI
- providing a kubectl plugin, which can be installed with kubectl krew install clusternet
- consistent user experience with kubectl
- create/update/watch/delete multi-cluster resources
- interacting with any child clusters the same as local cluster
- Client-go
- easy to integrate via a client-go wrapper
厂商
腾讯开源