在之前的文章 labels控制pod运行位置 提到可以通过 nodeSelector
来控制将pod运行到哪台集群节点。
本文中要使用的 nodeAffinity
(节点亲和性),其功能与 nodeSelector
是类似的,也是根据节点标签来对 pod 进行调度启动
相比 nodeSelector
,nodeAffinity
更加的灵活,功能多,支持硬策略和软策略
匹配更多的逻辑组合,不只是字符串的完全相等
调度分为软策略和硬策略,而不是硬性要求
- 硬(required):必须满足(和nodeSelector一致),配置项全称为
requiredDuringSchedulingIgnoredDuringExecution
- 软(preferred):尝试满足,但不是必须。如果节点的标签在运行时发生变更,也可以继续在该节点运行。配置项全称为
preferredDuringSchedulingIgnoredDuringExecution
nodeAffinity硬策略示例
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
# 硬策略
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# 节点标签的key必须为disktype
- key: disktype
operator: In
# 节点标签key的值必须为ssd1或者ssd2
values:
- ssd1
- ssd2
containers:
- name: nginx
image: nginx
...
以上文件中的节点亲和性表示,pod 必须被调度在具有标签 kubernetes.io/e2e-az-name=ssd1
或者kubernetes.io/e2e-az-name=ssd2
的集群节点上,没有则 Pending
状态
nodeAffinity软策略示例
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
# 软策略
preferredDuringSchedulingIgnoredDuringExecution:
#
- weight: 1
preference:
matchExpressions:
- key: key
operator: In
values:
- value
containers:
- name: nginx
image: nginx
...
以上文件中的节点亲和性表示,如果节点中存在节点标签为 key=value
,则优先调度到该节点,如果整个集群中都没有节点中有主要的标签,也会根据其它的调度规则,调度到某一个节点。
weight 字段值的 范围是 1-100。 对于每个符合所有调度要求(资源请求、RequiredDuringScheduling 亲和性表达式等) 的节点,调度器将遍历该字段的元素来计算总和,并且如果节点匹配对应的 MatchExpressions,则添加“权重”到总和。 然后将这个评分与该节点的其他优先级函数的评分进行组合。 总分最高的节点是最优选的。
操作符
在以上的操作中,可以看到除了 key
和 value
有值以外,还有 operator
operator
的值被叫做操作符,一共有以下几种
In:label的value在指定key中
Notln:label的value不在指定的key中
Exists:某个label存在
DoesNotExist:某个label不存在
Gt:label的value大于某个值
Lt:label的value小于某个值
如果nodeSelectorTerms
下面有多个选项的话,满足任何一个条件就可以了;如果matchExpressions
有多个选项的话,则必须同时满足这些条件才能正常调度 POD。
使用事项
两种策略可以同时使用,在满足硬策略的前提,优先选择具有软策略规则的节点进行调度。