擴展Kubernetes到無限|Virtual Kubelet子項目:tensile-kube介紹
近期,騰訊遊戲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日
: 線上峯會介紹
: 官方報名通道正式開啓,首屆線上KubeCon開源盛會即將起航
掃碼 免費 註冊
: 大會網站,https://cncf.lfasiallc.cn/
掃描二維碼聯繫我們!
CNCF (Cloud Native Computing Foundation)成立於2015年12月,隸屬於Linux Foundation,是非營利性組織。
CNCF ( 雲原生計算基金會 )致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新爲大衆所用。請長按以下二維碼進行關注。