本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

第三方存储支持

SUSE Virtualization 支持使用外部 容器存储接口 (CSI) 驱动程序来配置 root 卷和数据卷。此增强功能允许您选择满足特定要求的驱动程序,例如性能优化或与现有内部存储解决方案的无缝集成。

SUSE Virtualization 团队已验证以下 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 驱动程序具有以下功能:

存储解决方案 虚拟机镜像 虚拟机 root 磁盘 虚拟机数据磁盘 卷导出到虚拟机镜像 虚拟机模板生成器 VM 实时迁移 虚拟机快照 虚拟机备份

Longhorn V2 数据引擎

LVM

NFS

Rook (RADOS 块设备)

对第三方存储的支持等同于使用外部容器存储接口 (CSI) 驱动程序配置 root 卷和数据卷的支持。这意味着存储供应商可以使用SUSE Virtualization验证他们的存储设备,以确保更好的互操作性。

您可以在SUSE Rancher Prime文档中找到与SUSE Virtualization兼容的企业级存储解决方案的信息,该文档可以通过 SUSE客户中心访问。

先决条件

为了使SUSE Virtualization正常运行,请使用支持以下功能的CSI驱动程序:

  • 卷扩展(在线调整大小)

  • 快照创建(卷和虚拟机快照)

  • 克隆(卷和虚拟机克隆)

  • 实时迁移中使用可读写多(RWX)卷

创建一个SUSE Virtualization集群

SUSE Virtualization的操作系统遵循不可变设计,这意味着大多数操作系统文件在重启后会恢复到其预配置状态。因此,在为第三方CSI驱动程序安装SUSE Virtualization集群之前,您可能需要进行额外的配置。

某些CSI驱动程序需要在主机上额外的持久路径。您可以将这些路径添加到os.persistent_state_paths

某些CSI驱动程序需要在主机上额外的软件包。您可以使用os.after_install_chroot_commands安装这些软件包。

升级SUSE Virtualization会导致在`after-install-chroot`阶段对操作系统的更改丢失。您还必须配置`after-upgrade-chroot`以使您的更改在升级中保持持久。在升级SUSE Virtualization之前,请参考 运行时持久更改

安装CSI驱动程序

安装SUSE Virtualization集群完成后,请参考我如何访问kubeconfig文件?以获取集群的kubeconfig。

通过SUSE Virtualization集群的kubeconfig,您可以按照每个CSI驱动程序的安装说明将第三方CSI驱动程序安装到集群中。您还必须参考 CSI 驱动程序文档,以在 SUSE Virtualization 集群中创建 StorageClassVolumeSnapshotClass

配置 SUSE Virtualization 集群

在您可以使用 SUSE Virtualization 的 备份与快照 功能之前,您需要通过 SUSE Virtualization csi-driver-config 设置进行一些基本配置。按照以下步骤进行这些配置:

  1. 登录到 SUSE Virtualization 界面,然后导航到 高级 → 设置

  2. 找到并选择 csi-driver-config,然后选择 ⋮ → 编辑设置 以访问配置选项。

  3. 在设置中将 供应者 设置为第三方 CSI 驱动程序。

  4. 接下来,配置 卷快照类名称。此设置指向用于创建卷快照或虚拟机快照的 VolumeSnapshotClass 的名称。

csi driver config external

备份目前仅适用于以下内容:

  • Longhorn V1 数据引擎

  • Longhorn V2 数据引擎(仅限非 root 磁盘)

如果您使用其他存储提供商,可以跳过 备份卷快照类名称 配置。有关更多信息,请参见 虚拟机备份兼容性

如果 StorageClass 供应者不在 CDI 的 具有默认访问和卷模式的供应者 列表中,您必须使用 cdi.harvesterhci.io/storageProfileVolumeModeAccessModes 注释 StorageClass。没有此注释,Helm 安装可能会失败。查看 CSI 驱动程序的 Helm 图表文档,以获取如何注释 StorageClass 的说明。有关更多信息,请参见 容器化数据导入器 (CDI) 设置

使用 CSI 驱动程序

一旦安装了 CSI 驱动程序并配置了 SUSE Virtualization 集群,就可以在涉及存储管理的任务中使用外部存储解决方案。

虚拟机映像创建

