智汇华云 | Kubernetes 多集群管理方案 kubefed 原理解析
Kubernetes 原生的管理能力目前仍然停留在单集群级别。每一个集群可以稳定地自治运行,但是却缺乏横贯多个集群的统筹管理能力。Kubefed 是开源的多集群管理方案,可应用于突破单集群性能瓶颈、异地多集群、混合云管理等场景。通过 CRD+Operator 的方式定义一系列自定义联邦资源,并通过自定义 Controller 实现跨集群资源协调能力。
kubefed 简介
1.1 kubfed 介绍
Kubefed(Federation v2)即 Kubernetes 联邦,是开源的多集群解决方案,目前的版本是 v0.8.1,处于 beta 阶段。Federation v1 版本因为在扩展性、权限管理、架构等方便存在一定缺陷而被废弃。v2 版本对 v1 版本架构进行了优化,使用 CRD+operator 的方式定义一系列自定义联邦资源,并通过自定义 controller 实现跨集群资源协调能力。
Kubefed 可应用于突破单集群性能瓶颈、控制故障爆炸半径、异地多集群、混合云管理等场景,集群建立联邦后,可以将用户的 k8s 资源在多集群中分发并管理。
1.2 Kubfed 组成
Kubefed 组件图
Kubefed 所有组件部署在一个集群中,该集群作为 Host 集群,kubefed 通过 api 访问其他成员集群的 kube-apiserver 实现对成员集群的管理,kubefed 所在集群也可以配置为成员集群。
Kubefed 主要由三个组件组成:
Kubefed admission webhook:提供了准入控制,作用在 CR 的创建过程的校验阶段
Kubefed controller-manager:kubefed 控制平面,处理自定义资源以及协调不同集群间的资源状态
Kubfedctl:二进制管理工具,实现用户和 kubefed 的交互,比如集群注册、资源注册等
2 kubefed CRD
2.1 Kubefed CRD 介绍
Kubefed 通过 crd 实现了对任意资源的联邦管理,相对于 Federation v1 需要通过扩展 api-server 的实现,大大提高了灵活性和扩展性。
Kubefed 中 CRD API GROUP 如下表格所示:
2.2 kubefed CRD 的交互
CRD 组成及交互图
对集群资源联邦化的实现主要是通过两种 CRD 来完成,分别是 FederatedTypeConfig 和 Federated。
FederatedTypeConfig 定义了 Federated 和 kubernetes api 资源的关联关系。而 Federated 用来定义怎么去联邦化对应的 kubernetes api 资源。
一个典型的 deployment 的 FederatedTypeConfig 示例如下:
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: fed-deploy
namespace: fed-ns
spec:
template:
{deployment-define}
overrides:
- clusterName: cluster-1
clusterOverrides:
- path: /spec/replicas
value: 10
- path: /spec/template/spec/containers/0/image
value: nginx:1.17.0-alpine
placement:
clusters:
- name: cluster-1
- name: cluster-2
status:
clusters:
- name: cluster -1
- name: cluster -2
conditions:
- lastTransitionTime: "2021-12-13T09:40:27Z"
status: "True"
type: Propagation
Federated Type CRD 包含三个部分:
Template:该资源本身的定义,用于集群中该资源的创建
Placement:分发策略,定义该资源部署于哪些集群中
Overrides:对 template 中的字段进行覆盖重写,用于对资源的配置更新。如示例中对名称为 cluster-1 的 member cluster 中 deployment 的副本数和镜像进行了重新配置。Override 中未选择的集群使用 template 的定义,保持不变。
用户通过 kubefedctl enable 命令生成指定该资源类型的 FederatedTypeConfig CRD,通过 kubefedctl federate 或者使用定义好的 yaml 文件对资源进行联邦部署。
2.3 集群资源调度 CRD
RSP(ReplicaSchedulingPreference)可以被视为对用户更友好的分发副本的机制,方便用户定义资源在不同集群的部署策略。用户只需要创建 RSP 资源和关联的联合资源(仅填充 spec.template)可以将副本在各集群之前按照定义策略分发。
RSP 模块可以对 Federated Type CRD 中 placement 和 Overrides 字段内容进行重写,rs 重写数据来源于用户配置的调度文件。
一个典型的 RSP 文件定义示例如下,该 RSP 文件定义了一个 deployment 应用负载在部署时,各集群的部署策略。
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: fed-deploy
namespace: fed-ns
spec:
targetKind: FederatedDeployment
totalReplicas: 20
clusters:
"*":
weight: 1
maxReplicas: 15
cluster-1:
weight:
minReplicas: 3
maxReplicas: 10
RSP 文件中主要包含以下字段:
targetKind:定义该 RSP 文件应用的联邦资源类型,目前仅支持 FederatedDeployment 和 FederatedReplicaSet。
totalReplicas:资源的总副本数,各个集群按照用户配置的权重或者比例进行资源计算时,会先根据总数进行计算得到一个初步结果,若集群中配置了最大值或最小值与计算得到的值冲突,则会使用用户配置的最大值或者最小值。因此实际的总副本数可能会和配置的总副本数不一致。
2.3 kubefed 实现原理
kubefed 使用自定义 CRD 和自定义 controller 实现联邦集群的资源管理,原理如下图所示:
Kubfed 控制面主要由三个自定义 controller 组成:
ClusterController: 集群控制器,用户通过 kubefedctl join/unjoin 来加入/删除集群,当成功加入时,会建立一个 KubefedCluster 组件来储存集群相关信息,如 API Endpoint、CA Bundle 等。这些信息会被用在 KubeFed Controller 访问各 Kubernetes 集群,以确保能够建立 Kubernetes API 资源。并定时调用各集群的/healthz 接口,维护可用集群列表,用于应用分发前的集群选择与过滤。
FederateTypeConfigController:联邦资源控制器,用于管理各集群间资源分发与状态监控。联邦资源控制器会为每种联邦资源类型创建一个资源分发控制器,和状态收集控制器,实现该类资源的联邦功能。StatusController 和 SyncController 都使用了 FederatedInformer 用来感知所有 member cluster 中某中联邦资源的变更。如果变更则从 HostCluster 中获取最新的资源定义同步到各 memberCluster 中。
SchedulerManage:调度控制器,用于创建适用于 ReplicaSet 和 Deployment 的 RSPController,RSPController。当用户创建 RSP 资源后,RSP Controller 会收到通知,匹配对应 namespace/name 的 FederatedDeployment 与 FederatedReplicaSet 是否存在,若存在的话,会根据 rsp 中设定的策略计算出每个集群预期的副本数,之后覆写 Federated 资源中的 spec.overrides 内容以重新定义每个集群的副本数,最后再由 KubeFed Sync Controller 来同步至每个集群。
3 总结
Kubefed 通过 crd 与自定义 controller 实现了对任意资源的联邦,并支持用户自定义调度策略,易于扩展和维护。
目前多集群管理除了 kubefed 项目还有华为推出的 karmada、阿里和 redhat 推出的 OCM(open cluster management)项目,相对于 karmada 部署资源时 host cluster 上必须要部署,kubefed 可以选择不部署在 host cluster,减少了控制面所在集群的负担,但在资源管理和资源调度上 karmada 比 kubefed 有优势。另外 kubefed 相对于 ocm,联邦化资源会产生较多的 crd,在维护各集群中 crd 的 api 版本增加了负担。因此需要用户根据实际使用场景选择合适的多集群管理方案。
评论