第三方存储支持

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 集群中创建 StorageClass 和 VolumeSnapshotClass。

配置 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_squash 或 no_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