假设有 3 个节点,具有一下标签:

节点名

标签

w1

env=prod, plan=a1, kubernetes.io/hostname=w1

w2

env=dev, plan=a2, kubernetes.io/hostname=w2

w3

env=test, plan=a3, kubernetes.io/hostname=w3

一、nodeSelector

可以通过在 Pod 的配置文件中定义一组标签,来指定 Pod 应该被调度到哪些节点上运行。节点上需要拥有与 Pod 标签相匹配的标签,才能接受该 Pod 的调度请求。

# 只会调度到具有 “env=dev” 标签的 w2 节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
nodeSelector:
env: dev

二、nodeName

可以在 Pod 的配置文件中添加如下的 nodeName 字段,指定该 Pod 应该被调度到该节点上:

# 只调度到名为 “w1” 的节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
nodeName: w1

三、affinity

可以在 Pod 的配置文件中添加如下的 affinity 字段,定义 Pod 对节点的亲和和反亲和策略。

亲和与反亲和对目的标签的选择匹配不仅仅支持 and,还支持 In、NotIn、Exists、DoesNotExist、Gt、Lt。

  • In:标签的值存在匹配列表中(匹配成功就调度到目的node, 实现node亲和)
  • NotIn:标签的值不存在指定的匹配列表中(不会调度到目的node, 实现反亲和)
  • Exists:指定的标签存在
  • DoesNotExist:指定的标签不存在
  • Gt:标签的值大于某个值(字符串)
  • Lt: 标签的值小于某个值(字符串)


3.1 硬亲和

requiredDuringSchedulingIgnoredDuringExecution 表示必须满足指定的亲和性或反亲和性规则才能够在节点上进行调度。如果没有符合条件的节点,Pod 会一直保持 Pending 状态,直到有符合条件的节点。

# 该 Pod 将会被调度到具有标签 env 为 dev 的节点上。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
  • 同个 key 的 values 有多个的情况,只要有一个匹配就可以
# 该 Pod 将会被调度到具有标签 env 为 dev 或 test 的节点上。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- test
- xxx
  • 同个 matchExpressions 的 key 有多个的情况,每个 key 都必须要匹配成功一个 value,否则不调度。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- xxx
- key: plan
operator: In
values:
- a1
- ax
  • 多个 matchExpressions 的情况下,只有有一个 matchExpressions 能匹配成功就可以调度。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- xxx
- matchExpressions:
- key: plan
operator: In
values:
- az
- ax
  • 使用 NotIn 实现反亲和
# pod 将不会调度到含有标签 env 为 dev 的节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: NotIn
values:
- dev

3.2 软亲和

preferredDuringSchedulingIgnoredDuringExecution 表示如果有符合条件的节点可用,则 Pod 将被调度到这些节点上;如果没有符合条件的节点,则 Pod 仍然可以被调度到其他节点上。

# weight 表示匹配调度的优先级,数值越大,优先级越高.
# 条件1不满足时,继续匹配条件2
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
# 条件1
- preference:
matchExpressions:
- key: env
operator: In
values:
- dev
weight: 100
# 条件2
- preference:
matchExpressions:
- key: plan
operator: In
values:
- a1
weight: 80