5.3. 在 OpenShift Virtualization 中管理托管的 control plane


在 OpenShift Virtualization 上部署托管集群后,您可以完成以下步骤来管理集群。

5.3.1. 访问托管集群

您可以通过直接从资源获取 kubeconfig 文件和 kubeadmin 凭证来访问托管集群,或使用 hcp 命令行界面生成 kubeconfig 文件。

先决条件

要通过直接从资源获取 kubeconfig 文件和凭证来访问托管集群,您必须熟悉托管集群的访问 secret。托管的集群(hosting) 命名空间包含托管的集群资源和访问 secret。托管 control plane 命名空间是托管 control plane 运行的位置。

secret 名称格式如下:

  • kubeconfig secret: <hosted_cluster_namespace>-<name>-admin-kubeconfig (clusters-hypershift-demo-admin-kubeconfig)
  • kubeadmin 密码 secret: <hosted_cluster_namespace>-<name>-kubeadmin-password (clusters-hypershift-demo-kubeadmin-password)

kubeconfig secret 包含一个 Base64 编码的 kubeconfig 字段,您可以解码并保存到要使用以下命令使用的文件中:

$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

kubeadmin 密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。

流程

  • 要使用 hcp CLI 访问托管集群来生成 kubeconfig 文件,请执行以下步骤:

    1. 输入以下命令生成 kubeconfig 文件:

      $ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
    2. 保存 kubeconfig 文件后,您可以输入以下示例命令来访问托管集群:

      $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

5.3.2. 为 OpenShift Virtualization 上托管的 control plane 配置存储

如果没有提供任何高级存储配置,则默认存储类用于 KubeVirt 虚拟机(VM)镜像、KubeVirt Container Storage Interface (CSI)映射和 etcd 卷。

下表列出了基础架构必须提供以支持托管集群中的持久性存储的功能:

表 5.1. 托管集群中的持久性存储模式
基础架构 CSI 供应商托管的集群 CSI 供应商托管的集群功能

任何 RWX Block CSI 供应商

kubevirt-csi

Basic: RWO BlockFile, RWX BlockSnapshot

推荐的

任何 RWX Block CSI 供应商

Red Hat OpenShift Data Foundation 外部模式

Red Hat OpenShift Data Foundation 功能集

 

任何 RWX Block CSI 供应商

Red Hat OpenShift Data Foundation 内部模式

Red Hat OpenShift Data Foundation 功能集

不要使用

5.3.2.1. 映射 KubeVirt CSI 存储类

kubevirt CSI 支持映射一个可以 ReadWriteMany (RWX) 访问的基础架构存储类。您可以在集群创建过程中将基础架构存储类映射到托管的存储类。

流程

  • 要将基础架构存储类映射到托管的存储类,请运行以下命令来使用 --infra-storage-class-mapping 参数:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --infra-storage-class-mapping=<infrastructure_storage_class>/<hosted_storage_class> \ 6
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    <infrastructure_storage_class> 替换为基础架构存储类名称,将 <hosted_storage_class> 替换为托管的集群存储类名称。您可以在 hcp create cluster 命令中多次使用 --infra-storage-class-mapping 参数。

创建托管集群后,基础架构存储类会在托管集群中看到。当您在使用其中一个存储类的托管集群中创建持久性卷声明 (PVC) 时,KubeVirt CSI 使用您在集群创建过程中配置的基础架构存储类映射来置备该卷。

注意

kubevirt CSI 仅支持映射一个能够 RWX 访问的基础架构存储类。

下表显示了卷和访问模式如何映射到 KubeVirt CSI 存储类:

表 5.2. 将 KubeVirt CSI 存储类映射到访问和卷模式
基础架构 CSI 功能托管的集群 CSI 功能VM 实时迁移支持

RWX: BlockFilesystem

仅限 ReadWriteOnce (RWO) BlockFilesystem RWX Block

支持

