Node、Pod亲和性调度策略(nodeAffinity、nodeAntAffinity、podAffinity、podAntAffinity)
一、Node亲和性调度
NodeAffinity
意为Node
节点亲和性的调度策略,是用于替换NodeSelector
的全新调度策略。这些规则基于节点上的自定义标签和Pod
对象上指定的标签选择器进行定义 。 节点亲和性允许Pod
对象定义针对一组可以调度于其上的节点的亲和性或反亲和性,不过,它无法具体到某个特定的节点 。
节点亲和性规则 :
硬亲和性required:强制性规则,
Pod调度时必须要满足的规则,而在不存在满足规则的节点时 ,
Pod对象会被置为
Pending`状态
软亲和性preferred:柔性调度限制,它倾向于将
Pod`对象运行于某类特定的节点之上,而调度器也将尽量满足此需求 ,软策略就是满足条件最好了,没有的话也无所谓了的策略;而硬策略就比较强硬了,如果没有满足条件的节点的话,就不断重试直到满足条件为止,简单说就是你必须满足我的要求,不然我就不干**的策略。
1.1eg:nodeAffinity
中支持使用 matchExpressions
属性构建更为复杂的标签选择机制。面的配置清单示例中定义的Pod
对象,其使用节点硬亲和规则定义可将当前Pod
对象调度至拥有app
标签且其值为jenkins
的节点之上
1.1Node硬亲和性
apiVersion: v1
kind: Pod
metadata:
name: jenkins-required-nodeaffinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- {key: app, operator: In, values: ["jenkins"]}
containers:
- name: jenkins
image: jenkins
构建标签选择器表达式中支持使用操作符有In
、Notln
、Exists
、DoesNotExist
、Lt
和Gt
等
- In:
label
的值在某个列表中 - NotIn:
label
的值不在某个列表中 - Gt:
label
的值大于某个值 - Lt:
label
的值小于某个值 - Exists:某个
label
存在 - DoesNotExist:某个
label
不存在
1.2Node软亲和性
affinity: 亲和性调度
nodeAffinity: node亲和性
preferredDuringSchedulingIgnoredDuringExecution: 软策略
nodeSelectorTerms:
- matchExpressions:
- key: Tier
operator: In #label的值在某个列表中
values:
- backend #指定label值有backend中
二、Pod亲和性调度
Pod
亲和性调度需要各相关的Pod
对象运行于“同一位置”, 而反亲和性调度则要求它们不能运行于“同一位置” 。同一位置取决于节点的位置拓扑, 拓扑的方式不同。
在定义Pod
对象的亲和性与反亲和性时,需要借助于标签选择器来选择被依赖的Pod
对象,并根据选出的Pod
对象所在节点的标签来判定“同一位置”的具体意义。
2.1pod亲和性调度
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["jenkins"]}
topologyKey: zone
创建的Pod
资源时,调度器首先会基于标签选择器 查询拥有标签app=
jenkins的所有Pod
资源,接着获取到它们分别所属 的节点的zone
标签值,接下来再查询拥有匹配这些标签值的所有节点,从而完成节点预选。而后根据优选函数计算这些节点的优先级,从而挑选出运行新建Pod
对象的节点。
2.2pod反亲和性
podAntiAffinty
即可用于定义Pod
对象的反亲和约束
Pod
反亲和性调度也支持使用柔性约束机制,在调度时,它将尽量满足不把位置相斥的Pod
对象调度于同一位置,但是,当约束关系无法得到满足时,也可以违反约束而调度。
podAntiAffinity: #pod的不可调度
preferredDuringSchedulingIgnoredDuringExecution: 软策略
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: spp-gitlab
operator: In
values:
- gitlab-deploy
topologyKey: "kubernetes.io/hostname"