跳至主要内容

第三方儲存支援

自 v1.5.0 版本起提供

Harvester 現在支援使用外部 Container Storage Interface (CSI) 驅動程式來供應 (provision) 根卷冊 (root volumes) 和資料卷冊 (data volumes)。這項增強功能允許您選擇符合特定需求的驅動程式,例如效能最佳化或與現有內部儲存解決方案的無縫整合。

Harvester 工程團隊已驗證以下 CSI 驅動程式:

  • Longhorn V2 資料引擎:driver.longhorn.io
  • LVM:lvm.driver.harvesterhci.io
  • NFS:nfs.csi.k8s.io
  • Rook (RADOS 區塊裝置):rook-ceph.rbd.csi.ceph.com

這些經過驗證的 CSI 驅動程式具備以下功能:

儲存解決方案VM 映像檔VM Rook 磁碟VM 資料磁碟匯出卷冊至 VM 映像檔VM 範本產生器VM 線上移轉VM 快照VM 備份
Longhorn v2 資料引擎✔✔✔✔✔✔✖✖
LVM✔✔✔✔✔✖✔✖
NFS✔✔✔✔✔✔✖✖
Rook (RBD)✔✔✔✔✔✔✔✖
備註

對第三方儲存的支援,等同於支援使用外部容器儲存介面 (CSI) 驅動程式來供應根卷冊和資料卷冊。這意味著儲存供應商可以使用 Harvester 驗證其儲存設備,以確保更高的互操作性。

Harvester 工程團隊僅專門驗證內部開發的儲存解決方案以及選定的開源專案。您可以在 SUSE Rancher Prime 文件中找到經認證與 Harvester 相容的企業級儲存解決方案資訊,該文件可透過 SUSE Customer Center 存取。

先決條件​

為了讓 Harvester 運作良好,請使用支援以下功能的 CSI 驅動程式:

  • 卷冊擴充(線上調整大小)
  • 快照建立(卷冊和虛擬機器快照)
  • 複製(卷冊和虛擬機器複製)
  • 使用 Read-Write-Many (RWX) 卷冊以進行 線上移轉 (Live Migration)

建立 Harvester 叢集​

Harvester 的作業系統遵循不可變 (immutable) 設計,這意味著大多數 OS 檔案在重新啟動後會恢復到預先設定的狀態。因此,在安裝用於第三方 CSI 驅動程式的 Harvester 叢集之前,您可能需要執行額外的設定。

某些 CSI 驅動程式需要在主機上設定額外的持久路徑。您可以將這些路徑新增至 os.persistent_state_paths。

某些 CSI 驅動程式需要在主機上安裝額外的軟體套件。您可以使用 os.after_install_chroot_commands 安裝這些套件。

備註

升級 Harvester 會導致 after-install-chroot 階段對 OS 所做的變更遺失。您必須同時設定 after-upgrade-chroot,以讓您的變更在升級後持續存在。在升級 Harvester 之前,請參閱 執行階段持久變更 (Runtime persistent changes)。

安裝 CSI 驅動程式​

Harvester 叢集安裝完成後,請參閱 如何存取 Harvester 叢集的 kubeconfig 檔案? 以取得叢集的 kubeconfig。

有了 Harvester 叢集的 kubeconfig,您可以按照每個 CSI 驅動程式的安裝說明,將第三方 CSI 驅動程式安裝到叢集中。您還必須參考 CSI 驅動程式文件,在 Harvester 叢集中建立 StorageClass 和 VolumeSnapshotClass。

設定 Harvester 叢集​

在使用 Harvester 的 備份與快照 (Backup & Snapshot) 功能之前,您需要透過 Harvester csi-driver-config 設定進行一些必要的配置。請按照以下步驟進行設定:

備註

備份功能目前僅適用於 Longhorn v1 資料引擎。如果您使用其他儲存供應商,可以跳過 Backup VolumeSnapshot Class Name 的設定。

如需更多資訊,請參閱 VM 備份相容性。

備註

如果 StorageClass 供應程式 (provisioner) 不在 CDI 的 具有預設存取和卷冊模式的供應程式 清單中,您必須為 StorageClass 加上註解 (annotate):cdi.harvesterhci.io/storageProfileVolumeModeAccessModes。如果沒有此註解,Helm 安裝可能會失敗。請查看 CSI 驅動程式的 Helm chart 文件,以取得有關如何為 StorageClass 加註解的說明。