使用 Block 模式,因为 Filesystem 卷模式会导致托管 Block 模式性能。只有在托管集群是 OpenShift Container Platform 4.16 或更高版本时,才支持 RWX Block 卷模式。

RWO Block 存储

RWO Block 存储或 Filesystem

不支持

缺少实时迁移支持会影响更新托管 KubeVirt 虚拟机的底层基础架构集群的能力。

RWO FileSystem

RWO BlockFilesystem

不支持

缺少实时迁移支持会影响更新托管 KubeVirt 虚拟机的底层基础架构集群的能力。使用基础架构 Filesystem 卷模式会导致托管 Block 模式的性能下降。

5.3.2.2. 映射单个 KubeVirt CSI 卷快照类

您可以使用 KubeVirt CSI 将基础架构卷快照类公开给托管集群。

流程

  • 要将卷快照类映射到托管集群,请在创建托管集群时使用 --infra-volumesnapshot-class-mapping 参数。运行以下命令:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --infra-storage-class-mapping=<infrastructure_storage_class>/<hosted_storage_class> \ 6
      --infra-volumesnapshot-class-mapping=<infrastructure_volume_snapshot_class>/<hosted_volume_snapshot_class> 7
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    <infrastructure_storage_class> 替换为基础架构集群中的存储类。将 <hosted_storage_class> 替换为托管集群中存在的存储类。
    7
    <infrastructure_volume_snapshot_class> 替换为基础架构集群中的卷快照类。将 <hosted_volume_snapshot_class> 替换为托管的集群中的卷快照类。
    注意

    如果不使用 --infra-storage-class-mapping--infra-volumesnapshot-class-mapping 参数,则使用默认存储类和卷快照类创建一个托管集群。因此,您必须在基础架构集群中设置默认存储类和卷快照类。

5.3.2.3. 映射多个 KubeVirt CSI 卷快照类

您可以通过将多个卷快照类分配给特定的组来将多个卷快照类映射到托管集群。基础架构存储类和卷快照类仅在属于同一组时相互兼容。

流程

  • 要将多个卷快照类映射到托管集群,请在创建托管集群时使用 group 选项。运行以下命令:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --infra-storage-class-mapping=<infrastructure_storage_class>/<hosted_storage_class>,group=<group_name> \ 6
      --infra-storage-class-mapping=<infrastructure_storage_class>/<hosted_storage_class>,group=<group_name> \
      --infra-storage-class-mapping=<infrastructure_storage_class>/<hosted_storage_class>,group=<group_name> \
      --infra-volumesnapshot-class-mapping=<infrastructure_volume_snapshot_class>/<hosted_volume_snapshot_class>,group=<group_name> \ 7
      --infra-volumesnapshot-class-mapping=<infrastructure_volume_snapshot_class>/<hosted_volume_snapshot_class>,group=<group_name>
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    <infrastructure_storage_class> 替换为基础架构集群中的存储类。将 <hosted_storage_class> 替换为托管集群中存在的存储类。使用组名称替换 <group_name>。例如: infra-storage-class-mygroup/hosted-storage-class-mygroup,group=mygroupinfra-storage-class-mymap/hosted-storage-class-mymap,group=mymap
    7
    <infrastructure_volume_snapshot_class> 替换为基础架构集群中的卷快照类。将 <hosted_volume_snapshot_class> 替换为托管的集群中的卷快照类。例如: infra-vol-snap-mygroup/hosted-vol-snap-mygroup,group=mygroupinfra-vol-snap-mymap/hosted-vol-snap-mymap,group=mymap.

5.3.2.4. 配置 KubeVirt VM 根卷

在集群创建时,您可以使用 --root-volume-storage-class 参数配置用于托管 KubeVirt 虚拟机根卷的存储类。

