×

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

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

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

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

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

  • 仅在基础架构节点上部署Operators。

  • 维护工作负载之间的隔离。

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

nodeSelector

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

affinity(亲和性)

使您可以使用更具表现力的语法来设置与具有Pod的节点匹配的规则。亲和性还允许更细致地应用规则。例如,您可以指定规则是首选项而不是必需项。如果规则是首选项,则在不满足规则时仍会调度Pod。

tolerations(容忍度)

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

应用节点放置规则

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

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

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

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

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

节点放置规则示例

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

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的节点上。
带有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对象节点放置规则示例

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

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

在使用hostpath provisioner (HPP)存储类部署虚拟机(VM)之后,您可以使用node selector从同一节点中删除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的节点上。