CNStack 虛擬化服務:實現虛擬機和容器資源的共池管理

作者:林蒼

背景

容器無疑已經成爲新的雲計算基礎設施,企業私有云平臺的建設重心,正在從虛擬化的計算、存儲、網絡的建設,轉向構建以容器、微服務等爲核心的雲原生平臺。不過值得注意的是,企業 IT 系統在進行容器化改造的過程中,由於歷史遺留系統、技術債務、內核依賴等原因,基於虛擬機的應用在未來依然會廣泛存在。企業的 IT 基礎設施正在從單一的虛擬化架構逐步走向虛擬機+容器的混合架構,Gartner 預測到 2026 年將會有 75% 的私有化環境需要混合部署虛擬機和容器負載。

CNStack 虛擬化服務(cnstack-virtualization)基於以 CNCF KubeVirt 爲代表的雲原生虛擬化技術,用一套控制平面同時管理容器和虛擬機,實現容器與虛擬機的資源共池管理、靈活分配、統一調度。企業可將難以容器化的虛擬機應用無縫遷移到 CNStack 平臺上,逐步實現 IT 系統的雲原生化。

CNStack 虛擬化雲服務

在 CNStack 2.0 中,虛擬化服務以獨立雲服務的形態進行部署,即能複用 CNStack 平臺與多集羣服務提供的多租資源管理、統一網關、集羣管理、多集羣資源分發等基礎能力,又能不失靈活性地獨立演進與發佈。

CNStack 虛擬化服務在當前版本提供瞭如下能力,並會逐步在後續版本上線更多能力(如虛擬機災備、虛擬機熱遷移、虛擬機遷移工具等):

  • 完整的虛擬機生命週期管理能力:支持開關機、重啓、暫停、快照等操作。
  • 虛擬機自運維能力
    • 在瀏覽器通過 VNC、串口帶外管理協議運維虛擬機。
    • 快照與恢復:通過快照保存虛擬機磁盤在某一時刻的狀態,數據丟失或異常時可快速恢復。
    • 監控與告警:提供虛擬機 CPU、內存、磁盤 I/O、網絡吞吐等關鍵運行指標的監控與告警。
  • 管理虛擬機鏡像
    • 上傳鏡像,並按照租戶控制資源的可見範圍。
    • 基於快照製作虛擬機鏡像。
  • ARM 多架構、IPv6、虛擬機固定 IP、邊緣虛擬機自治、虛擬機快照克隆等特性
  • 虛擬機應用管理:CNStack 應用管理服務提供了對虛擬機應用的納管功能,支持對虛擬機內應用的一站式託管以及服務治理、能力開放、應用監控、應用告警和應用防護等能力。

整體架構簡介

image.png

  • cnstack-virt-console

基於阿里雲自研的 ALFA 微前端方案,cnstack-virt-console 以微前端應用的形式被 CNStack Console 前端頁面插件化集成。即可以保證終端用戶在交互體驗上的一致,也可滿足虛擬化服務前端應用自由演進、獨立部署分發的靈活性。

  • cnstack-virt-api

提供虛擬化雲服務的管控 API,將 VirtualMachine、DataVolume、VMImage 等自定義資源的讀寫操作以 RESTful 接口的形式進行封裝。與其他的管控 API 一樣,由 CNStack IAM Gateway 組件統一提供用戶認證、鑑權、API 審計等基礎能力,向集羣外提供服務。值得一提的是,cnstack-virt-api 基於 CNStack 多集羣服務的 cluster-gateway 組件,實現了跨集羣的資源分發。

  • KubeVirt

CNCF KubeVirt 拓展了管理運行虛擬機的 CRD,使得虛擬機資源可被視爲 Kubernetes 集羣的“一等公民”。KubeVirt 基於容器來管理運行 QEMU 虛擬機,提供了不同於容器的虛擬機生命週期管理接口,通過與標準的 CNI 容器網絡插件和 CSI 容器存儲插件對接,使得虛擬機可複用 Kubernetes 集羣內的網絡與存儲資源。在 KubeVirt 社區版本的基礎上,我們還爲其拓展支持了 IPv6、GuestOS 監控、虛擬機固定IP、邊緣虛擬機自治、虛擬機快照克隆等特性。

  • CDI

**containerized-data-importer (CDI) [ 1] **是 KubeVirt 社區下的一個子項目,拓展了管理虛擬機磁盤的 CRD,負責生產含有虛擬機磁盤數據的 PersistentVolume 供 KubeVirt 虛擬機消費,並可支持從 VMWare、oVirt 等外部虛擬化平臺導入磁盤數據。

  • vmimage-controller

拓展了管理虛擬機鏡像的 CRD。除了提供配置虛擬機所需要的 OS 元數據以外,還負責將鏡像數據導入到集羣,將集羣內的虛擬機磁盤導出爲鏡像,並支持 ISO、QCOW2 等多種鏡像格式,支持 OSS、HTTP、容器鏡像等多種數據源。

