K8S node亲和与反亲和:affinity应用
K8S-节点标签:affinity应用
简介:
affinity是K8S 1.2版本后引入的新特性,类似于nodeSelector,允许使用者指定一些pod在Node间调度的约束,目前支持两种形式:
1、 requireDuringSchedulinglgnoreDuringExecution : 必须满足pod调度匹配条件,不满足则不调度(严格匹配,硬匹配)
2、 prequireDuringSchedulinglgnoreDuringExecution: 优先满足pod调度匹配条件,不满足的情况下也会调度到不符合条件的node上(不严格匹配,软匹配)
affinity和nodeSelector对比:
1、亲和于反亲和对目的标签的选择匹配不仅仅支持and,还支持In、Noth、Exists、DoesNotExist、Gt、Lt
*In :标签的值存在匹配列表中(匹配成功就调度到目的node,实现node亲和)
*NotIn :标签的值不存在指定的匹配列表中(不会调度到目的node,实现反亲和)
*Gt :标签的值大于某个值(字符串)
*Lt : 标签的值小于摸个值(字符串)
*Exists :指定的标签存在
2、可以设置软匹配和硬匹配
3、可以对pod定义亲和策略,比如允许哪些pod可以或者不可用被调度到同一台node
注:* 如果定义一个nodeSelectorTerms中通过一个matchExpressions基于列表指定了多个operator条件,则只要满足其中一个条件,就会被调度到相应的节点上,即or的关系,即如果nodeSelectorTerms下面有多个条件的话,只要满足任何一个条件就可以了
*如果定义一个nodeSelectorTerms中都通过一个matchExpressions(匹配表达式)指定key匹配多个条件,则所有的目的条件都必须满足才会调度到对应的节点,即and的关系,如果matchExpressions有多个选项的话,则必须同时满足所有这些条件才能正常调度
常用类型是requireDuringSchedulinglgnoreDuringExecution 硬限制,下面举例应用
1、创建yaml资源
1、编写yaml文件
root@master1:/tmp# cat nodeAffinity-requiredDuring-matchExpressions.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
labels:
app: myserver-tomcat-app2-deployment-label
name: myserver-tomcat-app2-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-tomcat-app2-selector
template:
metadata:
labels:
app: myserver-tomcat-app2-selector
spec:
containers:
- name: myserver-tomcat-app2-container
image: tomcat:7.0.94-alpine
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions: #匹配条件1,有一个key但是有多个values、则只要匹配成功一个value就可以调度
- key: disktype #指定key是disktype,values的值在下面定义
operator: In #operator是操作符,这里操作符是In,In标签的值存在列表中,列表在下面指定的是
values: #列表中指定了两个values,只要能匹配到一个值就满足匹配条件
- ssd
- xxx
- matchExpressions: #匹配条件2,有一个key但是有多个values、则只要匹配成功一个value就可以调度
- key: project
operator: In
values:
- mmm #即使匹配条件2都不满足也可以调度,因为定义了两个matchExpressions只要有任意一个满足就可以调用。
- nnn
2、创建资源
root@master1:/tmp# kubectl apply -f nodeAffinity-requiredDuring-matchExpressions.yaml
2、查看资源
调度到了172.31.7.111节点上了,这个节点的标签满足disktype=ssd这个匹配
查看两个node标签,都没有第二个匹配条件标签project=mmm或project=nnn,最后还是调度成功了,因为只需要满足这两个匹配条件的一个即可
此时如果把172.31.7.111节点的标签删除,已经运行的pod不会受到影响,但是如果把pod删除重建就无发调度创建了,因为111节点的标签已经删除了;但是再重新把接节点打上标签后就立刻恢复正常运行
更多推荐
所有评论(0)