$ oc edit <resource_type> <resource_name> -n {CNVNamespace}
在裸机节点上虚拟机(VM)的默认调度是合适的。可以选择配置节点放置规则,以指定要部署OpenShift Virtualization操作符、工作负载和控制器的节点。
安装OpenShift Virtualization后,您可以为某些组件配置节点放置规则,但是如果您要为工作负载配置节点放置规则,则不能存在虚拟机。 |
您可以将节点放置规则用于以下任务:
仅在用于虚拟化工作负载的节点上部署虚拟机。
仅在基础设施节点上部署操作符。
保持工作负载之间的分离。
根据对象的不同,您可以使用以下一种或多种规则类型:
nodeSelector
允许将Pod调度到用您在此字段中指定的键值对标记的节点上。节点必须具有与所有列出的对完全匹配的标签。
affinity
使您可以使用更具表达性的语法来设置与具有Pod的节点匹配的规则。Affinity还允许对规则的应用方式进行更细致的调整。例如,您可以指定规则是首选项,而不是要求。如果规则是首选项,则在不满足规则时仍会调度Pod。
tolerations
允许将Pod调度到具有匹配污点的节点上。如果将污点应用于节点,则该节点仅接受容忍该污点的Pod。
您可以通过使用命令行编辑Subscription
、HyperConverged
或HostPathProvisioner
对象来应用节点放置规则。
已安装oc
CLI工具。
您已以集群管理员权限登录。
通过运行以下命令在默认编辑器中编辑对象:
$ oc edit <resource_type> <resource_name> -n {CNVNamespace}
保存文件以应用更改。
您可以通过编辑Subscription
、HyperConverged
或HostPathProvisioner
对象来指定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
对象,也可以使用 Web 控制台。
您必须将 hostpath provisioner 和 OpenShift Virtualization 组件调度到相同的节点上。否则,使用 hostpath provisioner 的虚拟化 Pod 将无法运行。您无法运行虚拟机。 |
在使用 hostpath provisioner (HPP) 存储类部署虚拟机 (VM) 后,您可以使用节点选择器从同一节点中移除 hostpath provisioner Pod。但是,您必须首先恢复该更改(至少对于该特定节点),并在尝试删除 VM 之前等待 Pod 运行。
您可以通过为安装 hostpath provisioner 时创建的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 的节点上。 |