5.2. 为 OpenShift Virtualization 组件指定节点


裸机节点上虚拟机(VM)的默认调度是适当的。另外,您可以通过配置节点放置规则来指定您要部署 OpenShift Virtualization Operator、工作负载和控制器的节点。

注意

在安装 OpenShift Virtualization 后,您可以为一些组件配置节点放置规则,但如果要为工作负载配置节点放置规则,则虚拟机将无法被存在。

5.2.1. 关于 OpenShift Virtualization 组件的节点放置规则

您可以将节点放置规则用于以下任务:

  • 仅在用于虚拟化工作负载的节点上部署虚拟机。
  • 仅在基础架构节点上部署 Operator。
  • 在工作负载之间保持隔离。

根据对象,您可以使用以下一个或多个规则类型:

nodeSelector
允许将 Pod 调度到使用您在此字段中指定的键值对标记的节点上。节点必须具有与所有列出的对完全匹配的标签。
关联性
可让您使用更宽松的语法来设置与 pod 匹配的规则。关联性也允许在规则应用方面更加精细。例如,您可以指定规则是首选项,而不是要求。如果规则是首选项的,则在不满足规则时仍然会调度 pod。
容限(tolerations)
允许将 pod 调度到具有匹配污点的节点。如果某个节点有污点(taint),则该节点只接受容许该污点的 pod。

5.2.2. 应用节点放置规则

您可以使用命令行编辑 SubscriptionHyperConvergedHostPathProvisioner 对象来应用节点放置规则。

先决条件

  • 已安装 oc CLI 工具。
  • 使用集群管理员权限登录。

流程

  1. 运行以下命令,在默认编辑器中编辑对象:

    $ oc edit <resource_type> <resource_name> -n {CNVNamespace}
  2. 保存文件以使改变生效。

5.2.3. 节点放置规则示例

您可以通过编辑 SubscriptionHyperConvergedHostPathProvisioner 对象来为 OpenShift Virtualization 组件指定节点放置规则。

5.2.3.1. 订阅对象节点放置规则示例

要指定 OLM 部署 OpenShift Virtualization Operator 的节点,在 OpenShift Virtualization 安装过程中编辑 Subscription 对象。

目前,您无法使用 Web 控制台为 Subscription 对象配置节点放置规则。

Subscription 对象不支持 关联性 节点放置规则。

使用 nodeSelector 规则的 Subscription 对象示例

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: hco-operatorhub
  namespace: openshift-cnv
spec:
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  name: kubevirt-hyperconverged
  startingCSV: kubevirt-hyperconverged-operator.v4.16.3
  channel: "stable"
  config:
    nodeSelector:
      example.io/example-infra-key: example-infra-value 1

1
OLM 在带有 example.io/example-infra-key = example-infra-value 的节点上部署 OpenShift Virtualization Operator。

带有 容限 规则的 Subscription 对象示例

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: hco-operatorhub
  namespace: openshift-cnv
spec:
  source:  redhat-operators
  sourceNamespace: openshift-marketplace
  name: kubevirt-hyperconverged
  startingCSV: kubevirt-hyperconverged-operator.v4.16.3
  channel: "stable"
  config:
    tolerations:
    - key: "key"
      operator: "Equal"
      value: "virtualization" 1
      effect: "NoSchedule"

1
OLM 在带有 key = virtualization:NoSchedule 污点的节点上部署 OpenShift Virtualization Operator。只有具有匹配容限的 pod 才会调度到这些节点上。

5.2.3.2. HyperConverged 对象节点放置规则示例

要指定 OpenShift Virtualization 部署其组件的节点,您可以在 OpenShift Virtualization 安装过程中创建的 HyperConverged 自定义资源(CR)文件中编辑 nodePlacement 对象。

使用 nodeSelector 规则的 HyperConverged 对象示例

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  infra:
    nodePlacement:
      nodeSelector:
        example.io/example-infra-key: example-infra-value 1
  workloads:
    nodePlacement:
      nodeSelector:
        example.io/example-workloads-key: example-workloads-value 2

1
基础架构资源放置在带有 example.io/example-infra-key = example-infra-value 的节点上。
2
工作负载放置在带有 example.io/example-workloads-key = example-workloads-value 的节点上。

使用 关联性规则的 HyperConverged 对象示例

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  infra:
    nodePlacement:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: example.io/example-infra-key
                operator: In
                values:
                - example-infra-value 1
  workloads:
    nodePlacement:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: example.io/example-workloads-key 2
                operator: In
                values:
                - example-workloads-value
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: example.io/num-cpus
                operator: Gt
                values:
                - 8 3

1
基础架构资源放置在标记为 example.io/example-infra-key = example-value 的节点上。
2
工作负载放置在带有 example.io/example-workloads-key = example-workloads-value 的节点上。
3
对于工作负载,最好使用八个以上 CPU 的节点,但如果它们不可用,仍可调度 pod。

带有 容限 规则的 HyperConverged 对象示例

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  workloads:
    nodePlacement:
      tolerations: 1
      - key: "key"
        operator: "Equal"
        value: "virtualization"
        effect: "NoSchedule"

1
为 OpenShift Virtualization 组件保留的节点使用 key = virtualization:NoSchedule 污点标记。只有具有匹配容限的 pod 才会调度到保留节点上。

5.2.3.3. HostPathProvisioner 对象节点放置规则示例

您可以直接编辑 HostPathProvisioner 对象,或使用 Web 控制台。

警告

您必须将 hostpath 置备程序和 OpenShift Virtualization 组件调度到同一节点上。否则,使用 hostpath 置备程序的虚拟化 pod 无法运行。您无法运行虚拟机。

使用 hostpath 置备程序(HPP)存储类部署虚拟机(VM)后,您可以使用节点选择器从同一节点中删除 hostpath 置备程序 pod。但是,您必须首先恢复该更改,至少针对该特定节点,并在尝试删除虚拟机前等待 pod 运行。

您可以通过为安装 hostpath 置备程序时创建的 HostPathProvisioner 对象的 spec.workload 字段指定 nodeSelectoraffinitytolerations 来配置节点放置规则。

带有 nodeSelector 规则的 HostPathProvisioner 对象示例

apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
kind: HostPathProvisioner
metadata:
  name: hostpath-provisioner
spec:
  imagePullPolicy: IfNotPresent
  pathConfig:
    path: "</path/to/backing/directory>"
    useNamingPrefix: false
  workload:
    nodeSelector:
      example.io/example-workloads-key: example-workloads-value 1

1
工作负载放置在带有 example.io/example-workloads-key = example-workloads-value 的节点上。

5.2.4. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.