kubernetes中pod的調(diào)度親和性affinity詳解
一、概述
在k8s當(dāng)中,“親和性”分為三種,節(jié)點親和性、pod親和性、pod反親和性;
| 親和性分類 | 名稱 | 解釋說明 |
|---|---|---|
| nodeAffinity | 節(jié)點親和性 | 通過【節(jié)點】標(biāo)簽匹配,用于控制pod調(diào)度到哪些node節(jié)點上,以及不能調(diào)度到哪些node節(jié)點上;(主角node節(jié)點) |
| podAffinity | pod親和性 | 通過【節(jié)點+pod】標(biāo)簽匹配,可以和哪些pod部署在同一個節(jié)點上(拓撲域);(主角是pod) |
| podAntiAffinity | pod反親和性 | 通過【節(jié)點+pod】標(biāo)簽匹配,與pod親和性相反,就是和那些pod不在一個節(jié)點上(拓撲域); |
二、nodeAffinity節(jié)點親和性
1. 給節(jié)點打上標(biāo)簽
[root@master ~]# kubectl label nodes master k8s=master

查看三個節(jié)點的標(biāo)簽,分別擁有k8s=master,k8s=node1,k8s=node2標(biāo)簽
2.編輯資源清單設(shè)置節(jié)點親和性
測試前把我們資源都刪除掉
[root@master ~]# kubectl delete pod,svc,deploy --all pod "taint-demo-58f97cc65c-4nhvs" deleted pod "taint-demo-58f97cc65c-lh55g" deleted pod "taint-demo-58f97cc65c-smjd5" deleted pod "taint-demo-58f97cc65c-tr9th" deleted pod "taint-demo-58f97cc65c-tsvdp" deleted service "kubernetes" deleted deployment.apps "taint-demo" deleted
編輯資源清單
ot@master deployment-demo]# cat dm-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 20
selector:
matchLabels:
k8s: dolphin
template:
metadata:
name: pod01
labels:
k8s: dolphin
spec:
affinity: #聲明親和性
nodeAffinity: #聲明親和性類型
requiredDuringSchedulingIgnoredDuringExecution: #硬限制,必須滿足的條件有哪些(不滿足下邊的條件親和性就設(shè)置失?。?
nodeSelectorTerms: #設(shè)置節(jié)點選擇器列表
- matchExpressions:
- key: k8s
values:
- node1
- node2
operator: In
preferredDuringSchedulingIgnoredDuringExecution: #軟限制,不一定滿足,但會優(yōu)先滿足,相當(dāng)于調(diào)高了調(diào)度到優(yōu)先級
- weight: 10 #配置權(quán)重
preference: #偏向性
matchExpressions:
- key: k8s
values:
- node1
#關(guān)聯(lián)關(guān)系,表示key和values的關(guān)系
#In:表示包含關(guān)系(value必須寫)
#NotIn:表示不包含(value必須寫)
#Exists: 表示存在關(guān)系(不能寫value)
#DoesNotExist:不存在(不能寫value)
#Gt:大于(value必須是一個單一的元素,且值將被解釋稱一個整數(shù))
#Lt:小于(value必須是一個單一的元素,且值將被解釋稱一個整數(shù))
operator: In
containers:
- name: c1
image: nginx
ports:
- containerPort: 803.查看資源驗證親和性
我們可以看到,創(chuàng)建的20個Pod只有一個被調(diào)度到node2上,上邊節(jié)點調(diào)度更親和節(jié)點1

