前言
KubeVirt 讓你在 Kubernetes 上跑虛擬機(VM),但 VM 的儲存需求跟一般容器很不一樣。容器可以隨意用 Volume、VolumeMount 掛載路徑,但 VM 的運作核心是磁碟映像(disk image),兩者的儲存格式有本質差異。
這篇文章整理了 KubeVirt 支援的所有儲存類型,以及如何在 VM 中實際掛載使用。
KubeVirt 儲存類型總覽
可以分成三大類:
| 類別 | 特性 | 包含類型 |
|---|---|---|
| 非永久性 | VM 建立時建立,VM 刪除時一併消失 | emptyDisk、containerDisk |
| 永久性 | VM 刪除後儲存空間保留 | PVC、DataVolume、HostDisk |
| 定義性 | 存放設定檔、密碼等初始化資料 | CloudInitNoCloud/ConfigDrive、ConfigMap、Secret |
非永久性儲存
emptyDisk
VM 建立時,KubeVirt 會在 Pod 內產生一個 QCOW2 映像並掛載為虛擬硬碟。大小在 YAML 中定義。VM 刪除 = Pod 刪除 = 映像消失。適合內部測試用途,不建議用在正式環境。
containerDisk
KubeVirt 的一大特色:把 VM 映像打包成容器映像(container image)。建立 VM 時,Pod 會啟動兩個容器,其中一個專門負責掛載指定的容器映像到 VM 中。
containerDisk 的結構與一般容器映像類似,差別在於 layer 裡面只有一個 /disk 目錄,存放 VM 或 ISO 映像(可用 qemu-img 確認格式)。
特點與限制:
- 適合大量部署不需保留資料的場景(如範本化的應用服務)
- 可以把多個 VM/ISO 映像放在同一個 containerDisk 中,透過指定路徑載入不同的映像
- 無法動態擴充容量(不像 PVC 可以 resize)
- VM 刪除後資料消失
- 無法做 Snapshot
永久性儲存
PersistentVolumeClaim (PVC)
最常用的永久性儲存方式。KubeVirt 會把 VM 映像直接存在 PVC 裡,VM 啟動時掛載。若 PVC 內沒有映像,KubeVirt 會根據 PVC 大小自動建立。
注意事項:
- PVC 需要手動建立
- PVC 必須和 VMI 在同一個 namespace(跨 namespace 需要特別設定權限)
- 若要匯入既有映像到 PVC,需要透過額外手段(如 virtctl 或 CDI)
DataVolume (DV)
以 PVC 為基底,但更智慧——可以在 VM YAML 中直接定義映像來源(URL、Registry、S3 等)。建立 VM 時,KubeVirt 自動下載映像、建立 PVC 並存入。
使用 DV 需要安裝 KubeVirt CDI(Containerized Data Importer) 套件。在較新版本中,擴增 PVC 大小也會自動擴增映像大小。非常適合大量佈建。
HostDisk
直接使用節點本機路徑的檔案,類似 K8s 的 hostPath。可設定找不到檔案時自動建立。
限制:
- 目前仍是實驗性功能,需要在 FeatureGate 中啟用
- 不支援 Live Migration
- type 可為
Disk(直接使用)或DiskOrCreate(不存在則建立)
定義性儲存
CloudInitNoCloud / CloudInitConfigDrive
專門存放 cloud-init 資料,VM 建立時根據內容做初始化(設定密碼、IP、安裝套件、修改 hostname 等)。讓你可以直接用公版 Cloud Image 在 KubeVirt 上快速建立 VM。
NoCloud 與 ConfigDrive 的差異在於是否需要連線到 metadata server——NoCloud 不需要,適合離線環境。
虛擬儲存媒體:前端掛載設定
上面講的都是「後端」——資料從哪裡來。接著看「前端」——這些儲存如何變成 VM 裡的虛擬磁碟。
支援的虛擬媒體類型
| 類型 | 對應 | 說明 |
|---|---|---|
| disk | 虛擬硬碟 | 最常用,掛載為 VM 的系統碟或資料碟 |
| cdrom | 虛擬光碟機 | 掛載 ISO 映像,通常用於安裝 OS 或驅動程式 |
| lun | iSCSI LUN | 直接透通 iSCSI 裝置 |
關鍵設定欄位
在 VM YAML 的 spec.domain.devices.disks 中定義:
| 欄位 | 說明 |
|---|---|
name |
對應 volumes 區塊中的名稱,用來連結後端儲存 |
cdrom / disk |
指定媒體類型 |
bus |
虛擬硬體介面:sata(相容性高但效能差)、virtio(效能好但需驅動)、scsi |
bootOrder |
開機順序,從 1 開始。安裝目標碟必須設定此值,否則安裝程式可能拒絕安裝 |
bus 介面選擇建議
| 用途 | 建議 bus | 原因 |
|---|---|---|
| 系統碟(Linux) | virtio | 效能最佳 |
| 系統碟(Windows) | virtio(需載入驅動)或 sata | Windows 預設不認 virtio,安裝時需要額外載入驅動 |
| 虛擬光碟機(ISO) | sata | 確保安裝程式能正常開機和讀取 |
volumes 區塊範例
spec:
domain:
devices:
disks:
- name: system-disk
disk:
bus: virtio
bootOrder: 1
- name: iso-cdrom
cdrom:
bus: sata
bootOrder: 2
- name: virtio-drivers
cdrom:
bus: sata
volumes:
- name: system-disk
persistentVolumeClaim:
claimName: my-vm-pvc
- name: iso-cdrom
hostDisk:
path: /data/images/os.iso
type: Disk
- name: virtio-drivers
containerDisk:
image: kubevirt/virtio-container-disk
實務建議
- 正式環境用 PVC 或 DataVolume 作為系統碟,確保資料持久性
- 大量佈建場景優先用 DataVolume(自動下載映像 + 建立 PVC)
- 測試環境可以用 containerDisk 快速起 VM,不需要預先準備 PVC
- 安裝 Windows 時,記得準備 virtio 驅動程式的 containerDisk 掛載為光碟機
- 善用 cloud-init 做初始化,避免每次建 VM 都要手動設定
小結
KubeVirt 的儲存機制大量複用了 K8s 的 PVC/ConfigMap/Secret 等概念,但又因為 VM 的特性增加了 containerDisk、HostDisk、DataVolume 和 CloudInit 等專屬功能。與傳統 IaaS(如 OpenStack)相比還有些差距,但已經能滿足小型到中型的虛擬化需求。隨著 KubeVirt 持續發展,這些功能只會越來越完善。

發佈留言