CNStack 雲原生虛擬化

相較於 OpenStack、VMWare vSphere 等傳統的虛擬化平臺來說,基於 KubeVirt 等雲原生軟件構建的 CNStack 雲原生虛擬化平臺有以下特點:

  • 開放性

傳統的虛擬化平臺內往往集成了廠商提供的一整套網絡、存儲軟件。而 Kubernetes 則基於 CSI、CNI 等規範提供了平臺無關的資源抽象,基於 Kubernetes 構建的虛擬化平臺可按照該規範自由對接各種類型的網絡與存儲資源,對客戶來說避免了廠商鎖定(vendor lock-in)的憂慮。

  • 雲原生的技術紅利

毫無疑問雲原生已經成爲主流的技術領域,蓬勃發展的社區內囊括了監控、日誌、安全、應用管理等豐富的軟件生態。基於 Kubernetes 構建的虛擬化平臺,統一的控制面與數據面使得虛擬機應用可以更便捷地享受雲原生的技術紅利。

KubeVirt 架構簡介

下文着重介紹 KubeVirt 是如何基於 Kubernetes 解決網絡、存儲資源的虛擬化,以及虛擬機與容器是如何共享網絡與存儲資源,更多詳細的 KubeVirt 架構介紹可見其**官方文檔 [ 2] **。

虛擬化技術的本質是對硬件設備的模擬,KubeVirt 提供了 **VirtualMachine [ 3] **CR 來描述虛擬機,VirtualMachine CR 的核心是通過 **Domain [ 4] **類型來描述運行虛擬機所需的設備資源(熟悉 **Libvirt [5 ] **的讀者會發現這幾乎就對應於 Libvirt Domain 的概念),最終通過 Libvirt 交由 **QEMU [ 6] **模擬出虛擬機的硬件設備,也支持通過 Device Plugin 使用直通的宿主機 PCI 設備以降低設備模擬的開銷。

KubeVirt 主要組件包括控制面的 virt-api 與 virt-controller,以 daemonset 部署的 virt-handler 負責管理配置節點上的虛擬機,以及實際運行 QEMU 虛擬機進程的 virt-launcher Pod,virt-launcher 承擔了虛擬機存儲網絡與容器存儲網絡之間的橋樑。

虛擬機存儲

虛擬機的磁盤數據存儲在 virt-launcher Pod 掛載的 volume 中,volume 就交由各種 CSI 容器存儲插件進行供給。KubeVirt 支持文件與塊設備兩種數據格式來存儲磁盤數據:

  • 文件:對應於 FileSystem VolumeMode 的 PV,PV 內只有一個磁盤鏡像文件,QEMU 通過這種特殊格式的文件來模擬物理磁盤。
  • 塊設備:對應於 Block VolumeMode 的 PV,QEMU 直接通過塊設備接口讀取磁盤數據。由於 by-pass 了 PV 上的文件系統,具有更好的性能。

針對實際交付需求,CNStack 虛擬化服務支持本地與分佈式存儲兩種場景:

  • 本地存儲:基於阿里巴巴開源的 open-local 容器存儲插件,自動化節點本地磁盤的分配與調度,使得虛擬機可以靈活、低成本地使用本地存儲資源。
  • 分佈式存儲:基於阿里巴巴自研的 vCNS 雲原生分佈式存儲軟件,將 NVMe、SSD、HDD 等不同性能的磁盤進行分層地存儲池化管理,爲虛擬機提供了高性能、可靠的持久存儲。

虛擬機網絡

CNI 容器網絡插件在容器的 network namespace 中創建 veth 網絡設備(pod-nic)以供容器內進程使用,KubeVirt 提供了多種方式(**Network Binding Mode [7 ] **)連接 pod-nic 與 QEMU 虛擬機內的網絡設備(VM-nic),Pod 之間的網絡通信鏈路還是由 CNI 容器網絡插件來管理。

  • bridge:pod-nic 與 VM-nic 直接通過 layer-2 bridge 連接,VM-nic 通過 DHCP 協議直接獲取到 pod-nic 的 layer-3 IP,Pod 充當了交換機的角色。
  • masquerade:VM-nic 獲取到的是本地 IP(只在 Pod 有效,一般固定爲 10.0.1.2),VM-nic 發出/收到的流量都被 Pod 內的 iptables/nftables 規則 NAT 爲 Pod IP 進行傳輸,Pod 充當了路由器的角色。
  • sriov, slirp, passt 等其他 KubeVirt Network Binding 就不一一介紹。

image.png

虛擬機固定 IP