流程

  • 要为 KubeVirt 虚拟机设置自定义存储类和卷大小,请运行以下命令:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --root-volume-storage-class <root_volume_storage_class> \ 6
      --root-volume-size <volume_size> 7
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    指定托管 KubeVirt VM root 卷的存储类的名称,如 ocs-storagecluster-ceph-rbd
    7
    指定卷大小,例如 64

    因此,您会收到使用在 PVC 上托管的虚拟机创建的托管集群。

5.3.2.5. 启用 KubeVirt VM 镜像缓存

您可以使用 KubeVirt VM 镜像缓存来优化集群启动时间和存储使用情况。kubevirt VM 镜像缓存支持使用能够智能克隆和 ReadWriteMany 访问模式的存储类。有关智能克隆的更多信息,请参阅使用智能克隆清理数据卷

镜像缓存按如下方式工作:

  1. 虚拟机镜像导入到与托管集群关联的 PVC 中。
  2. 该 PVC 的唯一克隆是为将作为 worker 节点添加到集群中的每个 KubeVirt 虚拟机创建的唯一克隆。

镜像缓存通过只需要单个镜像导入来减少虚拟机启动时间。当存储类支持写时复制克隆时,它可以进一步减少集群存储使用。

流程

  • 要启用镜像缓存,在集群创建过程中,运行以下命令使用 --root-volume-cache-strategy=PVC 参数:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --root-volume-cache-strategy=PVC 6
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    为镜像缓存指定一个策略,如 PVC

5.3.2.6. kubevirt CSI 存储安全性和隔离

kubevirt Container Storage Interface (CSI)将底层基础架构集群的存储功能扩展到托管集群。CSI 驱动程序使用以下安全限制来确保对基础架构存储类和托管集群的安全和隔离访问:

  • 托管集群的存储与其他托管集群隔离。
  • 托管集群中的 worker 节点无法直接访问基础架构集群。托管的集群只能通过受控的 KubeVirt CSI 接口在基础架构集群中置备存储。
  • 托管的集群无法访问 KubeVirt CSI 集群控制器。因此,托管集群无法访问没有与托管集群关联的基础架构集群中的任意存储卷。KubeVirt CSI 集群控制器在托管的 control plane 命名空间中的 pod 中运行。
  • KubeVirt CSI 集群控制器的基于角色的访问控制(RBAC)将持久性卷声明(PVC)限制为托管的 control plane 命名空间。因此,KubeVirt CSI 组件无法从其他命名空间中访问存储。

5.3.2.7. 配置 etcd 存储

在集群创建时,您可以使用 --etcd-storage-class 参数配置用于托管 etcd 数据的存储类。

流程

  • 要为 etcd 配置存储类,请运行以下命令:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ 1
      --node-pool-replicas <worker_node_count> \ 2
      --pull-secret <path_to_pull_secret> \ 3
      --memory <memory> \ 4
      --cores <cpu> \ 5
      --etcd-storage-class=<etcd_storage_class_name> 6
    1
    指定托管集群的名称,如 example
    2
    指定 worker 数,如 2
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为内存指定一个值,如 8Gi
    5
    为 CPU 指定一个值,例如 2
    6
    指定 etcd 存储类名称,如 lvm-storageclass。如果没有提供 --etcd-storage-class 参数,则使用默认存储类。

5.3.3. 使用 hcp CLI 附加 NVIDIA GPU 设备

您可以使用 OpenShift Virtualization 上托管的集群中的 hcp 命令行界面(CLI)将一个或多个 NVIDIA 图形处理单元(GPU)设备附加到节点池。

重要

将 NVIDIA GPU 设备附加到节点池只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

先决条件

