5.3. 在 OpenShift Virtualization 中管理托管的 control plane
在 OpenShift Virtualization 上部署托管集群后,您可以完成以下步骤来管理集群。
5.3.1. 访问托管集群 复制链接链接已复制到粘贴板!
您可以通过直接从资源获取 kubeconfig 文件和 kubeadmin 凭证来访问托管集群,或使用 hcp 命令行界面生成 kubeconfig 文件。
先决条件
要通过直接从资源获取 kubeconfig 文件和凭证来访问托管集群,您必须熟悉托管集群的访问 secret。托管的集群(hosting) 命名空间包含托管的集群资源和访问 secret。托管 control plane 命名空间是托管 control plane 运行的位置。
secret 名称格式如下:
-
kubeconfigsecret:<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 服务器或控制台。
流程
要使用
hcpCLI 访问托管集群来生成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. 为托管集群启用节点自动扩展 复制链接链接已复制到粘贴板!
当托管集群和备用代理有更多容量时,您可以启用自动扩展来安装新的 worker 节点。
流程
要启用自动扩展,请输入以下命令:
$ oc -n <hosted_cluster_namespace> patch nodepool <hosted_cluster_name> \ --type=json \ -p '[{"op": "remove", "path": "/spec/replicas"},{"op":"add", "path": "/spec/autoScaling", "value": { "max": 5, "min": 2 }}]'注意在示例中,最少的节点数量为 2,最大值为 5。添加的最大节点数可能会被您的平台绑定。例如,如果您使用 Agent 平台,则最大节点数量由可用代理数量绑定。
创建需要新节点的工作负载。
使用以下示例创建一个包含工作负载配置的 YAML 文件:
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: reversewords name: reversewords namespace: default spec: replicas: 40 selector: matchLabels: app: reversewords strategy: {} template: metadata: creationTimestamp: null labels: app: reversewords spec: containers: - image: quay.io/mavazque/reversewords:latest name: reversewords resources: requests: memory: 2Gi status: {}-
将文件保存为
workload-config.yaml。 输入以下命令应用 YAML:
$ oc apply -f workload-config.yaml
输入以下命令提取
admin-kubeconfigsecret:$ oc extract -n <hosted_cluster_namespace> \ secret/<hosted_cluster_name>-admin-kubeconfig \ --to=./hostedcluster-secrets --confirm输出示例
hostedcluster-secrets/kubeconfig您可以输入以下命令来检查新节点是否处于
Ready状态:$ oc --kubeconfig ./hostedcluster-secrets get nodes要删除节点,请输入以下命令删除工作负载:
$ oc --kubeconfig ./hostedcluster-secrets -n <namespace> \ delete deployment <deployment_name>等待几分钟,无需额外容量。在 Agent 平台上,代理已停用,可以被重复使用。您可以输入以下命令确认节点已被删除:
$ oc --kubeconfig ./hostedcluster-secrets get nodes注意对于 IBM Z® 代理,如果您在 Processor Resource/Systems Manager (PR/SM) 模式中使用 OSA 网络设备,则不支持自动扩展。您必须手动删除旧代理并扩展节点池,因为在缩减过程中新代理加入。
如果没有提供任何高级存储配置,则默认存储类用于 KubeVirt 虚拟机(VM)镜像、KubeVirt Container Storage Interface (CSI)映射和 etcd 卷。
下表列出了基础架构必须提供以支持托管集群中的持久性存储的功能:
| 基础架构 CSI 供应商 | 托管的集群 CSI 供应商 | 托管的集群功能 |
|---|---|---|
|
任何 RWX |
|
|
|
任何 RWX | Red Hat OpenShift Data Foundation |
Red Hat OpenShift Data Foundation 功能集。外部模式具有较小的空间,并使用独立的 Red Hat Ceph Storage。内部模式占用较大的空间,但自我包含并适用于需要扩展的功能(如 RWX |
OpenShift Virtualization 在托管集群上处理存储,特别是帮助其要求限制为块存储的客户。
5.3.3.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.3.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.3.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.3.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.3.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=PVC6
5.3.3.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.3.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.4. 使用 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
- 为内存指定一个值,如
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.5. 使用 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>
5.3.6. 驱除 KubeVirt 虚拟机 复制链接链接已复制到粘贴板!
如果 KubeVirt 虚拟机(VM)无法实时迁移,比如当您使用 GPU 透传时,虚拟机必须与托管集群的 NodePool 资源同时被驱除。否则,可以在不从工作负载排空的情况下关闭计算节点。当您升级 OpenShift Virtualization Operator 时,也会发生这种情况。要实现同步的重启,您可以在 hyperconverged 资源上设置 evictionStrategy 参数,以确保只有从工作负载排空的虚拟机才会重启。
流程
要了解更多有关
hyperconverged资源以及evictionStrategy参数允许的值的信息,请输入以下命令:$ oc explain hyperconverged.spec.evictionStrategy输入以下命令来修补
hyperconverged资源:$ oc -n openshift-cnv patch hyperconverged kubevirt-hyperconverged \ --type=merge \ -p '{"spec": {"evictionStrategy": "External"}}'输入以下命令来修补工作负载更新策略和工作负载更新方法:
$ oc -n openshift-cnv patch hyperconverged kubevirt-hyperconverged \ --type=merge \ -p '{"spec": {"workloadUpdateStrategy": {"workloadUpdateMethods": ["LiveMigrate","Evict"]}}}'通过应用此补丁,您可以指定应尽可能实时迁移的虚拟机,且只有无法实时迁移的虚拟机应该被驱除。
验证
输入以下命令检查 patch 命令是否已正确应用:
$ oc -n openshift-cnv get hyperconverged kubevirt-hyperconverged -ojsonpath='{.spec.evictionStrategy}'输出示例
External
5.3.7. 使用 topologySpreadConstraint 来分散节点池虚拟机 复制链接链接已复制到粘贴板!
默认情况下,由节点池创建的 KubeVirt 虚拟机(VM)调度到具有运行虚拟机容量的任何可用节点上。默认情况下,topologySpreadConstraint 约束被设置为在多个节点上调度虚拟机。
在某些情况下,节点池虚拟机可能在同一节点上运行,这可能导致可用性问题。为了避免在单个节点上分布虚拟机,请使用 descheduler 来持续遵循 topologySpreadConstraint 约束,将虚拟机分散到多个节点上。
先决条件
- 已安装 Kube Descheduler Operator。如需更多信息,请参阅"安装 descheduler"。
流程
输入以下命令打开
KubeDescheduler自定义资源(CR),然后修改KubeDeschedulerCR 以使用SoftTopologyAndDuplicates和KubeVirtRelieveAndMigrate配置集,以便维护topologySpreadConstraint约束设置。名为
cluster的KubeDeschedulerCR 在openshift-kube-descheduler-operator命名空间中运行。$ oc edit kubedescheduler cluster -n openshift-kube-descheduler-operatorKubeDescheduler配置示例apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: mode: Automatic managementState: Managed deschedulingIntervalSeconds: 301 profiles: - SoftTopologyAndDuplicates2 - KubeVirtRelieveAndMigrate3 profileCustomizations: devDeviationThresholds: AsymmetricLow devActualUtilizationProfile: PrometheusCPUCombined # ...