$ oc edit <resource_type> <resource_name> -n {CNVNamespace}
在裸机节点上虚拟机(VM)的默认调度是合适的。您可以选择性地指定要部署OpenShift Virtualization Operators、工作负载和控制器的节点,方法是配置节点放置规则。
您可以在安装OpenShift Virtualization后为某些组件配置节点放置规则,但是如果您要为工作负载配置节点放置规则,则不能存在虚拟机。 |
您可以将节点放置规则用于以下任务:
仅在用于虚拟化工作负载的节点上部署虚拟机。
仅在基础架构节点上部署Operators。
维护工作负载之间的隔离。
根据对象的不同,您可以使用以下一种或多种规则类型:
nodeSelector
允许将Pod调度到已用您在此字段中指定的键值对标记的节点上。节点必须具有与所有列出的键值对完全匹配的标签。
affinity(亲和性)
使您可以使用更具表现力的语法来设置与具有Pod的节点匹配的规则。亲和性还允许更细致地应用规则。例如,您可以指定规则是首选项而不是必需项。如果规则是首选项,则在不满足规则时仍会调度Pod。
tolerations(容忍度)
允许将Pod调度到具有匹配污点的节点上。如果将污点应用于节点,则该节点仅接受容忍该污点的Pod。
您可以使用命令行编辑HyperConverged
或HostPathProvisioner
对象来应用节点放置规则。
已安装oc
CLI工具。
您已使用集群管理员权限登录。
通过运行以下命令,在默认编辑器中编辑对象:
$ oc edit <resource_type> <resource_name> -n {CNVNamespace}
保存文件以应用更改。
您可以通过编辑HyperConverged
或HostPathProvisioner
对象来指定OpenShift Virtualization组件的节点放置规则。
要指定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才会调度到保留的节点上。 |
您可以直接或使用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
字段指定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 的节点上。 |