
Photo by Agent J on Unsplash
在 上一篇 中,針對 KubeVirt 已先做過簡介、建立 KubeVirt 環境以及在上面建立第一個 VM。接下來會深入探討,KubeVirt 的一些特性及與一般 VM 在儲存、網路等不同差異之處。
KubeVirt 的儲存類型與應用
在第一篇中,大略把 KubeVirt 上的儲存空間分為永久與非永久這兩類,並且簡單說明了每一個儲存類型。在本篇,將會針對這些儲存類型做比較具體的說明以及其可能的應用之處。
K8S 支援的掛載並不等於全部都可用在 KubeVirt 上!
首先必須要提到的是,KubeVirt 的服務最終型態還是以 VM 為主,因此不能將 K8S 運行容器的概念完全套用在 KubeVirt 上。 例如,K8S 容器可以在沒有 StorageClass 的情況下,手動建立 PV 與 PVC 連接後掛載進容器內使用,以及可以使用 volume 和 volumeMount 的方式,在建立 Pod 時將主機端或遠端的路徑位置掛載使用;但 KubeVirt 並不具備這樣的功能,畢竟 VM 的儲存運行主體還是以其 image 為主,兩者之間的儲存格式即存在本質上的不同。
在第一篇中,有提到 KubeVirt 支援的儲存類型分為三類,分別為非永久性、永久性和定義性三類: 非永久性:儲存空間會在 VM 建立時一同創建,但 VM 刪除時也會一併被刪除。 永久性:儲存空間本身就存在或者 VM 建立時一同創建,當 VM 刪除時,儲存空間會被保留下來。 定義性:這類儲存空間不存放任何媒體性質的資料,而是存放設定檔、密碼等等這類資訊類的資料。可對應 K8S 本身的 configMap 及 Secret。
在一般所認知的雲端環境中,非永久性儲存通常用在給客戶短期試用、或者將原先的範本包成應用服務後提供給客戶或是自身使用,而在後者的狀況中,則是根據客戶需求,另外掛載一個永久性儲存類型的媒體當作客戶需要存放的位置,或者直接提供一個永久性儲存空間來運行系統,讓客戶的長期運行服務使用。要直接類比的話,就類似於 Openstack 建立 Instance 時,從 image 建立或者從 volume 建立的差別。而定義性儲存空間,通常是做為掛載一些設定檔進去環境內,使環境啟動時不需人工登入設定,即可直接快速設定好服務的直接做法。
非永久性儲存類型
emptyDisk: 當 VM 建立時,KubeVirt 會根據建立 VM 時定義的 Disk 大小,在 Pod 內產生一個 QCOW2 image,並掛載進 VM 內為虛擬硬碟。由於是在Pod內建立的關係,當VM刪除時,Pod也會隨之刪除,該image也會被刪除。這種類型通常應用在內部安裝測試的用途居多,很少會拿來在Production Site上使用。
containerDisk: 顧名思義,將 VM image 打包成 container image,然後掛載給 VM 使用,為 KubeVirt 的特色之一。
永久性儲存類型
PersistentVolumeClaim(PVC): 與一般的 Pod 容器一樣,KubeVirt 所建立的 VM 也可直接使用 PVC 做為儲存空間,而存放的方式則是把 VM image 直接存放在 PVC 內,VM 建立或啟動時再掛載進 VM 內;若 PVC 內沒有 image, KubeVirt 會根據 PVC 的大小建立 image。此類型為 KubeVirt 常用的永久性儲存類型,同時也被 K8S 廣泛支援。缺點是 PVC 需要手動建立,且若要將原先的 image 放入 PVC,則需要透過一些其他手段放入。
DataVolume(DV): 此類型同樣使用 PVC 為基底,差別在可直接於 VM 或 VMI 的 YAML 內定義 DV 的 image 來源。當 VM 建立時,KubeVirt 會根據提供的來源自動獲取 image、生成 PVC 並存入其中。此類型與containerDisk 一樣,適合用在大量佈建時所使用,差別只在建立的儲存空間都是永久的,另外在較新的 KubeVirt 版本中,擴增 PVC 的大小也會自動擴增 image 的大小。由於 DV 是 KubeVirt 自身的功能,需要透過其他的組件才能運作,若要使用 DV,必須要在環境上安裝 KubeVirt CDI 套件。
HostDisk: 此類型不使用 PVC 等儲存空間,而是直接使用本機端的路徑檔案作為來源,類似 K8S Volume 的 HostPath 機制;若指定的路徑找不到檔案,也可以設定自動建立,並且設定要建立的大小。缺點是這目前在 KubeVirt 上還是實驗性質,必須要在 FeatureGate 啟用此功能才能使用,且不支援 Migration。
定義性儲存類型
- CloudInitNoCloud/CloudInitConfigDrive: 此類型為專門存放 cloud-init 的資料,並且在 VM 建立時根據該檔案的內容來初始化作業系統。Cloud-init 是雲端環境很常見的套件,用來對雲端用的 image 做初期的客製化設定,包括可設定密碼、設定 IP、安裝套件、修改主機名稱等。KubeVirt 提供了這項功能,以讓使用者可直接使用公版或是自身客製化的 Cloud image,直接在KubeVirt 上快速建立與運行。而此儲存類型的設定檔編寫,基本上與 K8S 的ConfigMap 及 cloud-init 無異。
順帶一提,NoCloud 與 ConfigDrive 之間的差異,在於是否需要連線到雲端環境的 metadata 伺服器取得初始化內容,為 cloud-init 運作上的差異。
其他KubeVirt支援的定義性儲存類型,如 ConfigMap 與 Secret 等,基本上與K8S自身是共通的,因此這邊就不再介紹。

下一篇 將繼續介紹如何將儲存空間載進 VM 內變成虛擬儲存媒體時的設定。