三、podAffinity pod親和性
基于“節(jié)點標(biāo)簽”進行設(shè)置,第一個pod副本創(chuàng)建在了哪個節(jié)點上,那么其余副本也會創(chuàng)建在這個節(jié)點上;
拓撲域:節(jié)點機器的標(biāo)簽的key和value都相等的機器,就是同一個拓撲域;
1. 編輯資源清單設(shè)置pod親和性
[root@master deployment-demo]# cat dm-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 20
selector:
matchLabels:
k8s: dolphin
template:
metadata:
name: pod01
labels:
k8s: dolphin
spec:
affinity: #聲明親和性
podAffinity: #聲明親和性類型
requiredDuringSchedulingIgnoredDuringExecution: #硬限制,必須滿足的條件有哪些(不滿足下邊的條件親和性就設(shè)置失?。?
#設(shè)置拓撲域,指定【節(jié)點的標(biāo)簽名】
#【節(jié)點key】就是說,設(shè)置了拓撲域,pod就會往這個標(biāo)簽的節(jié)點進行創(chuàng)建
# 只要滿足key是k8s節(jié)點的表情,那么就是同一個拓撲域
- topologyKey: k8s
# 【pod標(biāo)簽】確定pod的表情,用于二次確認,選中了拓撲域(節(jié)點標(biāo)簽的key),再次選中pod標(biāo)簽才能確認調(diào)度到哪個節(jié)點
labelSelector:
matchExpressions:
#意思是是說,只要key的值是k8s的pod創(chuàng)建在了哪個節(jié)點,“我”就跟隨他。也創(chuàng)建在這個節(jié)點上;
- key: k8s
#建議設(shè)置:in的方式進行匹配,更精準,就要設(shè)置value了
operator: Exists # Exists的方式進行匹配,這里value就不能設(shè)置了
containers:
- name: c1
image: nginx
ports:
- containerPort: 802、創(chuàng)建資源
[root@master deployment-demo]# kubectl apply -f dm-affinity.yaml
3、查看結(jié)果
都運行在了node1節(jié)點上

四、podAntAffinity-pod的反親和性
- pod的親和性:符合拓撲域的范圍,指定標(biāo)簽的pod創(chuàng)建在哪里,其他pod就創(chuàng)建在哪里;
- pod的反親和性:與之相反,符合拓撲域的范圍,指定標(biāo)簽的pod創(chuàng)建在哪里,其他pod就不能創(chuàng)建在哪里;
1、編輯資源清單
親和性和反親和性的配置就下邊一個標(biāo)紅差別,其它配置幾乎一樣
[root@master deployment-demo]# cat dm-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm-affinity
spec:
replicas: 5
selector:
matchLabels:
k8s: dolphin
template:
metadata:
name: pod01
labels:
k8s: dolphin
spec:
affinity: #聲明親和性
podAntiAffinity: #聲明親和性類型
requiredDuringSchedulingIgnoredDuringExecution: #硬限制,必須滿足的條件有哪些(不滿足下邊的條件親和性就設(shè)置失?。?
#設(shè)置拓撲域,指定【節(jié)點的標(biāo)簽名】
#【節(jié)點key】就是說,設(shè)置了拓撲域,pod就會往這個標(biāo)簽的節(jié)點進行創(chuàng)建
# 只要滿足key是k8s節(jié)點的表情,那么就是同一個拓撲域
- topologyKey: k8s
# 【pod標(biāo)簽】確定pod的表情,用于二次確認,選中了拓撲域(節(jié)點標(biāo)簽的key),再次選中pod標(biāo)簽才能確認調(diào)度到哪個節(jié)點
labelSelector:
matchExpressions:
#意思是是說,只要key的值是k8s的pod創(chuàng)建在了哪個節(jié)點,“我”就跟隨他。也創(chuàng)建在這個節(jié)點上;
- key: k8s
#建議設(shè)置:in的方式進行匹配,更精準,就要設(shè)置value了
operator: Exists # Exists的方式進行匹配,這里value就不能設(shè)置了
containers:
- name: c1
image: nginx
ports:
- containerPort: 802、創(chuàng)建資源
[root@master deployment-demo]# kubectl apply -f dm-affinity.yaml
3、查看結(jié)果

因為我們集群中只有2個節(jié)點可分配資源,所以我們可以看到上圖有2個pod資源被分配在不同節(jié)點上。
其它三個因為節(jié)點都被占用了,根據(jù)反親和性特點,余下的有“k8s”這個標(biāo)簽pod不會再創(chuàng)建在這兩個節(jié)點上了,所以一直處于Peding狀態(tài)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
kubernetes?k8s?CRD自定義資源學(xué)習(xí)筆記
這篇文章主要介紹了kubernetes?k8s?CRD自定義資源學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例
這篇文章主要為大家介紹了IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Kubernetes調(diào)度管理優(yōu)先級和搶占機制詳解
這篇文章主要為大家介紹了Kubernetes調(diào)度管理優(yōu)先級和搶占機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
云原生技術(shù)kubernetes調(diào)度單位pod的使用詳解
這篇文章主要介紹了云原生技術(shù)kubernetes調(diào)度單位pod的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用K8S,感興趣的朋友可以了解下2021-03-03