KubeVirt 很大程度複用了容器網絡來搭建虛擬機網絡鏈路,這種架構保證了虛擬機和容器網絡(包括 Service、Ingress、NetworkPolicy 等)之間的無縫銜接。但這也對虛擬機用戶帶來了一些使用體驗上的差異,Pod IP 在重建前後往往會變化,但虛擬機用戶卻習慣於使用固定 IP 的虛擬機。CNStack 虛擬化服務基於由阿里巴巴開源的 hybridnet 容器網絡插件,支持了虛擬機固定 IP 的能力,可以保證虛擬機所處 Pod 在重建後的 IP 與 Mac 地址保證不變。

虛擬機鏡像(Golden Image)

對於個人電腦用戶來說,相信一定不會陌生如何通過 ISO 光盤或者 U 盤來安裝操作系統。虛擬機內操作系統(GuestOS)的安裝則不太一樣,各操作系統發行版一般會提供了兩種格式:

  • ISO 光盤文件:最爲常見,需要用戶手動安裝操作系統,可能還需要用戶手動安裝驅動,配置內核啓動參數,安裝 Cloud-init、GuestAgent、kdump 等 GuestOS 運維軟件。
  • Golden Image:只有少部分發行版提供,免安裝,開機即可使用,已經預先配置好了運維 GuestOS 所需各類軟件,創建自 Golden Image 鏡像的虛擬機也會具有更好的運維體驗。例如 Ubuntu Cloud Image、阿里雲官方提供的 ECS 鏡像等。

由於大多數虛擬機用戶缺乏構建 **Golden Image [ 8] **的背景知識,一般只能提供 ISO 光盤文件(或者直接從發行版的官網下載)。我們基於 KubeVirt 與 **Tekton CICD [ 9] **搭建了虛擬機鏡像構建流水線(VMImage Pipeline),基於 ISO 光盤文件,自動構建出 Golden Image 並上傳到 OSS 等集中式存儲中,以供創建虛擬機。

image.png

VMImage Pipeline

上述 VMImage Pipeline 對應於一個 Tekton Pipeline,由若干 Tekton Task 組成。以構建 CentOS 的 Golden Image 爲例,流程如下:

  • Install OS

CentOS、Fedora 等 Linux 發行版支持通過 **kickstart [ 10] **自動化安裝操作系統,ISO 內的安裝程序啓動後如果檢測到 kickstart 配置文件,則會按照其配置自動執行安裝程序。Windows 操作系統也支持通過 **Sysprep [ 11] **實現類似的自動安裝功能。值得一提的是,爲了之後能通過 SSH 協議連接配置虛擬機,需要導入臨時的用戶信息。

  • Config OS

基於上一步安裝完畢的系統盤 PVC 創建虛擬機,並啓動臨時 Pod 通過 SSH 協議連接到虛擬機,執行 bootstrap 腳本,配置 kernel 啓動參數,安裝 Cloud-init、QEMUGuestAgent 等軟件。

  • Reset TempConfig

到這一步時,系統盤已經配置完畢了,但是之前虛擬機運行時在系統盤內殘留了網卡的 mac 地址、ssh 連接記錄等敏感信息,我們通過 virt-sysprep 工具抹去系統內的臨時配置,生成一個乾淨的鏡像文件。

  • Upload Image

將 PVC 內的磁盤文件上傳到 OSS 等集中式存儲中,之後銷燬該 PVC。後續創建虛擬機時,可通過 CDI DataVolume HTTP Source 重新下載磁盤文件到新建虛擬機的 PVC 中。

image.png

展望

對於企業來說,部署管理虛擬機只是第一步,如何運維管理虛擬機內的應用還需要不少工作,針對於虛擬機應用的傳統運維工具很難適配雲原生的軟件生態。CNStack 虛擬化服務後續除了會繼續豐富虛擬機的運維能力之外,還期望能夠爲虛擬機內應用提供與容器應用相同的運維管理體驗。

參考資料:

CNStack 產品官網

https://www.aliyun.com/activity/middleware/cnstack

CNCF OCM

https://open-cluster-management.io/

CNCF KubeVirt

https://kubevirt.io/

open-local

https://github.com/alibaba/open-local

hybridnet

https://github.com/alibaba/hybridnet

相關鏈接

[1] containerized-data-importer (CDI)

https://github.com/kubevirt/containerized-data-importer

[2] 官方文檔

https://kubevirt.io/user-guide/architecture/#additional-services

[3] VirtualMachine

http://kubevirt.io/api-reference/main/definitions.html#_v1_virtualmachine

[4] Domain

http://kubevirt.io/api-reference/main/definitions.html#_v1_domainspec

[5] Libvirt

https://libvirt.org/

[6] QEMU

https://www.qemu.org/

[7] Network Binding Mode

https://kubevirt.io/user-guide/virtual_machines/interfaces_and_networks/#frontend

[8] Golden Image

https://opensource.com/article/19/7/what-golden-image

[9] Tekton CICD

https://tekton.dev/

[10] kickstart

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_8_installation/performing_an_automated_installation_using_kickstart

[11] Sysprep

https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/sysprep--generalize--a-windows-installation?view=windows-11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章