Kubernetes 原生的管理能力目前仍然停留在單集群級(jí)別。每一個(gè)集群可以穩(wěn)定地自治運(yùn)行,但是卻缺乏橫貫多個(gè)集群的統(tǒng)籌管理能力。Kubefed是開(kāi)源的多集群管理方案,可應(yīng)用于突破單集群性能瓶頸、異地多集群、混合云管理等場(chǎng)景。通過(guò)CRD+Operator的方式定義一系列自定義聯(lián)邦資源,并通過(guò)自定義Controller實(shí)現(xiàn)跨集群資源協(xié)調(diào)能力。
kubefed簡(jiǎn)介
1.1 kubfed介紹
Kubefed(Federation v2)即 Kubernetes 聯(lián)邦,是開(kāi)源的多集群解決方案,目前的版本是 v0.8.1,處于beta階段。Federation v1版本因?yàn)樵跀U(kuò)展性、權(quán)限管理、架構(gòu)等方便存在一定缺陷而被廢棄。v2版本對(duì)v1版本架構(gòu)進(jìn)行了優(yōu)化,使用CRD+operator的方式定義一系列自定義聯(lián)邦資源,并通過(guò)自定義controller實(shí)現(xiàn)跨集群資源協(xié)調(diào)能力。
Kubefed可應(yīng)用于突破單集群性能瓶頸、控制故障爆炸半徑、異地多集群、混合云管理等場(chǎng)景,集群建立聯(lián)邦后,可以將用戶的k8s資源在多集群中分發(fā)并管理。
1.2 Kubfed組成
Kubefed組件圖
Kubefed所有組件部署在一個(gè)集群中,該集群作為Host集群,kubefed通過(guò)api訪問(wèn)其他成員集群的kube-apiserver實(shí)現(xiàn)對(duì)成員集群的管理,kubefed所在集群也可以配置為成員集群。
Kubefed主要由三個(gè)組件組成:
Kubefed admission webhook:提供了準(zhǔn)入控制,作用在CR的創(chuàng)建過(guò)程的校驗(yàn)階段
Kubefed controller-manager:kubefed控制平面,處理自定義資源以及協(xié)調(diào)不同集群間的資源狀態(tài)
Kubfedctl:二進(jìn)制管理工具,實(shí)現(xiàn)用戶和kubefed的交互,比如集群注冊(cè)、資源注冊(cè)等
2 kubefed CRD
2.1 Kubefed CRD介紹
Kubefed通過(guò)crd實(shí)現(xiàn)了對(duì)任意資源的聯(lián)邦管理,相對(duì)于Federation v1需要通過(guò)擴(kuò)展api-server的實(shí)現(xiàn),大大提高了靈活性和擴(kuò)展性。
Kubefed中CRD API GROUP如下表格所示:
2.2 kubefed CRD的交互
CRD組成及交互圖
對(duì)集群資源聯(lián)邦化的實(shí)現(xiàn)主要是通過(guò)兩種CRD來(lái)完成,分別是 FederatedTypeConfig 和 Federated。
FederatedTypeConfig定義了 Federated和kubernetes api資源的關(guān)聯(lián)關(guān)系。而 Federated用來(lái)定義怎么去聯(lián)邦化對(duì)應(yīng)的kubernetes api資源。
一個(gè)典型的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包含三個(gè)部分:
Template:該資源本身的定義,用于集群中該資源的創(chuàng)建
Placement:分發(fā)策略,定義該資源部署于哪些集群中
Overrides:對(duì)template中的字段進(jìn)行覆蓋重寫(xiě),用于對(duì)資源的配置更新。如示例中對(duì)名稱為cluster-1的member cluster中deployment的副本數(shù)和鏡像進(jìn)行了重新配置。Override中未選擇的集群使用template的定義,保持不變。
用戶通過(guò)kubefedctl enable命令生成指定該資源類型的FederatedTypeConfig CRD,通過(guò) kubefedctl federate或者使用定義好的yaml文件對(duì)資源進(jìn)行聯(lián)邦部署。
2.3 集群資源調(diào)度CRD
RSP(ReplicaSchedulingPreference)可以被視為對(duì)用戶更友好的分發(fā)副本的機(jī)制,方便用戶定義資源在不同集群的部署策略。用戶只需要?jiǎng)?chuàng)建RSP資源和關(guān)聯(lián)的聯(lián)合資源(僅填充spec.template)可以將副本在各集群之前按照定義策略分發(fā)。
RSP模塊可以對(duì)Federated Type CRD中placement和Overrides字段內(nèi)容進(jìn)行重寫(xiě),rs重寫(xiě)數(shù)據(jù)來(lái)源于用戶配置的調(diào)度文件。
一個(gè)典型的RSP文件定義示例如下,該RSP文件定義了一個(gè)deployment應(yīng)用負(fù)載在部署時(shí),各集群的部署策略。
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文件應(yīng)用的聯(lián)邦資源類型,目前僅支持FederatedDeployment和FederatedReplicaSet。
totalReplicas:資源的總副本數(shù),各個(gè)集群按照用戶配置的權(quán)重或者比例進(jìn)行資源計(jì)算時(shí),會(huì)先根據(jù)總數(shù)進(jìn)行計(jì)算得到一個(gè)初步結(jié)果,若集群中配置了最大值或最小值與計(jì)算得到的值沖突,則會(huì)使用用戶配置的最大值或者最小值。因此實(shí)際的總副本數(shù)可能會(huì)和配置的總副本數(shù)不一致。
2.3 kubefed 實(shí)現(xiàn)原理
kubefed使用自定義CRD和自定義controller 實(shí)現(xiàn)聯(lián)邦集群的資源管理,原理如下圖所示:
Kubfed控制面主要由三個(gè)自定義controller組成:
ClusterController: 集群控制器,用戶通過(guò)kubefedctl join/unjoin 來(lái)加入/刪除集群,當(dāng)成功加入時(shí),會(huì)建立一個(gè) KubefedCluster 組件來(lái)儲(chǔ)存集群相關(guān)信息,如 API Endpoint、CA Bundle 等。這些信息會(huì)被用在 KubeFed Controller 訪問(wèn)各 Kubernetes 集群,以確保能夠建立 Kubernetes API 資源。并定時(shí)調(diào)用各集群的/healthz接口,維護(hù)可用集群列表,用于應(yīng)用分發(fā)前的集群選擇與過(guò)濾。
FederateTypeConfigController:聯(lián)邦資源控制器,用于管理各集群間資源分發(fā)與狀態(tài)監(jiān)控。聯(lián)邦資源控制器會(huì)為每種聯(lián)邦資源類型創(chuàng)建一個(gè)資源分發(fā)控制器,和狀態(tài)收集控制器,實(shí)現(xiàn)該類資源的聯(lián)邦功能。StatusController和SyncController 都使用了FederatedInformer用來(lái)感知所有member cluster中某中聯(lián)邦資源的變更。如果變更則從HostCluster中獲取最新的資源定義同步到各memberCluster中。
SchedulerManage:調(diào)度控制器,用于創(chuàng)建適用于ReplicaSet和Deployment的RSPController,RSPController。當(dāng)用戶創(chuàng)建RSP資源后,RSP Controller 會(huì)收到通知,匹配對(duì)應(yīng) namespace/name 的 FederatedDeployment 與 FederatedReplicaSet 是否存在,若存在的話,會(huì)根據(jù)rsp中設(shè)定的策略計(jì)算出每個(gè)集群預(yù)期的副本數(shù),之后覆寫(xiě) Federated 資源中的 spec.overrides 內(nèi)容以重新定義每個(gè)集群的副本數(shù),最后再由 KubeFed Sync Controller 來(lái)同步至每個(gè)集群。
3 總結(jié)
Kubefed通過(guò)crd與自定義controller實(shí)現(xiàn)了對(duì)任意資源的聯(lián)邦,并支持用戶自定義調(diào)度策略,易于擴(kuò)展和維護(hù)。
目前多集群管理除了kubefed項(xiàng)目還有華為推出的karmada、阿里和redhat推出的OCM(open cluster management)項(xiàng)目,相對(duì)于karmada部署資源時(shí)host cluster上必須要部署,kubefed可以選擇不部署在host cluster,減少了控制面所在集群的負(fù)擔(dān),但在資源管理和資源調(diào)度上karmada比kubefed有優(yōu)勢(shì)。另外kubefed相對(duì)于ocm,聯(lián)邦化資源會(huì)產(chǎn)生較多的crd,在維護(hù)各集群中crd的api版本增加了負(fù)擔(dān)。因此需要用戶根據(jù)實(shí)際使用場(chǎng)景選擇合適的多集群管理方案。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。 )