与 Node 的亲缘性
Pod 支持通过配置 Node 亲缘性来 强制或非强制 将该 Pod 调度至某个 Node 子集中:
强制:与
pod.spec.nodeSelector
效果一致,强制将 Pod 调度至某个 Node 子集中;非强制:即该 Pod 更倾向于调度至某些 Node 上,若没法实现的话,将会被调度至其他 Node 中;
Pod 的 Node 亲缘性规则同样是通过 标签 来实现的,通过在配置规则中指定亲缘的标签,Pod 会被优先调度至包含该标签的 Node 中。
🍓 Pod 的 Node 亲缘性规则在 pods.spec.affinity.nodeAffinity
中进行配置,该配置中需要指定亲缘属性,目前共包含下面两种属性:
preferredDuringSchedulingIgnoredDuringExecution
: 从preferredDuringScheduling
可以看出是非强制的;requiredDuringSchedulingIgnoredDuringExecution
:从requiredDuringScheduling
可以看出是强制的;
强制性 Node 亲缘性
在 pod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
中指定强制性 Node 亲缘性规则。
下面展示一个具体案例,创建的 Pod 被强制调度至带有 gpu=true
的 Node 上:
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
affinity:
nodeAffinity: # 配置 Node 亲缘性规则
requiredDuringSchedulingIgnoredDuringExecution: # 强制性规则
nodeSelectorTerms:
- matchExpressions: # 使用扩展语法匹配
# 匹配带有 gpu=true 标签的 Node
- key: gpu
operator: In
values:
- "true"
containers:
- image: luksa/kubia
name: kubia
非强制性 Node 亲缘性
在 pod.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution.preference
中指定非强制性规则。
下面展示一个具体案例,创建的 Pod 优先调度至带有 availability-zone=zone1
和 share-type=dedicated
标签的 Node 中,并且第一个优先级规则更重要,权重设置为 80
,第二个优先级规则相对次要,权重设为 20
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pref
spec:
selector:
matchLabels:
app: pref
replicas: 5
template:
metadata:
labels:
app: pref
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 非强制性亲缘性规则
# 优先将 Pod 调度至带有 availability-zone=zone1 标签的 Node 中;否则调度至带有 share-type=dedicated 标签的 Node 中;否则调度至其他 Node 中
- weight: 80 # 指定该类型 Node 的权重
preference:
# 匹配带有 availability-zone=zone1 标签的 Node
matchExpressions:
- key: availability-zone
operator: In
values:
- zone1
- weight: 20 # 权重
preference:
# 匹配带有 share-type=dedicated 标签的 Node
matchExpressions:
- key: share-type
operator: In
values:
- dedicated
containers:
- args:
- sleep
- "99999"
image: busybox
name: main
根据案例中的亲缘性规则,可以将 Node 分为四类,优先级从高到低排序如下:
同时包含
availability-zone=zone1
和share-type=dedicated
标签的 Node;仅包含
availability-zone=zone1
标签的 Node;仅包含
share-type=dedicated
标签的 Node;其他 Node;
Last updated
Was this helpful?