如需更多資訊,請參閱 Containerized Data Importer (CDI) 設定

  1. 登入 Harvester UI,然後導覽至 Advanced > Settings。
  2. 找到並選取 csi-driver-config,然後選取 ⋮ > Edit Setting 以存取設定選項。
  3. 在設定中將 Provisioner 設定為第三方 CSI 驅動程式。
  4. 接著,設定 Volume Snapshot Class Name。此設定指向用於建立卷冊快照或 VM 快照的 VolumeSnapshotClass 名稱。

csi-driver-config-external

使用 CSI 驅動程式​

安裝 CSI 驅動程式並設定 Harvester 叢集後,即可在涉及儲存管理的任務中使用外部儲存解決方案。

虛擬機器映像檔建立​

您可以使用外部儲存解決方案來儲存和管理虛擬機器映像檔。

當使用 Harvester UI (Image > Create) 上傳虛擬機器映像檔 時,您必須在 Storage 頁籤上選擇外部儲存解決方案的 StorageClass。在以下範例中,StorageClass 為 nfs-csi。

create-image-with-nfs-csi

Harvester 會將建立的映像檔儲存在外部儲存解決方案中。

created-image-with-nfs-csi

虛擬機器建立​

您的虛擬機器可以使用外部儲存中的根卷冊和資料卷冊。

當使用 Harvester UI (Virtual Machine > Create) 建立虛擬機器 時,您必須在 Volumes 頁籤上執行以下動作:

  • 選擇儲存在外部儲存解決方案中的虛擬機器映像檔,然後進行所需的設定。
  • 新增資料卷冊。

various-volumes-for-vm-creating

在以下範例中,根卷冊使用 NFS 建立,而資料卷冊使用 Longhorn V2 資料引擎建立。

various-volumes-for-vm-created

卷冊建立​

您可以在外部儲存解決方案中建立卷冊。

當使用 Harvester UI (Volumes > Create) 建立卷冊 時,您必須執行以下動作:

  • Storage Class:選擇目標 StorageClass,例如 nfs-csi。
  • Volume Mode:選擇相應的卷冊模式,例如 nfs-csi 對應 Filesystem。

create-fs-volume

進階主題​

儲存設定檔 (Storage Profiles)​

您現在可以使用 CDI API 建立自訂 儲存設定檔 (Storage Profiles),以簡化資料卷冊的定義。儲存設定檔允許以多個資料卷冊共用相同的供應程式設定。

以下是一個 LVM 儲存設定檔的範例:

apiVersion: cdi.kubevirt.io/v1beta1
kind: StorageProfile
metadata:
name: lvm-node-1-striped
spec:
claimPropertySets:
- accessModes:
- ReadWriteOnce
volumeMode: Block
status:
claimPropertySets:
- accessModes:
- ReadWriteOnce
volumeMode: Block
cloneStrategy: snapshot
dataImportCronSourceFormat: pvc
provisioner: lvm.driver.harvesterhci.io
snapshotClass: lvm-snapshot
storageClass: lvm-node-1-striped

如需更多資訊,請參閱 CDI 文件中的 Storage Profiles。

您可以定義上述欄位以覆寫狀態 (status) 中顯示的預設設定。

警告

請避免直接變更儲存設定檔或 CDI。相反地,應透過使用 CDI 註解 (CDI annotations),讓 Harvester 控制器同步並持久化儲存設定檔的配置。

限制​

  • 備份支援目前僅限於 Longhorn V1 資料引擎卷冊。Harvester 無法建立外部儲存中卷冊的備份。

  • CDI 存在一項限制,導致 Harvester 無法將已掛接的 PVC 轉換為虛擬機器映像檔。在匯出外部儲存中的卷冊之前,請確保 PVC 未掛接至工作負載。這可防止產生的映像檔卡在 Exporting 狀態。

convert-pvc-to-image-stuck

如何部署 NFS CSI 驅動程式​

備註

只有在 NFS 伺服器已安裝並執行時,您才能部署 NFS CSI 驅動程式。

