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. 应用节点放置规则
您可以使用命令行编辑 Subscription
、HyperConverged
或 HostPathProvisioner
对象来应用节点放置规则。
先决条件
-
已安装
oc
CLI 工具。 - 使用集群管理员权限登录。
流程
运行以下命令,在默认编辑器中编辑对象:
$ oc edit <resource_type> <resource_name> -n {CNVNamespace}
- 保存文件以使改变生效。
5.2.3. 节点放置规则示例
您可以通过编辑 Subscription
、HyperConverged
或 HostPathProvisioner
对象来为 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
使用 关联性
规则的 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
带有 容限
规则的 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
字段指定 nodeSelector
、affinity
或 tolerations
来配置节点放置规则。
带有 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
的节点上。