您可以使用外部存储解决方案来存储和管理虚拟机映像。

在使用上传虚拟机映像时,您必须在SUSE Virtualization UI (映像 → 创建)上选择外部存储解决方案的 StorageClass,位于*存储*选项卡上。在以下示例中,StorageClass 为 nfs-csi

create image with nfs csi

SUSE Virtualization将创建的映像存储在外部存储解决方案中。

created image with nfs csi

虚拟机创建

您的虚拟机可以使用外部存储中的 root 卷和数据卷。

在使用创建虚拟机时,您必须在SUSE Virtualization UI (虚拟机 → 创建)的*卷*选项卡上执行以下操作:

  • 选择存储在外部存储解决方案中的虚拟机映像,然后配置所需的设置。

  • 添加数据卷。

various volumes for vm creating

在以下示例中,root 卷使用 NFS 创建,数据卷使用 Longhorn V2 数据引擎创建。

various volumes for vm created

卷创建

您可以在外部存储解决方案中创建卷。

在使用创建卷时,您必须在SUSE Virtualization UI (卷 → 创建)上执行以下操作:

  • 存储类:选择目标StorageClass(例如,nfs-csi)。

  • 卷模式:选择相应的卷模式(例如,文件系统)。

create fs volume

高级主题

存储控制文件

您现在可以使用 CDI API 创建自定义 存储控制文件,以简化数据卷的定义。存储控制文件允许多个数据卷共享相同的配置设置。

以下是一个 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 文档中的 存储控制文件

避免直接更改存储控制文件或 CDI。相反,允许 SUSE Virtualization 控制器通过使用 CDI 注释 来同步和持久化存储控制文件配置。

局限性

  • 备份支持目前仅限于 SUSE Storage 卷。SUSE Virtualization 无法创建外部存储中卷的备份。

  • CDI 中存在一个限制,阻止 SUSE Virtualization 将附加的 PVC 转换为虚拟机映像。在导出外部存储中的卷之前,请确保 PVC 未附加到工作负载。这会防止生成的映像卡在 导出中 状态。

convert pvc to image stuck

NFS CSI 驱动程序部署

只有在 NFS 服务器已安装并运行时,您才能部署 NFS CSI 驱动程序。 如果服务器已经在运行,请检查 squash 选项。您必须禁用远程 root 用户的压缩(no_root_squashno_all_squash),因为 KubeVirt 需要 QEMU UID/GID 以确保卷能够正确同步。

  1. 使用 csi-driver-nfs Helm 图表安装驱动程序。

    $ helm repo add csi-driver-nfs 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
  2. 为 NFS 创建 StorageClass。

    有关参数的更多信息,请参见 Kubernetes NFS CSI 驱动程序文档中的 驱动程序参数:存储类使用

    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 创建虚拟机映像、root 卷和数据卷。

已知问题

1.无限图像下载循环

当图像的 StorageClass 使用 LVM CSI 驱动程序时,图像下载过程会无限循环。此问题与由 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 表示使用 scratch 卷创建的文件系统不足以存储图像数据。CDI 根据目标卷的大小创建 scratch 卷,但会有一些空间因文件系统开销而损失。默认的开销值为 0.055(相当于 5.5%),在大多数情况下是足够的。然而,如果图像大小小于 1 GB 且其虚拟大小非常接近图像大小,则默认开销可能不足。

解决方法是使用以下命令将文件系统开销增加到 20%:

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

一旦增加了文件系统开销,图像应该会被下载。

增加开销值不会影响图像 PVC 大小。图像导入后,scratch 卷会被删除。

相关问题: #7993(请参见 此评论。)

2.多路径支持

multipathd 服务在 SUSE Virtualization 中默认是禁用的。然而,某些第三方 CSI 可能需要您启用该服务。

安装 SUSE Virtualization 后,您可以通过登录到每个集群节点并运行以下命令来启用并启动 multipathd

systemctl enable multipathd
systemctl start multipathd

或者,您可以在每个主机的 /oem 目录中创建一个 SUSE® Rancher Prime: OS Manager CloudInit 文件(例如,/oem/99-start-multipathd.yaml),内容如下:

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

此过程可以通过使用 CloudInit CRD 在 Harvester cluster 中自动化。

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