流程

  • 您可以运行以下命令来在集群创建过程中将 GPU 设备附加到节点池中:

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \1
      --node-pool-replicas <worker_node_count> \2
      --pull-secret <path_to_pull_secret> \3
      --memory <memory> \4
      --cores <cpu> \5
      --host-device-name="<gpu_device_name>,count:<value>" 6
    1
    指定托管集群的名称,如 example
    2
    指定 worker 计数,如 3
    3
    指定 pull secret 的路径,例如 /user/name/pullsecret
    4
    为 memory 指定一个值,如 16Gi
    5
    为 CPU 指定一个值,例如 2
    6
    指定 GPU 设备名称和计数,如 --host-device-name="nvidia-a100,count:2"--host-device-name 参数取来自基础架构节点的 GPU 设备名称和可选计数,它代表您要附加到每个节点池中的每个虚拟机(VM)的 GPU 设备数量。默认计数为 1。例如,如果您将 2 个 GPU 设备附加到 3 个节点池副本,节点池中的所有 3 个虚拟机都会附加到 2 个 GPU 设备。
    提示

    您可以多次使用 --host-device-name 参数来附加不同类型的多个设备。

5.3.4. 使用 NodePool 资源附加 NVIDIA GPU 设备

您可以通过在 NodePool 资源中配置 nodepool.spec.platform.kubevirt.hostDevices 字段,将一个或多个 NVIDIA 图形处理单元(GPU)设备附加到节点池。

重要

将 NVIDIA GPU 设备附加到节点池只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

流程

  • 将一个或多个 GPU 设备附加到节点池:

    • 要附加单个 GPU 设备,请使用以下示例配置 NodePool 资源:

      apiVersion: hypershift.openshift.io/v1beta1
      kind: NodePool
      metadata:
        name: <hosted_cluster_name> 1
        namespace: <hosted_cluster_namespace> 2
      spec:
        arch: amd64
        clusterName: <hosted_cluster_name>
        management:
          autoRepair: false
          upgradeType: Replace
        nodeDrainTimeout: 0s
        nodeVolumeDetachTimeout: 0s
        platform:
          kubevirt:
            attachDefaultNetwork: true
            compute:
              cores: <cpu> 3
              memory: <memory> 4
            hostDevices: 5
            - count: <count> 6
              deviceName: <gpu_device_name> 7
            networkInterfaceMultiqueue: Enable
            rootVolume:
              persistent:
                size: 32Gi
              type: Persistent
          type: KubeVirt
        replicas: <worker_node_count> 8
      1
      指定托管集群的名称,如 example
      2
      指定托管集群命名空间的名称,如集群。
      3
      为 CPU 指定一个值,例如 2
      4
      为 memory 指定一个值,如 16Gi
      5
      hostDevices 字段定义您可以附加到节点池的不同类型的 GPU 设备列表。
      6
      指定您要附加到节点池中的每个虚拟机(VM)的 GPU 设备数量。例如,如果您将 2 个 GPU 设备附加到 3 个节点池副本,节点池中的所有 3 个虚拟机都会附加到 2 个 GPU 设备。默认计数为 1
      7
      指定 GPU 设备名称,如nvidia-a100
      8
      指定 worker 计数,如 3
    • 要附加多个 GPU 设备,请使用以下示例配置 NodePool 资源:

      apiVersion: hypershift.openshift.io/v1beta1
      kind: NodePool
      metadata:
        name: <hosted_cluster_name>
        namespace: <hosted_cluster_namespace>
      spec:
        arch: amd64
        clusterName: <hosted_cluster_name>
        management:
          autoRepair: false
          upgradeType: Replace
        nodeDrainTimeout: 0s
        nodeVolumeDetachTimeout: 0s
        platform:
          kubevirt:
            attachDefaultNetwork: true
            compute:
              cores: <cpu>
              memory: <memory>
            hostDevices:
            - count: <count>
              deviceName: <gpu_device_name>
            - count: <count>
              deviceName: <gpu_device_name>
            - count: <count>
              deviceName: <gpu_device_name>
            - count: <count>
              deviceName: <gpu_device_name>
            networkInterfaceMultiqueue: Enable
            rootVolume:
              persistent:
                size: 32Gi
              type: Persistent
          type: KubeVirt
        replicas: <worker_node_count>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.