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. 为托管集群启用节点自动扩展

当托管集群和备用代理有更多容量时,您可以启用自动扩展来安装新的 worker 节点。

流程

  1. 要启用自动扩展,请输入以下命令:

    $ 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 平台,则最大节点数量由可用代理数量绑定。

  2. 创建需要新节点的工作负载。

    1. 使用以下示例创建一个包含工作负载配置的 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: {}
    2. 将文件保存为 workload-config.yaml
    3. 输入以下命令应用 YAML:

      $ oc apply -f workload-config.yaml
  3. 输入以下命令提取 admin-kubeconfig secret:

    $ oc extract -n <hosted_cluster_namespace> secret/<hosted_cluster_name>-admin-kubeconfig --to=./hostedcluster-secrets --confirm

    输出示例

    hostedcluster-secrets/kubeconfig

  4. 您可以输入以下命令来检查新节点是否处于 Ready 状态:

    $ oc --kubeconfig ./hostedcluster-secrets get nodes
  5. 要删除节点,请输入以下命令删除工作负载:

    $ oc --kubeconfig ./hostedcluster-secrets -n <namespace> delete deployment <deployment_name>
  6. 等待几分钟,无需额外容量。在 Agent 平台上,代理已停用,可以被重复使用。您可以输入以下命令确认节点已被删除:

    $ oc --kubeconfig ./hostedcluster-secrets get nodes
注意

对于 IBM Z 代理,计算节点只适用于带有 KVM 代理的 IBM Z。对于 z/VM 和 LPAR,您必须手动删除计算节点。

代理只能对带有 KVM 的 IBM Z 重新使用。对于 z/VM 和 LPAR,需要重新创建代理以将其用作计算节点。

5.3.3. 为 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.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
    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.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=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.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
    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.3.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.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
    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.4. 使用 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
    为内存指定一个值,如 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
      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
      指定 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.