×

访问托管集群

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

先决条件

要通过直接从资源获取kubeconfig文件和凭据来访问托管集群,您必须熟悉托管集群的访问密钥。托管集群(托管)命名空间包含托管集群资源和访问密钥。托管控制平面命名空间是托管控制平面运行的位置。

密钥名称格式如下所示

  • kubeconfig 密钥:<托管集群命名空间>-<名称>-admin-kubeconfig (clusters-hypershift-demo-admin-kubeconfig)

  • kubeadmin 密码密钥:<托管集群命名空间>-<名称>-kubeadmin-password (clusters-hypershift-demo-kubeadmin-password)

kubeconfig 密钥包含一个 Base64 编码的kubeconfig字段,您可以将其解码并保存到文件中,然后使用以下命令:

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

kubeadmin密码密钥也是 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

为 OpenShift Virtualization 上的托管控制平面配置存储

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

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

表 1. 托管集群中的持久性存储模式
基础架构 CSI 提供程序 托管集群 CSI 提供程序 托管集群功能 备注

任何 RWX Block CSI 提供程序

kubevirt-csi

基本: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 功能集

不要使用

映射 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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/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 存储类

表 2. 将 KubeVirt CSI 存储类映射到访问和卷模式
基础设施 CSI 功能 托管集群 CSI 功能 虚拟机实时迁移支持 备注

RWX:BlockFilesystem

ReadWriteOnce (RWO) BlockFilesystem RWX Block 仅限

支持

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

RWO Block 存储

RWO Block 存储或 Filesystem

不支持

缺乏实时迁移支持会影响更新托管 KubeVirt VM 的底层基础设施集群的能力。

RWO FileSystem

RWO BlockFilesystem

不支持

缺乏实时迁移支持会影响更新托管 KubeVirt VM 的底层基础设施集群的能力。使用基础设施Filesystem卷模式会导致托管Block模式性能下降。

映射单个 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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/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参数,则将使用默认存储类和卷快照类创建托管集群。因此,您必须在基础设施集群中设置默认存储类和卷快照类。

映射多个 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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/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

配置 KubeVirt VM 根卷

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

步骤
  • 要为 KubeVirt VM 设置自定义存储类和卷大小,请运行以下命令

    $ 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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/user/name/pullsecret
    4 指定内存的值,例如8Gi
    5 指定 CPU 的值,例如2
    6 指定存储类的名称以托管 KubeVirt VM 根卷,例如ocs-storagecluster-ceph-rbd
    7 指定卷大小,例如64

    结果,您将获得一个托管集群,该集群上的 VM 托管在 PVC 上。

启用 KubeVirt VM 镜像缓存

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

镜像缓存的工作原理如下

  1. VM 镜像被导入到与托管集群关联的 PVC。

  2. 为每个作为工作节点添加到集群的 KubeVirt VM 创建该 PVC 的唯一克隆。

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

步骤
  • 要启用镜像缓存,在集群创建期间,请使用--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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/user/name/pullsecret
    4 指定内存的值,例如8Gi
    5 指定 CPU 的值,例如2
    6 指定镜像缓存的策略,例如PVC

KubeVirt CSI 存储安全性和隔离

KubeVirt 容器存储接口 (CSI) 将底层基础设施集群的存储功能扩展到托管集群。CSI 驱动程序使用以下安全约束来确保对基础设施存储类和托管集群的安全和隔离访问

  • 托管集群的存储与其他托管集群隔离。

  • 托管集群中的工作节点没有对基础设施集群的直接 API 访问权限。托管集群只能通过受控的 KubeVirt CSI 接口在基础设施集群上配置存储。

  • 托管集群无权访问 KubeVirt CSI 集群控制器。因此,托管集群无法访问与托管集群无关的基础设施集群上的任意存储卷。KubeVirt CSI 集群控制器在托管控制平面命名空间中的 Pod 中运行。

  • KubeVirt CSI 集群控制器的基于角色的访问控制 (RBAC) 将持久卷声明 (PVC) 访问权限限制为仅托管控制平面命名空间。因此,KubeVirt CSI 组件无法访问其他命名空间中的存储。

配置 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 指定工作程序数量,例如2
    3 指定您的拉取密钥的路径,例如/user/name/pullsecret
    4 指定内存的值,例如8Gi
    5 指定 CPU 的值,例如2
    6 指定 etcd 存储类名称,例如lvm-storageclass。如果您没有提供--etcd-storage-class参数,则使用默认存储类。

使用 hcp CLI 附加 NVIDIA GPU 设备

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

将 NVIDIA GPU 设备附加到节点池仅是技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

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

先决条件
步骤
  • 您可以在集群创建期间通过运行以下命令将 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 指定工作节点数量,例如,3
    3 指定您的拉取密钥的路径,例如/user/name/pullsecret
    4 指定内存值,例如,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 参数来附加多种类型的多个设备。

使用 NodePool 资源附加 NVIDIA GPU 设备

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

将 NVIDIA GPU 设备附加到节点池仅是技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

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

步骤
  • 将一个或多个 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 指定托管集群命名空间的名称,例如,clusters
      3 指定 CPU 的值,例如2
      4 指定内存值,例如,16Gi
      5 hostDevices 字段定义您可以附加到节点池的不同类型的 GPU 设备列表。
      6 指定要附加到节点池中每个虚拟机 (VM) 的 GPU 设备数量。例如,如果您将 2 个 GPU 设备附加到 3 个节点池副本,则节点池中的所有 3 个虚拟机都将附加到 2 个 GPU 设备。默认计数为 1
      7 指定 GPU 设备名称,例如,nvidia-a100
      8 指定工作节点数量,例如,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>