Virtink:更輕量的 Kubernetes 原生虛擬化管理引擎
時間:2023-06-30 14:21:01 | 來源:網(wǎng)站運(yùn)營
時間:2023-06-30 14:21:01 來源:網(wǎng)站運(yùn)營
Virtink:更輕量的 Kubernetes 原生虛擬化管理引擎:今天,我們很高興地發(fā)布 Virtink 開源項(xiàng)目,一個更輕量的 Kubernetes 原生虛擬化管理引擎。不同于 KubeVirt 項(xiàng)目,Virtink 并不考慮支持遺留硬件設(shè)備的模擬以及桌面應(yīng)用場景能力,而是聚焦于在 Kubernetes 上運(yùn)行現(xiàn)代化的云端虛擬化負(fù)載,因此 Virtink 基于現(xiàn)代化的
Cloud Hypervisor 實(shí)現(xiàn),它可以在任何一個支持虛擬化的 CPU 平臺上的 Kubernetes 中安裝,以更安全輕量的方式支撐虛擬化負(fù)載。同時,我們也發(fā)布 knest 開源項(xiàng)目,knest 是一個好用的命令行工具,利用 Virtink 的能力,可以非常方便地支撐 Kubernetes-in-Kubernetes 使用場景,讓開發(fā)和運(yùn)維部門不再需要傳統(tǒng)虛擬化平臺,便可方便地在裸金屬上運(yùn)行的 Kubernetes 上創(chuàng)建出任意多的 Kubernetes 集群。
背景
自從 Kubernetes 問世以來,它為云原生基礎(chǔ)設(shè)施帶來了革命性的變化。它強(qiáng)大的分布式調(diào)度能力、簡單易用的集群資源抽象,以及豐富的第三方擴(kuò)展能力使得其成為事實(shí)上的云原生平臺標(biāo)準(zhǔn),正加速吸引著更多的應(yīng)用和中間件向其遷移。
然而,云計(jì)算以及更早的虛擬化時代下,大量的應(yīng)用以虛擬機(jī)為載體。盡管在當(dāng)今容器化的大浪潮下,一些應(yīng)用進(jìn)行了改造甚至重寫以適應(yīng) Kubernetes 平臺,但出于改造難度高或是工作量大等因素,仍有相當(dāng)一部分的應(yīng)用未被容器化,從而未能利用到 Kubernetes 強(qiáng)大能力。此外,一些新開發(fā)的系統(tǒng)級別的應(yīng)用,可能和宿主機(jī)需要使用不同的 kernel,無法跟宿主機(jī)共享 kernel,這些應(yīng)用需要虛擬化能力的支撐來運(yùn)行一個獨(dú)立的 kernel。這種容器和虛擬機(jī)共存但不能共管的情形增加了運(yùn)維的難度和工作量,并且隨著時間的推移這個問題會更加突出。讓 Kubernetes 同時支持編排容器和虛擬機(jī)是一個可行的解決方案。
KubeVirt 項(xiàng)目作為這一領(lǐng)域的先驅(qū)者,這些年吸引了眾多關(guān)注。KubeVirt 更多定位于支持傳統(tǒng)虛擬化平臺的能力。隨著支撐的傳統(tǒng)虛擬化平臺功能的增多,代碼復(fù)雜度越來越高,運(yùn)行每個虛擬機(jī)的額外開銷也很大。Virtink 則完全面向現(xiàn)代化的云負(fù)載,結(jié)合最新的虛擬化技術(shù)進(jìn)展,為用戶提供更為輕量、更為安全的面向云負(fù)載的虛擬化管理引擎。
KubeVirt 面向傳統(tǒng)虛擬化負(fù)載設(shè)計(jì)
為了更多地支持傳統(tǒng)虛擬化平臺的能力,KubeVirt 所使用的虛擬化軟件為傳統(tǒng)的 libvirt 配合 QEMU 的組合。KubeVirt 在每個虛擬機(jī)所在的 pod 內(nèi)都需要運(yùn)行獨(dú)立的 libvirtd 和 launcher 進(jìn)程,經(jīng)觀察,每個 libvirtd 進(jìn)程的內(nèi)存占用普遍在 30MB 以上,每個 launcher 進(jìn)程的內(nèi)存占用一般在 80MB 左右,也就是平均每個虛擬機(jī)的額外內(nèi)存開銷在 110MB 以上。當(dāng)虛擬機(jī)達(dá)到一定數(shù)量時,這部分的內(nèi)存開銷會相當(dāng)可觀。
KubeVirt 支持的虛擬機(jī)鏡像以 QCOW2 為主,這是一種類似裸盤數(shù)據(jù)但又相對空間優(yōu)化的格式。這種打包方式相對緩慢且資源開銷較大,構(gòu)建一個 QCOW2 鏡像往往需要十幾到幾十分鐘,且與容器的 Dockerfile 打包鏡像的方式差別較大。
運(yùn)行開銷大、鏡像打包慢,決定了 KubeVirt 是一個相對較重的虛擬化組件,它更適合承載傳統(tǒng)虛擬化負(fù)載。
Virtink 面向現(xiàn)代化云端虛擬化負(fù)載設(shè)計(jì)
我們發(fā)現(xiàn) Kubernetes 上的虛擬化需求通常是為了運(yùn)行現(xiàn)代化的操作系統(tǒng)以及服務(wù)器端的負(fù)載,這些負(fù)載不需要像傳統(tǒng)虛擬化一樣需要類似 VNC 的桌面控制臺,也不需要支持遺留的硬件設(shè)備模擬能力,但他們需要更少的額外資源開銷,更安全的運(yùn)行時環(huán)境以及更快的啟動速度,Virtink 就是為運(yùn)行這類現(xiàn)代化的云端虛擬化負(fù)載而設(shè)計(jì)的。
Virtink 是 Virtualization in Kuberentes 的縮寫,它的初始設(shè)計(jì)目標(biāo)如下:
- 采用 Kubernetes native 的架構(gòu),能部署在標(biāo)準(zhǔn)的 Kubernetes 集群之上,可通過 Kubernetes API 進(jìn)行安裝、使用和升級;
- 使用 Cloud Hypervisor 作為底層虛擬化 hypervisor,只支持現(xiàn)代化的云負(fù)載,降低資源開銷,保持代碼簡潔;
- 將 VM 和 pod 從網(wǎng)絡(luò)和存儲層面全打通,可與 Kuberntes 生態(tài)的 CNI 網(wǎng)絡(luò),CSI 存儲及各類工具和產(chǎn)品結(jié)合;
- 完美支持 Kubernetes-in-Kubernetes 能力,讓用戶在 Kubernetes 時代,可以完全不依賴傳統(tǒng)虛擬化平臺(例如 VMware)來運(yùn)行多套完全隔離的 Kuberenetes 集群,且擁有同樣的運(yùn)維便利性;
- 虛擬機(jī)鏡像支持采用 Kubernetes 用戶習(xí)慣的容器打包方式進(jìn)行打包;
- 可運(yùn)行在 x86 平臺和 ARM 平臺上;
Virtink 如何做到輕量?
利用輕量的 Cloud Hypervisor
Cloud Hypervisor 是一個開源的 KVM 虛擬機(jī)管理器,由 Rust 編寫,主要關(guān)注于支持現(xiàn)代化的云負(fù)載,提供最低限度的硬件模擬。它主打的優(yōu)勢是安全和輕量。由于提供了最小限度的硬件模擬,盡可能的減小了攻擊面的同時也降低了內(nèi)存開銷。
無額外常駐進(jìn)程開銷
Virtink 不需要為每個 VM 運(yùn)行 libvirtd 和 laucher 進(jìn)程來管理 VM,完全去除掉了 VM 之外的任何開銷。
Virtink 在 VM 運(yùn)行前,啟動一個前導(dǎo)進(jìn)程 prerunner 做網(wǎng)絡(luò)和虛擬機(jī)配置。該進(jìn)程在完成這些配置后,會在 VM 啟動時退出,因此沒有長時間占用的內(nèi)存開銷。針對虛擬機(jī)的狀態(tài)管理,則由每個節(jié)點(diǎn)上運(yùn)行的 daemon 來處理。它會通過 Cloud Hypervisor 的 API socket,監(jiān)控虛擬機(jī)的運(yùn)行狀態(tài),并且在必要的時候下發(fā)虛擬機(jī)管理指令。
支持使用容器鏡像作為虛擬機(jī) rootfs
Cloud Hypervisor 支持 direct kernel boot。在分別給定 kernel 和 rootfs 后,它能快速拉起虛擬機(jī)。這個功能的優(yōu)勢不僅僅在于虛擬機(jī)的啟動速度,由于這里使用的 rootfs 僅要求是一個典型的根分區(qū)即可,并不需要像典型的啟動盤一樣劃分出引導(dǎo)區(qū)、UEFI 分區(qū)等,因此 rootfs 的構(gòu)建打包也相對容易很多。
基于 direct kernel boot 功能,Virtink 支持將容器鏡像作為虛擬機(jī)的 rootfs,從而使得 rootfs 的打包構(gòu)建能夠完全利用 Docker 的工具鏈和生態(tài),極大的加速和方便了虛擬機(jī)的構(gòu)建和發(fā)布。下面就是一個用來構(gòu)建 Ubuntu rootfs 的 Dockerfile 示例。
A Demo
https://asciinema.org/a/509484完美支持 Kubernetes in Kubernetes
目前主流的公有云平臺都提供了對 Kubernetes 的直接支持,使得在這些云平臺上創(chuàng)建和運(yùn)維一套 Kubernetes 集群變得十分輕松簡單。然而,想要在私有的數(shù)據(jù)中心具備類似的能力,則需要付出相當(dāng)?shù)娜肆臀锪?。它一方面要求?shù)據(jù)中心使用強(qiáng)大的分布式虛擬化平臺,另一方面要求這個虛擬化平臺對 Kubernetes 有強(qiáng)有力的支持,使得創(chuàng)建和運(yùn)維 Kubernetes 集群是一件輕松簡單的事情。
Virtink 的出現(xiàn)則使這個問題有了一個更簡單輕量的解決方案。Virtink 提供的虛擬化能力可以很好地承載 Kubernetes 虛擬機(jī)集群的負(fù)載,即提供 Kubernetes as a service 的能力。并且由于 Virtink 相對輕量的特點(diǎn),可以提供比 KubeVirt 更高的虛擬機(jī)運(yùn)行密度,從而可以運(yùn)行更多的 Kubernetes 節(jié)點(diǎn)。
我們同步開發(fā)了一個在 Kubernetes 集群之上創(chuàng)建嵌套 Kubernetes 集群的命令行工具 knest。借助這個工具,可以非??旖莸貏?chuàng)建任意數(shù)量的嵌套 Kubernetes 集群,實(shí)現(xiàn) Kubernetes as a service。
https://asciinema.org/a/509497路線圖
Virtink 現(xiàn)在是 v0.8 版本,已經(jīng)支持了運(yùn)行虛擬化負(fù)載的最小功能集合,例如支持 CNI 網(wǎng)絡(luò)和 CSI 存儲,并且支持了 x86 和 ARM 平臺。在路線圖上的功能有熱遷移、主機(jī) PCI 設(shè)備(SR-IOV 網(wǎng)卡、GPU 等)直通、vCPU 綁定、虛擬機(jī)磁盤熱拔插等。
knest 現(xiàn)在是 v0.2 版本,支持了嵌套 Kubernetes 集群的創(chuàng)建和擴(kuò)縮容等功能,后續(xù)版本的 knest 將持續(xù)增強(qiáng)易用性和集群運(yùn)維功能。
Vintink 和
knest 項(xiàng)目托管在 Github 上,采用開放的 Apache License 2.0,您可以自由的使用和修改它們,同時歡迎您反饋 Issue,提需求及參與到代碼貢獻(xiàn)中。
Play harder.