如果伺服器已在執行,請檢查 squash 選項。您必須停用遠端 root 使用者的 squashing(no_root_squash 或 no_all_squash),因為 KubeVirt 需要 QEMU UID/GID 來確保卷冊可以正確同步。

  1. 使用 csi-driver-nfs Helm chart 安裝驅動程式。
$ helm repo add csi-driver-nfs [https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts](https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts)
$ helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.10.0
  1. 建立 NFS 的 StorageClass。

有關參數的更多資訊,請參閱 Kubernetes NFS CSI Driver 文件中的 驅動程式參數:Storage Class 用法。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: <your-nfs-server-ip>
share: <your-nfs-share>
# csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
# csi.storage.k8s.io/provisioner-secret-name: "mount-options"
# csi.storage.k8s.io/provisioner-secret-namespace: "default"
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- nfsvers=4.2

建立後,您可以使用該 StorageClass 來建立虛擬機器映像檔、根卷冊和資料卷冊。

參考資料​

已知問題​

1. 映像檔下載無限迴圈​

當映像檔的 StorageClass 使用 LVM CSI 驅動程式時,映像檔下載過程會無限循環。此問題與暫存卷冊 (scratch volume) 有關,該卷冊由 CDI 建立,用於暫時儲存映像檔資料。當您的環境中存在此問題時,您可能會在 importer-prime-xxx pod 日誌中發現以下錯誤訊息:

E0418 01:59:51.843459       1 util.go:98] Unable to write file from dataReader: write /scratch/tmpimage: no space left on device
E0418 01:59:51.861235 1 data-processor.go:243] write /scratch/tmpimage: no space left on device
unable to write to file
kubevirt.io/containerized-data-importer/pkg/importer.streamDataToFile
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/pkg/importer/util.go:101
kubevirt.io/containerized-data-importer/pkg/importer.(*HTTPDataSource).Transfer
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/pkg/importer/http-datasource.go:162
kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).initDefaultPhases.func2
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/pkg/importer/data-processor.go:173
kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessDataWithPause
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/pkg/importer/data-processor.go:240
kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessData
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/pkg/importer/data-processor.go:149
main.handleImport
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/cmd/cdi-importer/importer.go:188
main.main
/home/abuild/rpmbuild/BUILD/go/src/kubevirt.io/containerized-data-importer/cmd/cdi-importer/importer.go:148
runtime.main

訊息 no space left on device 表示使用暫存卷冊建立的檔案系統不足以儲存映像檔資料。CDI 會根據目標卷冊的大小建立暫存卷冊,但部分空間會因檔案系統的額外負荷 (overhead) 而損失。預設的額外負荷值為 0.055(相當於 5.5%),這在大多數情況下是足夠的。但是,如果映像檔大小小於 1 GB 且其虛擬大小非常接近映像檔實際大小,則預設的額外負荷很可能不足。

解決方法是使用以下指令將檔案系統額外負荷增加到 20%:

# kubectl patch cdi cdi --type=merge -p '{"spec":{"config":{"filesystemOverhead":{"global":"0.2"}}}}'

增加檔案系統額外負荷後,映像檔應可順利下載。

備註

增加額外負荷值不會影響映像檔 PVC 的大小。暫存卷冊會在映像檔匯入後被刪除。

相關議題:#7993 (請參閱此 評論。)

2. 多路徑 (Multipath) 支援​

自 v1.4.3 版本起提供

某些第三方 CSI 可能需要啟用多路徑。

預設情況下,Harvester 中的 multipathd 是停用的。使用者可以在安裝後透過登入個別節點並執行以下指令來啟用它:

systemctl enable multipathd
systemctl start multipathd

這也可以透過放置一個 elemental cloud-init 檔案(例如 /oem/99-start-multipathd.yaml)來執行,內容如下:

stages:
default:
- name: "start multipathd"
systemctl:
enable:
- multipathd
start:
- multipathd

希望進一步自動化此操作的使用者可以利用 CloudInit CRD 將相同的指令套用到一組主機:

apiVersion: node.harvesterhci.io/v1beta1
kind: CloudInit
metadata:
name: start-mutlitpathd
spec:
matchSelector:
harvesterhci.io/managed: "true"
filename: 99-start-mutlitpathd
contents: |
stages:
default:
- name: "start multipathd"
systemctl:
enable:
- multipathd
start:
- multipathd
paused: false