背景
在 Kubernetes(k8s)中,节点亲和性(NodeAffinity)是一种用于控制 Pod 调度到特定节点的机制。可为 Pod 的调度提供了更精细的控制,以满足各种复杂的应用场景需求。
硬亲和
requiredDuringSchedulingIgnoredDuringExecution
是节点亲和性中的一种强制约束,是一种硬亲和。这意味着在 Pod 调度时,必须满足指定的节点条件,否则 Pod 将无法被调度。例如,如果定义了某个 Pod 必须调度到具有特定标签的节点上,那么在调度过程中,Kubernetes 的调度器会严格遵循这个规则。
软亲和
preferredDuringSchedulingIgnoredDuringExecution
则相对较为灵活。它表示在满足其他调度条件的前提下,优先将 Pod 调度到符合指定条件的节点上,但并非强制要求,是一种软亲和。
举例
假设有一个集群的一个区域ZoneA
,其中一部分节点配备了 GPU(这些节点上有gpu-enable: true
的标签),而另一部分没有GPU的节点是没有此标签。
此时,某个Pod只申请CPU和MEMORY资源,我们可使用硬亲和性来保证调度到ZoneA
的同时,使用软亲和性使其尽量调度到调度到非 GPU 节点上。
具体编排如下:
......
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: my-zone
operator: In
values:
- zone-a
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: gpu-enable
operator: NotIn
values:
- true
.......
总结
通过合理地配置节点亲和性,我们能够更加高效地利用集群资源,确保 Pod 能够被调度到最适合的节点上,从而提高整个集群的性能和资源利用率。
总之,k8s 中的节点亲和性为我们提供了强大的工具,使我们能够根据实际需求灵活地控制 Pod 的调度,以实现更优化的集群管理。