后Kubernetes時代的虛擬機管理技術(shù)之kubevirt篇
時間:2023-07-14 05:15:02 | 來源:網(wǎng)站運營
時間:2023-07-14 05:15:02 來源:網(wǎng)站運營
后Kubernetes時代的虛擬機管理技術(shù)之kubevirt篇:kubevirt是Red Hat開源的以容器方式運行虛擬機的項目,是基于kubernetes運行,利用k8s CRD為增加資源類型VirtualMachineInstance(VMI),使用CRD的方式是由于kubevirt對虛擬機的管理不局限于pod管理接口。通過CRD機制,kubevirt可以自定義額外的操作,來調(diào)整常規(guī)容器中不可用的行為。kubevirt可以使用容器的image registry去創(chuàng)建虛擬機并提供VM生命周期管理。
Kubevirt的架構(gòu)
kubevirt以CRD的形式將VM管理接口接入到kubernetes中,通過一個pod去使用libvirtd管理VM的方式,實現(xiàn)pod與VM的一一對應(yīng),做到如同容器一般去管理虛擬機,并且做到與容器一樣的資源管理、調(diào)度規(guī)劃、這一層整體與企業(yè)IAAS關(guān)系不大,也方便企業(yè)的接入,統(tǒng)一納管。
virt-api:kubevirt是以CRD形式去管理VM Pod,virt-api就是所有虛擬化操作的入口,這里面包括常規(guī)的CDR更新驗證、以及console、vm start、stop等操作。
virt-controller:virt-controller會根據(jù)vmi CRD,生成對應(yīng)的virt-launcher Pod,并且維護CRD的狀態(tài)。與kubernetes api-server通訊監(jiān)控VMI資源的創(chuàng)建刪除等狀態(tài)。
virt-handler:virt-handler會以deamonset形式部署在每一個節(jié)點上,負責(zé)監(jiān)控節(jié)點上的每個虛擬機實例狀態(tài)變化,一旦檢測到狀態(tài)的變化,會進行響應(yīng)并且確保相應(yīng)的操作能夠達到所需(理想)的狀態(tài)。virt-handler還會保持集群級別VMI Spec與相應(yīng)libvirt域之間的同步;報告libvirt域狀態(tài)和集群Spec的變化;調(diào)用以節(jié)點為中心的插件以滿足VMI Spec定義的網(wǎng)絡(luò)和存儲要求。
virt-launcher:每個virt-launcher pod對應(yīng)著一個VMI,kubelet只負責(zé)virt-launcher pod運行狀態(tài),不會去關(guān)心VMI創(chuàng)建情況。virt-handler會根據(jù)CRD參數(shù)配置去通知virt-launcher去使用本地的libvirtd實例來啟動VMI,隨著Pod的生命周期結(jié)束,virt-lanuncher也會去通知VMI去執(zhí)行終止操作;其次在每個virt-launcher pod中還對應(yīng)著一個libvirtd,virt-launcher通過libvirtd去管理VM的生命周期,這樣做到去中心化,不再是以前的虛擬機那套做法,一個libvirtd去管理多個VM。
virtctl:virtctl是kubevirt自帶類似kubectl的命令行工具,它是越過virt-launcher pod這一層去直接管理VM虛擬機,可以控制VM的start、stop、restart。
Kubevirt如何管理虛擬機?
虛擬機鏡像制作與管理
虛擬機鏡像采用容器鏡像形式存放在鏡像倉庫中。創(chuàng)建原理如上圖所示,將Linux發(fā)行版本的鏡像文件存放到基礎(chǔ)鏡像的/disk目錄內(nèi),鏡像格式支持qcow2、raw、img。通過Dockerfile文件將虛擬機鏡像制作成容器鏡像,然后分別推送到不同的registry鏡像倉庫中??蛻粼趧?chuàng)建虛擬機時,根據(jù)配置的優(yōu)先級策略拉取registry中的虛擬機容器鏡像,如果其中一臺registry故障,會另一臺健康的registry拉取鏡像。
虛擬機生命周期管理
KubeVirt虛擬機生命周期管理主要分為以下幾種狀態(tài):
l 虛擬機創(chuàng)建:創(chuàng)建VM對象,并同步創(chuàng)建DataVolume/PVC,從Harbor鏡像倉庫中拉取系統(tǒng)模板鏡像拷貝至目標(biāo)調(diào)度主機,通過調(diào)度、IP分配后生成VMI以及管理VM的Launcher Pod從而啟動供業(yè)務(wù)使用的VM。
l 虛擬機運行:運行狀態(tài)下的VM 可以進行控制臺管理、快照備份/恢復(fù)、熱遷移、磁盤熱掛載/熱刪除等操作,此外還可以進行重啟、下電操作,提高VM安全的同時解決業(yè)務(wù)存儲空間需求和主機異常Hung等問題。
l 虛擬機關(guān)機:關(guān)機狀態(tài)下的VM可以進行快照備份/恢復(fù)、冷遷移、CPU/MEM規(guī)格變更、重命名以及磁盤掛載等操作,同時可通過重新啟動進入運行狀態(tài),也可刪除進行資源回收。
l 虛擬機刪除:對虛機資源進行回收,但VM所屬的磁盤數(shù)據(jù)仍將保留、具備恢復(fù)條件。
虛擬機創(chuàng)建流程
虛擬機創(chuàng)建分為創(chuàng)建DataVolume和VMI兩個流程:
1. 創(chuàng)建DataVolume后,CDI組件創(chuàng)建對應(yīng)的PVC并且關(guān)聯(lián)到合適的PV,然后通過臨時Importer Pod拉取虛擬機容器鏡像綁定到DataVolume生成的PV中,并且將鏡像轉(zhuǎn)換成disk.img文件存儲在PV中供虛擬機使用。
2. 創(chuàng)建VMI后,等待disk.img轉(zhuǎn)換成功,然后在對應(yīng)的Node上啟動Launcher Pod,并將CDI流程生成的PV掛載到Pod內(nèi),當(dāng)做虛擬機啟動的系統(tǒng)盤。Launcher根據(jù)VMI的定義生成定義虛擬機的XML文件,然后調(diào)用libvirt進程調(diào)用Qemu命令創(chuàng)建并且啟動虛擬機。VMI會對Launcher Pod狀態(tài)進行同步,反應(yīng)VM運行的狀態(tài)。
Kubevirt如何實現(xiàn)容器與虛擬機交互TBD
容器和虛擬機互通
l Virtual-Kubelet對應(yīng)的Node會上報節(jié)點上Pod的Endpoint,假定Kubernetes集群和IaaS層平臺部署在同一個二層網(wǎng)絡(luò)下,則集群內(nèi)容器Pod可以訪問VM-Pod,但容器Pod對于VM-Pod不可見;
l 針對上一點可以通過Macvlan等網(wǎng)絡(luò)插件,將容器-Pod,降維至二層網(wǎng)絡(luò)上,實現(xiàn)容器-Pod和虛擬機互通,有一定硬件要求。
如何實現(xiàn)?套集群下虛擬機與容器的混合調(diào)度與資源隔離
l Virtual-Kubelet提供的是一個虛擬節(jié)點用來向Kubernetes上報Node對象和Pod的狀態(tài)和資源情況,虛擬機資源和集群內(nèi)節(jié)點資源完全隔離;
l 在引入Virtual-Kubelet的情況下,需要對Virtual-Kubelet節(jié)點配置Taint和Tolerations,保證容器-Pod和VM-Pod調(diào)度分離。
服務(wù)發(fā)現(xiàn)
Virtual-Kubelet,通過Provider實現(xiàn)的API將IaaS層VM信息抽象成對應(yīng)Pod對象的信息的方式來上報Endpoints,可以通過給CR添加no selector Service,待VM-Pod拉起后補充address至對應(yīng)的Service
Kubevirt適用場景
由于Kubervirt提供的成熟的虛擬化能力和性能,并且可以直接通過Kubernetes進行統(tǒng)一管理。所以Kubevirt適合在有PaaS層管理平臺和Kubernetes集群環(huán)境的情況下,通過kubevirt中的單一控制平面簡化了對虛擬機的管理,讓用戶無需關(guān)心IaaS層,即可輕松在集群內(nèi)構(gòu)建、部署出一臺虛擬機進行使用。
如何搭建Kubevirt
Kubevirt安裝
1. 前置條件
查看硬件是否支持虛擬化
如果虛擬化不可用,則需要手動開啟軟件仿真
2. 安裝Kubevirt組件
直接操作以下命令進行安裝
3. 檢查實例是否正常運行
4. 啟動相關(guān)特性
修改kubevirt-config configmap內(nèi)的數(shù)據(jù)
5. 安裝virtctl
安裝kubevirt命令行工具
6. 安裝CDI
CDI(containerized-data-importer) 是kubernetes的持久存儲管理插件,幫助kubevirt構(gòu)建磁盤鏡像,可以將不同來源的數(shù)據(jù)源(url、container image、upload....)來填充pvc的能力。
獲取最新版,進行安裝
安裝完畢后,會在cdi namespace下,啟動cdi相關(guān)組件
至此,kubevirt安裝完畢
創(chuàng)建虛擬機
1. 準備一個虛擬機鏡像
通過dockerfile構(gòu)建出一個虛擬機鏡像
2. 創(chuàng)建一臺VM
編輯好yaml文件,通過kubectl命令拉起一臺vm
關(guān)鍵詞:技術(shù),管理,時代,虛擬