×

在裸机节点上虚拟机(VM)的默认调度是合适的。可以选择配置节点放置规则,以指定要部署OpenShift Virtualization操作符、工作负载和控制器的节点。

安装OpenShift Virtualization后,您可以为某些组件配置节点放置规则,但是如果您要为工作负载配置节点放置规则,则不能存在虚拟机。

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

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

  • 仅在用于虚拟化工作负载的节点上部署虚拟机。

  • 仅在基础设施节点上部署操作符。

  • 保持工作负载之间的分离。

根据对象的不同,您可以使用以下一种或多种规则类型:

nodeSelector

允许将Pod调度到用您在此字段中指定的键值对标记的节点上。节点必须具有与所有列出的对完全匹配的标签。

affinity

使您可以使用更具表达性的语法来设置与具有Pod的节点匹配的规则。Affinity还允许对规则的应用方式进行更细致的调整。例如,您可以指定规则是首选项,而不是要求。如果规则是首选项,则在不满足规则时仍会调度Pod。

tolerations

允许将Pod调度到具有匹配污点的节点上。如果将污点应用于节点,则该节点仅接受容忍该污点的Pod。

应用节点放置规则

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

先决条件
  • 已安装oc CLI工具。

  • 您已以集群管理员权限登录。

步骤
  1. 通过运行以下命令在默认编辑器中编辑对象:

    $ oc edit <resource_type> <resource_name> -n {CNVNamespace}
  2. 保存文件以应用更改。

节点放置规则示例

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

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

要指定OLM部署OpenShift Virtualization操作符的节点,请在OpenShift Virtualization安装期间编辑Subscription对象。

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

Subscription对象不支持affinity节点放置规则。

带有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.17.3
  channel: "stable"
  config:
    nodeSelector:
      example.io/example-infra-key: example-infra-value (1)
1 OLM将OpenShift Virtualization操作符部署到标记为example.io/example-infra-key = example-infra-value的节点上。
带有tolerations规则的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.17.3
  channel: "stable"
  config:
    tolerations:
    - key: "key"
      operator: "Equal"
      value: "virtualization" (1)
      effect: "NoSchedule"
1 OLM 在标记为key = virtualization:NoSchedule污点的节点上部署 OpenShift Virtualization Operators。只有具有匹配容忍度的 Pod 才会调度到这些节点上。

超融合对象节点放置规则示例

要指定 OpenShift Virtualization 部署其组件的节点,您可以编辑在 OpenShift Virtualization 安装期间创建的超融合自定义资源 (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的节点上。
包含affinity规则的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 仍然会调度。
包含tolerations规则的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 才会调度到保留的节点上。

HostPathProvisioner 对象节点放置规则示例

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

您必须将 hostpath provisioner 和 OpenShift Virtualization 组件调度到相同的节点上。否则,使用 hostpath provisioner 的虚拟化 Pod 将无法运行。您无法运行虚拟机。

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

您可以通过为安装 hostpath provisioner 时创建的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的节点上。