22-k8s中pod的调度-亲和性affinity

一·、概述

在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;

至此,亲和性,学习完毕

相关推荐
阿里云云原生14 小时前
研发视角的新突破:当 AI Coding 工具集成全域运维诊断,排查线上故障只需 3 分钟
云原生
小猿姐1 天前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
阿里云云原生2 天前
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
云原生·agent
阿里云云原生3 天前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang4533 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4533 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4533 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生4 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生4 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事6 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes