一·、概述
在k8s当中,"亲和性"分为三种,节点亲和性、pod亲和性、pod反亲和性;
|-----------------|---------|------------------------------------------------------------|
| 亲和性分类 | 名称 | 解释说明 |
| nodeAffinity | 节点亲和性 | 通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点) |
| podAffinity | pod亲和性 | 通过【节点+pod】标签匹配,可以和哪些pod部署在同一个节点上(拓扑域);(主角是pod) |
| podAntiAffinity | pod反亲和性 | 通过【节点+pod】标签匹配,与pod亲和性相反,就是和那些pod不在一个节点上(拓扑域); |
二、nodeAffinity-节点亲和性
1,给k8s节点创建标签
[root@k8s231 ~]# kubectl label nodes k8s231 k8s=xinjizhiwa-01
node/k8s231 labeled
[root@k8s231 ~]# kubectl label nodes k8s232 k8s=xinjizhiwa-02
node/k8s232 labeled
[root@k8s231 ~]# kubectl label nodes k8s233 k8s=xinjizhiwa-03
node/k8s233 labeled
查看标签
[root@k8s231 dns]# kubectl get nodes --show-labels
2,编辑资源清单设置节点亲和性
[root@k8s231 nodeaffinity]# cat nodeaffinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 20
selector:
matchLabels:
k8s: xinjizhiwa
template:
metadata:
name: pod-affinity
labels:
k8s: xinjizhiwa
spec:
#声明亲和性
affinity:
#声明亲和性类型
nodeAffinity:
#硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
requiredDuringSchedulingIgnoredDuringExecution:
#设置节点选择器列表:
nodeSelectorTerms:
#声明基于节点的标签进行关联
matchExpressions:
key: k8s
values:
xinjizhiwa-03
xinjizhiwa-02
#设置key和value的关系;
#--In:key==value(必须写value)
#--NotIn:key !=value(必须写value)
operator: In
#软限制,不一定满足,但会优先满足,相当于一高了调度的优先级;
preferredDuringSchedulingIgnoredDuringExecution:
#配置权重
- weight: 10
#偏向性
preference:
#基于节点的标签进行关联
matchExpressions:
#节点的标签名称
- key: k8s
values:
- xinjizhiwa-03
#关联关系,表示key和values的关系
#In:表示包含关系(value必须写)
#NotIn:表示不包含(value必须写)
#Exists: 表示存在关系(不能写value)
#DoesNotExist:不存在(不能写value)
#Gt:大于(value必须是一个单一的元素,且值将被解释称一个整数)
#Lt:小于(value必须是一个单一的元素,且值将被解释称一个整数)
operator: In
containers:
- name: c1
image: nginx:1.20.1-alpine
ports:
- containerPort: 80
3,创建资源
[root@k8s231 nodeaffinity]# kubectl apply -f nodeaffinity.yaml
4,查看pod所在节点,验证亲和性
三、podAffinity-pod的亲和性
基于"节点标签"进行设置,第一个pod副本创建在了哪个节点上,那么其余副本也会创建在这个节点上;
拓扑域:节点机器的标签的key和value都相等的机器,就是同一个拓扑域;
1,编辑资源清单设置pod亲和性
[root@k8s231 nodeaffinity]# cat podaffinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 20
selector:
matchLabels:
k8s: xinjizhiwa
template:
metadata:
name: pod-affinity
labels:
k8s: xinjizhiwa
spec:
#声明亲和性
affinity:
#声明亲和性类型
podAffinity:
#硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
requiredDuringSchedulingIgnoredDuringExecution:
#设置拓扑域,指定【节点的标签名】
#【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建
#只要满足key是k8s的节点的标签,那么就是同一个拓扑域
- topologyKey: k8s
#【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
labelSelector:
matchExpressions:
#意思是说,只要key的值是k8s的pod创建在了哪个节点,"我"就跟随他。也创建在这个节点上;
- key: k8s
#如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
#建议设置:In的方式进行匹配,当然此时Value就不能设置了;
operator: Exists
containers:
- name: c1
image: nginx:1.20.1-alpine
ports:
- containerPort: 80
2,创建资源
[root@k8s231 nodeaffinity]# kubectl apply -f podaffinity.yaml
3,查看pod所在节点
[root@k8s231 nodeaffinity]# kubectl get pods -o wide
四、podAntAffinity-pod的反亲和性
pod的亲和性:符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就创建在哪里;
pod的反亲和性:与之相反,符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就不能创建在哪里;
1,编辑资源清单设置pod的反亲和性
[root@k8s231 nodeaffinity]# cat podantaffinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 4
selector:
matchLabels:
k8s: xinjizhiwa
template:
metadata:
name: pod-affinity
labels:
k8s: xinjizhiwa
spec:
#声明亲和性
affinity:
#声明亲和性类型
podAntiAffinity:
#硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
requiredDuringSchedulingIgnoredDuringExecution:
#设置拓扑域,指定【节点的标签名】
#【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建
- topologyKey: k8s
#【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
labelSelector:
matchExpressions:
- key: k8s
#如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
#建议设置:In的方式进行匹配,当然此时Value就不能设置了;
operator: Exists
containers:
- name: c1
image: nginx:1.20.1-alpine
ports:
- containerPort: 80
2,创建资源
[root@k8s231 nodeaffinity]# kubectl apply -f podantaffinity.yaml
3,查看pod
结论:
1,由于第一pod创建在了k8s232中,所以第二个pod就无法再k8s232中创建;
2,第二个pod就再k8s233中创建了;
3,由于我们是4个副本,k8s231还设置了污点,无法创建pod;
4,所以,我们4个副本,最后只能创建成功2个,剩下两个pending;
至此,亲和性,学习完毕