介紹
Virtual Kubelet是Kubernetes kubelet的二次實(shí)現(xiàn)。它會偽裝成一個(gè)kubelet以便使用者可以連接到其他API,這些API的入口被成為Provider。VK的主要方案是將Kubernetes API擴(kuò)展到無服務(wù)器容器平臺。Virtual Kubelet是插件式的,即插即用,非常靈活方便,并且使用的是kubernetes原語。
Virtual Kubelet 不是用來實(shí)現(xiàn)集群聯(lián)邦的手段。它是用來擴(kuò)展node屬性到一個(gè)容器平臺上。
當(dāng)前支持功能如下:
- 創(chuàng)建,刪除和更新Pod
- 容器 logs, exec, and metrics
- 獲取單個(gè)Pod或多個(gè)Pod狀態(tài)
- 節(jié)點(diǎn)地址,節(jié)點(diǎn)容量,節(jié)點(diǎn)守護(hù)程序
- 自定義虛擬網(wǎng)絡(luò)
virtual-kubelet架構(gòu)圖

目前的社區(qū)的virtual kubelet 不具備任何生產(chǎn)能力,但是提供了一個(gè)library,可以給各家公有云廠商,用來構(gòu)建自己的virtual kubelet 版本。virtual kubelet 的代碼總體比較簡單,沒太必要詳解了。
virtual kubelet 在啟動(dòng)的時(shí)候,會馬上創(chuàng)建一個(gè)Node 出來
node 背后的provider 提供接口查詢相關(guān)node 信息
它會同時(shí)watch node 和 pod 的事件,也就是要有兩個(gè)控制器,用于更新node 的信息
針對分配到該節(jié)點(diǎn)上的pod,增加消息處理
消息處理的過程,是把消息放在另一個(gè)隊(duì)列里
provider的worker 去處理,這里會作深度拷貝
處理完以后,更新pod 的status
優(yōu)點(diǎn)
- 對原生Kubernetes集群無侵入
- 提供Kubelet典型特性接口,Provider僅需實(shí)現(xiàn)對應(yīng)服務(wù)管理平臺資源到Node和Pod對象特性的實(shí)現(xiàn)
- 擴(kuò)展 Kubernetes 集群:Virtual Kubelet 允許將外部平臺作為 Kubernetes 集群的計(jì)算資源,從而擴(kuò)展 Kubernetes 的應(yīng)用場景和規(guī)模。
- 跨云平臺和邊緣計(jì)算:Virtual Kubelet 可以將云平臺和邊緣設(shè)備作為 Kubernetes Node 節(jié)點(diǎn),實(shí)現(xiàn)跨云平臺和邊緣計(jì)算的 Pod 調(diào)度和管理。
- 節(jié)省成本:使用 Virtual Kubelet 可以將臨時(shí)性工作負(fù)載等低優(yōu)先級應(yīng)用調(diào)度到外部資源上,節(jié)省 Kubernetes 集群的成本和資源占用。
缺點(diǎn)
將非集群內(nèi)資源抽象成Node和Pod對象對資源使用上有一定局限性,很難提供超出原有kubelet和IaaS平臺能力范疇,IaaS深度整合需要自行實(shí)現(xiàn)CRD
僅能作為轉(zhuǎn)換器,用于容器和虛擬機(jī)統(tǒng)一管理時(shí)還是需要依托已有的平臺能力,無法像Kubevirt等方案作為一個(gè)單獨(dú)的Iaas管理平臺使用
安全性問題:Virtual Kubelet 可能會將 Pods 調(diào)度到不同的云提供商或邊緣設(shè)備上,需要采取相應(yīng)的安全措
解決了什么問題?
彈性能力、免容量規(guī)劃、按需使用按需計(jì)費(fèi)。集群資源不足調(diào)度時(shí),VK將Pod調(diào)度到第三方集群中(如阿里ECI、華為CCI)
-
碎片資源整合(將多個(gè)集群碎片資源整合成一個(gè)大的資源池,需要比較重的Scheduler開發(fā))- tensile-kube
- 一個(gè)作業(yè)需要N個(gè)資源,但是現(xiàn)有集群A、B、C等所剩資源都不滿足N,而集群A、B、C資源總和又能滿足N。
-
便捷化運(yùn)維集群(類似KOK,多集群調(diào)度方案) - tensile-kube
- 當(dāng)我們進(jìn)行單個(gè)集群升級、變更時(shí),往往需要通知業(yè)務(wù)遷移、集群屏蔽調(diào)度等,在此設(shè)計(jì)下,我們只需要將virtual-node設(shè)置為不可能調(diào)度。這樣后期單個(gè)集群升級、替換,可以只在運(yùn)維層操作,用戶不用從舊集群遷移至新集群、無感知。

Virutal-Kubelet適用場景

Virtual-Kuberlet適合在已有IaaS層管理平臺和Kubernetes集群環(huán)境下進(jìn)行二者的打通,實(shí)現(xiàn)在Kubernetes集群上統(tǒng)一管理容器和非容器平臺,同時(shí)由于Virtual-Kubelet在Serverless和納管其他已有容器平臺(Openstack Zun,Docker Swarm)方面也具有很高適配性,Virtual-Kubelet可以提供一套統(tǒng)一的API,方便開發(fā)者打通全流程。
已提供的實(shí)現(xiàn)者(provider)
| 支持類型 | 云容器實(shí)例 | |
|---|---|---|
| Alibaba Cloud ECI Provider | ECI | |
| Azure Container Instances Provider | ||
| AWS Fargate Provider | Amazon ECS | |
| OpenStack Zun Provider | ||
| Tensile Kube Provider | ||
| HUAWEI | 無狀態(tài)負(fù)載(Deployment)、有狀態(tài)負(fù)載(StatefulSet)、普通任務(wù)(Job) | CCI |
新的提供者需實(shí)現(xiàn)

案例
當(dāng)前有兩個(gè)集群,左側(cè)集群是含有VK節(jié)點(diǎn)的集群,右側(cè)集群則是我們期望Pod實(shí)際使用資源的集群,也就是在左側(cè)集群創(chuàng)建一個(gè)指定pod.spec.nodeName=virtual-kubelet節(jié)點(diǎn)的Pod,實(shí)際上運(yùn)行在右側(cè)集群上。

問題
- 以VK啟動(dòng)在其他平臺的Pod,網(wǎng)絡(luò)互通形式?
- 考慮資源同步問題 configMap/pvc/pv/字典、鏡像
- 日志收集
- sidecar(filebeat + logstash + elasticsearch)
- 資源回傳
限制
Severless容器服務(wù),用戶不感知Node,所以不支持hostpath掛載以及DaemonSet部署