近期,騰訊遊戲Tenc容器團隊對外開源了Kubernetes(K8s)多集羣調度方案 tensile-kube , 本文將簡單介紹tensile-kube。

https://github.com/virtual-kubelet/tensile-kube

tensile-kube 名稱由來

tensile名爲可擴展的,可延伸的,同時tensile中也包含了tencent 和 tenc的意思。

tensile-kube 誕生背景

騰訊遊戲Tenc(容器)計算平臺線上有數十個K8s集羣,這些集羣都存在一些碎片資源,無法得到有效利用。常見的場景是:一個作業需要N個資源,但是現有集羣A、B、C等所剩資源都不滿足N,而集羣A,B,C資源總和又能滿足N。此外,我們還有另一種場景:業務有一種類型的業務需要同時發佈到多個集羣。

其實,業界很早就有類似的需求,也誕生出了 Federation 等方案,但是這些對於現有的K8s 會有較大的改造成本,同時增加了很多繁雜的CRD。因而,我們自主研發了更輕量的基於virtual-kubelet的解決方案tensile-kube。

https://github.com/kubernetes-sigs/kubefed

virtual-kubelet(VK)簡介

VK是用微軟開源的一個基礎庫,其實現通常叫做provider, 早期的VK中包含了各種provider, 目前VK社區已經將其獨立出來,分爲:virtual-kubelet、node-cli和provider。virtual-kubelet提供了一種抽象能力,通過實現provider,用戶就實現了一個虛擬的K8s節點,用戶的Pod可以調度到該節點。virtual-kubelet的核心功能是Node和Pod的生命週期管控。

tensile-kube 架構

tensile-kube核心組件爲4個:

  • virtual-node

    基於virtual-kubelet實現的了K8s provider功能,同時增加了多個controller,用於同步ConfigMap、Sercret、Service等資源。

  • webhook

    對Pod中可能對上層集羣調度產生干擾的字段進行轉換,將其寫入annotation中,virtual-node在創建Pod時再將其恢復,避免影響用戶期望的調度結果。

  • descheduler

    用於避免資源碎片帶來的影響,這個組件我們基於社區的descheduler進行了二次開發,使之更適用於這個場景。

  • multi-scheduler

    主要用於連接下層集羣的API Server, 避免資源碎片的影響,在調度時判斷virtual-node的資源是否足夠。(圖中未畫出來,multi-scheduler會比較重,不是特別推薦使用;如果要使用,需將上層集羣kube-scheduler替換成multi-scheduler。)

tensile-kube 特點

  • 對原生K8s集羣無侵入

    tensile-kube中,通過virtual-node建立上下層集羣之間的連接,上層的Pod通過調度器調度到virtual-node,隨後將Pod同步到下層集羣創建,整個方案對於K8s無侵入。

  • K8s上層平臺改造成本低

    在上層的K8s平臺看來,通過tensile-kube連接的集羣就是一個大集羣,可以完全屏蔽區別,所以對於平臺來說,也幾乎是不需要改造的。

  • 基於原生virtual-kubelet開發

    tensile-kube基於原生virtual-kubelet打造,沒有過多額外的依賴,同時又保持原生virtual-kubelet的諸多功能,後續更新升級方便。

這些使得tensile-kube可以方便的實現多個集羣的調度管理,且適用於大多數場景。

tensile-kube 主要能力

  • 集羣碎片資源整合

    對於離線集羣來說,或多或少存在資源碎片。通過tensile-kube,可以將這寫碎片合成一個大的資源池,將閒置的資源充分利用起來。

  • 服務多集羣調度

    結合Affinity等,可以實現,Pod的多集羣調度。對於1.16及以上集羣還可以基於TopologySpreadConstraint實現更細粒度的跨級羣調度。

  • 服務跨集羣通信

    tensile-kube原生提供通過Service進行跨集羣通信的能力。但是前提是:需要不通集羣之間的網絡通過Pod IP可以互通,如:私有集羣共用一個flannel等。

  • 便捷化運維集羣

    當我們進行單個集羣升級、變更時,往往需要通知業務遷移、集羣屏蔽調度等,在tensile-kube的支持,我們只需要將virtual-node 設置爲不可能調度。

  • 原生kubectl能力

    tensile kubectl支持原生kubectl所有操作,包括:kuebctl logs和kubectl exec。這對於運維人員去管理對於下層集羣上的pod會十分方便,沒有額外的學習成本。

其餘可能的適用場合

  • 邊緣計算

  • 混合雲

RoadMap

Tenc自2014年起將K8s上到生產環境至今已經6年。tensile-kube 作爲我們精心打造的開源產品融合了我們多年的容器相關經驗,目前基於tensile-kube, 我們已經將原先當集羣2000臺規模的老集羣擴展到了萬級別,並且還在持續將集羣遷移到該集羣。此前,我們已經向VK社區提交多了諸多 PR ,以擴展VK功能和優化其性能,後續我們主要在以下幾方面繼續完善VK和tensile-kube:

https://github.com/pulls?q=is%3Apr+author%3Acwdsuzhou+archived%3Afalse+is%3Aclosed+virtual-kubelet

  • 多集羣調度器優化

  • provider狀態同步實時性優化

  • 多租戶場景下多個子集羣資源名稱衝突

項目地址

https://github.com/virtual-kubelet/tensile-kube

關於騰訊遊戲Tenc容器團隊

騰訊遊戲Tenc容器團隊負責騰訊遊戲服務器資源的管理和運營。自2014年開始,通過Kubernetes、Docker等容器技術構建在線、離線業務同機混合部署的計算平臺,實現遊戲在線、離線業務的統一調度,支撐騰訊遊戲業務的海量計算資源需求。

2020年7月30日-8月1日

線上峯會介紹

這裏有封H5【邀請函】

官方報名通道正式開啓,首屆線上KubeCon開源盛會即將起航

掃碼 免費 註冊

大會網站,https://cncf.lfasiallc.cn/

掃描二維碼聯繫我們!

CNCF (Cloud Native Computing Foundation)成立於2015年12月,隸屬於Linux  Foundation,是非營利性組織。 

CNCF 雲原生計算基金會 )致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新爲大衆所用。請長按以下二維碼進行關注。

相關文章