天天看點

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

作者:技術聯盟總壇

作者:林蒼 阿裡雲雲原生

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

背景

Cloud Native

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

CNStack 虛拟化服務(cnstack-virtualization)基于以 CNCF KubeVirt 為代表的雲原生虛拟化技術,用一套控制平面同時管理容器和虛拟機,實作容器與虛拟機的資源共池管理、靈活配置設定、統一排程。企業可将難以容器化的虛拟機應用無縫遷移到 CNStack 平台上,逐漸實作 IT 系統的雲原生化。

CNStack 虛拟化雲服務

Cloud Native

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

CNStack 虛拟化服務在目前版本提供了如下能力,并會逐漸在後續版本上線更多能力(如虛拟機災備、虛拟機熱遷移、虛拟機遷移工具等):

  • 完整的虛拟機生命周期管理能力:支援開關機、重新開機、暫停、快照等操作。
  • 虛拟機自運維能力
    • 在浏覽器通過 VNC、序列槽帶外管理協定運維虛拟機。
    • 快照與恢複:通過快照儲存虛拟機磁盤在某一時刻的狀态,資料丢失或異常時可快速恢複。
    • 監控與告警:提供虛拟機 CPU、記憶體、磁盤 I/O、網絡吞吐等關鍵運作名額的監控與告警。
  • 管理虛拟機鏡像
    • 上傳鏡像,并按照租戶控制資源的可見範圍。
    • 基于快照制作虛拟機鏡像。
  • ARM 多架構、IPv6、虛拟機固定 IP、邊緣虛拟機自治、虛拟機快照克隆等特性
  • 虛拟機應用管理:CNStack 應用管理服務提供了對虛拟機應用的納管功能,支援對虛拟機内應用的一站式托管以及服務治理、能力開放、應用監控、應用告警和應用防護等能力。

整體架構簡介

CNStack 虛拟化服務:實作虛拟機和容器資源的共池管理
  • 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 雲原生虛拟化

Cloud Native

相較于 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 就不一一介紹。
CNStack 虛拟化服務:實作虛拟機和容器資源的共池管理

虛拟機固定 IP

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

虛拟機鏡像(Golden Image)

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

  • ISO CD光牒檔案:最為常見,需要使用者手動安裝作業系統,可能還需要使用者手動安裝驅動,配置核心啟動參數,安裝 Cloud-init、GuestAgent、kdump 等 GuestOS 運維軟體。
  • Golden Image:隻有少部分發行版提供,免安裝,開機即可使用,已經預先配置好了運維 GuestOS 所需各類軟體,建立自 Golden Image 鏡像的虛拟機也會具有更好的運維體驗。例如 Ubuntu Cloud Image、阿裡雲官方提供的 ECS 鏡像等。

由于大多數虛拟機使用者缺乏建構 Golden Image[8] 的背景知識,一般隻能提供 ISO CD光牒檔案(或者直接從發行版的官網下載下傳)。我們基于 KubeVirt 與 Tekton CICD[9] 搭建了虛拟機鏡像建構流水線(VMImage Pipeline),基于 ISO CD光牒檔案,自動建構出 Golden Image 并上傳到 OSS 等集中式存儲中,以供建立虛拟機。

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

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 中。

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

展望

Cloud Native

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

繼續閱讀