跳到主要内容

Kubernetes 节点亲和性

什么是 Kubernetes 节点亲和性?

Kubernetes 节点亲和性(Node Affinity)是一种调度机制,允许用户通过定义规则来控制 Pod 在集群中的调度行为。通过节点亲和性,您可以指定 Pod 应该运行在哪些节点上,或者避免运行在哪些节点上。这种机制基于节点的标签(Labels)和 Pod 的亲和性规则(Affinity Rules)。

节点亲和性通常用于以下场景:

  • 将 Pod 调度到具有特定硬件(如 GPU)的节点上。
  • 将 Pod 调度到特定区域或可用区的节点上,以满足高可用性或性能需求。
  • 避免将 Pod 调度到某些节点上,例如避免将生产环境的工作负载调度到测试节点。
备注

节点亲和性与节点选择器(Node Selector)类似,但功能更强大。节点选择器只能基于简单的键值对匹配,而节点亲和性支持更复杂的逻辑表达式。


节点亲和性的类型

Kubernetes 提供了两种类型的节点亲和性:

  1. RequiredDuringSchedulingIgnoredDuringExecution:在调度时必须满足的规则。如果不满足,Pod 将不会被调度到任何节点。
  2. PreferredDuringSchedulingIgnoredDuringExecution:在调度时优先满足的规则。如果不满足,Pod 仍然可以被调度到其他节点。
提示

"IgnoredDuringExecution" 表示这些规则在 Pod 运行期间不会被强制执行。如果需要动态调整 Pod 的调度,可以考虑使用 Pod 反亲和性(Pod Anti-Affinity)或污点与容忍(Taints and Tolerations)。


配置节点亲和性

节点亲和性通过 Pod 的 spec.affinity.nodeAffinity 字段进行配置。以下是一个示例,展示如何定义节点亲和性规则:

apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: In
values:
- "ssd"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: "zone"
operator: In
values:
- "us-east-1a"

解释

  • requiredDuringSchedulingIgnoredDuringExecution:Pod 必须调度到具有 disktype=ssd 标签的节点上。
  • preferredDuringSchedulingIgnoredDuringExecution:Pod 优先调度到具有 zone=us-east-1a 标签的节点上,但如果无法满足,仍然可以调度到其他节点。

节点亲和性操作符

matchExpressions 中,可以使用以下操作符:

  • In:标签值在指定列表中。
  • NotIn:标签值不在指定列表中。
  • Exists:节点必须具有指定的标签(不关心值)。
  • DoesNotExist:节点不能具有指定的标签。
  • Gt:标签值大于指定值(仅适用于数值)。
  • Lt:标签值小于指定值(仅适用于数值)。

实际应用场景

场景 1:将 Pod 调度到 GPU 节点

假设您的集群中有一些节点配备了 GPU,您希望将需要 GPU 的工作负载调度到这些节点上。可以通过以下配置实现:

apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: tensorflow
image: tensorflow/tensorflow:latest-gpu
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "gpu"
operator: Exists

场景 2:避免将 Pod 调度到测试节点

假设您有一些节点专门用于测试环境,您希望避免将生产环境的 Pod 调度到这些节点上。可以通过以下配置实现:

apiVersion: v1
kind: Pod
metadata:
name: production-pod
spec:
containers:
- name: nginx
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "environment"
operator: NotIn
values:
- "test"

总结

Kubernetes 节点亲和性是一种强大的调度机制,可以帮助您更精确地控制 Pod 的调度行为。通过定义 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 规则,您可以将 Pod 调度到满足特定条件的节点上,或者避免调度到不合适的节点上。

警告

在实际使用中,请确保节点的标签设置正确,并仔细测试亲和性规则,以避免意外的调度行为。


附加资源与练习

练习

  1. 创建一个 Pod,要求其必须调度到具有 env=production 标签的节点上。
  2. 创建一个 Pod,优先调度到具有 region=us-west 标签的节点上,但不强制要求。

资源

通过以上内容,您应该能够理解并应用 Kubernetes 节点亲和性来优化 Pod 的调度策略。继续实践和探索,您将更加熟练地掌握这一功能!