← 返回上一頁
Kubernetes

KubeVirt 儲存完全指南:在 Kubernetes 上為虛擬機掛載各類儲存空間

本頁目錄

前言

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 持續發展,這些功能只會越來越完善。

參考連結

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料