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
文件,请执行以下步骤:输入以下命令生成
kubeconfig
文件:$ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
保存
kubeconfig
文件后,您可以输入以下示例命令来访问托管集群:$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
5.3.2. 为 OpenShift Virtualization 上托管的 control plane 配置存储
如果没有提供任何高级存储配置,则默认存储类用于 KubeVirt 虚拟机(VM)镜像、KubeVirt Container Storage Interface (CSI)映射和 etcd 卷。
下表列出了基础架构必须提供以支持托管集群中的持久性存储的功能:
基础架构 CSI 供应商 | 托管的集群 CSI 供应商 | 托管的集群功能 | 注 |
---|---|---|---|
任何 RWX |
|
Basic: RWO | 推荐的 |
任何 RWX | Red Hat OpenShift Data Foundation 外部模式 | Red Hat OpenShift Data Foundation 功能集 | |
任何 RWX | 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
创建托管集群后,基础架构存储类会在托管集群中看到。当您在使用其中一个存储类的托管集群中创建持久性卷声明 (PVC) 时,KubeVirt CSI 使用您在集群创建过程中配置的基础架构存储类映射来置备该卷。
kubevirt CSI 仅支持映射一个能够 RWX 访问的基础架构存储类。
下表显示了卷和访问模式如何映射到 KubeVirt CSI 存储类:
基础架构 CSI 功能 | 托管的集群 CSI 功能 | VM 实时迁移支持 | 注 |
---|---|---|---|
RWX: |
仅限 | 支持 |
使用 |
RWO |
RWO | 不支持 | 缺少实时迁移支持会影响更新托管 KubeVirt 虚拟机的底层基础架构集群的能力。 |
RWO |
RWO | 不支持 |
缺少实时迁移支持会影响更新托管 KubeVirt 虚拟机的底层基础架构集群的能力。使用基础架构 |
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=mygroup
和infra-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=mygroup
和infra-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
因此,您会收到使用在 PVC 上托管的虚拟机创建的托管集群。
5.3.2.5. 启用 KubeVirt VM 镜像缓存
您可以使用 KubeVirt VM 镜像缓存来优化集群启动时间和存储使用情况。kubevirt VM 镜像缓存支持使用能够智能克隆和 ReadWriteMany
访问模式的存储类。有关智能克隆的更多信息,请参阅使用智能克隆清理数据卷。
镜像缓存按如下方式工作:
- 虚拟机镜像导入到与托管集群关联的 PVC 中。
- 该 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
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
5.3.3. 使用 hcp CLI 附加 NVIDIA GPU 设备
您可以使用 OpenShift Virtualization 上托管的集群中的 hcp
命令行界面(CLI)将一个或多个 NVIDIA 图形处理单元(GPU)设备附加到节点池。
将 NVIDIA GPU 设备附加到节点池只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
- 您已在 GPU 设备所在的节点上公开 NVIDIA GPU 设备作为资源。如需更多信息,请参阅使用 OpenShift Virtualization 的 NVIDIA GPU Operator。
- 您已将 NVIDIA GPU 设备公开为节点上的 扩展资源,将其分配给节点池。
流程
您可以运行以下命令来在集群创建过程中将 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
要附加多个 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>