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

查看三個(gè)節(jié)點(diǎn)的標(biāo)簽,分別擁有k8s=master,k8s=node1,k8s=node2標(biāo)簽
2.編輯資源清單設(shè)置節(jié)點(diǎn)親和性
測(cè)試前把我們資源都刪除掉
[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é)點(diǎn)選擇器列表
- matchExpressions:
- key: k8s
values:
- node1
- node2
operator: In
preferredDuringSchedulingIgnoredDuringExecution: #軟限制,不一定滿足,但會(huì)優(yōu)先滿足,相當(dāng)于調(diào)高了調(diào)度到優(yōu)先級(jí)
- 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必須是一個(gè)單一的元素,且值將被解釋稱一個(gè)整數(shù))
#Lt:小于(value必須是一個(gè)單一的元素,且值將被解釋稱一個(gè)整數(shù))
operator: In
containers:
- name: c1
image: nginx
ports:
- containerPort: 803.查看資源驗(yàn)證親和性
我們可以看到,創(chuàng)建的20個(gè)Pod只有一個(gè)被調(diào)度到node2上,上邊節(jié)點(diǎn)調(diào)度更親和節(jié)點(diǎn)1

三、podAffinity pod親和性
基于“節(jié)點(diǎn)標(biāo)簽”進(jìn)行設(shè)置,第一個(gè)pod副本創(chuàng)建在了哪個(gè)節(jié)點(diǎn)上,那么其余副本也會(huì)創(chuàng)建在這個(gè)節(jié)點(diǎn)上;
拓?fù)溆颍汗?jié)點(diǎn)機(jī)器的標(biāo)簽的key和value都相等的機(jī)器,就是同一個(gè)拓?fù)溆颍?/p>
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è)置拓?fù)溆颍付ā竟?jié)點(diǎn)的標(biāo)簽名】
#【節(jié)點(diǎn)key】就是說,設(shè)置了拓?fù)溆?,pod就會(huì)往這個(gè)標(biāo)簽的節(jié)點(diǎn)進(jìn)行創(chuàng)建
# 只要滿足key是k8s節(jié)點(diǎn)的表情,那么就是同一個(gè)拓?fù)溆?
- topologyKey: k8s
# 【pod標(biāo)簽】確定pod的表情,用于二次確認(rèn),選中了拓?fù)溆颍ü?jié)點(diǎn)標(biāo)簽的key),再次選中pod標(biāo)簽才能確認(rèn)調(diào)度到哪個(gè)節(jié)點(diǎn)
labelSelector:
matchExpressions:
#意思是是說,只要key的值是k8s的pod創(chuàng)建在了哪個(gè)節(jié)點(diǎn),“我”就跟隨他。也創(chuàng)建在這個(gè)節(jié)點(diǎn)上;
- key: k8s
#建議設(shè)置:in的方式進(jìn)行匹配,更精準(zhǔn),就要設(shè)置value了
operator: Exists # Exists的方式進(jìn)行匹配,這里value就不能設(shè)置了
containers:
- name: c1
image: nginx
ports:
- containerPort: 802、創(chuàng)建資源
[root@master deployment-demo]# kubectl apply -f dm-affinity.yaml
3、查看結(jié)果
都運(yùn)行在了node1節(jié)點(diǎn)上

四、podAntAffinity-pod的反親和性
- pod的親和性:符合拓?fù)溆虻姆秶?,指定?biāo)簽的pod創(chuàng)建在哪里,其他pod就創(chuàng)建在哪里;
- pod的反親和性:與之相反,符合拓?fù)溆虻姆秶?,指定?biāo)簽的pod創(chuàng)建在哪里,其他pod就不能創(chuàng)建在哪里;
1、編輯資源清單
親和性和反親和性的配置就下邊一個(gè)標(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è)置拓?fù)溆?,指定【?jié)點(diǎn)的標(biāo)簽名】
#【節(jié)點(diǎn)key】就是說,設(shè)置了拓?fù)溆?,pod就會(huì)往這個(gè)標(biāo)簽的節(jié)點(diǎn)進(jìn)行創(chuàng)建
# 只要滿足key是k8s節(jié)點(diǎn)的表情,那么就是同一個(gè)拓?fù)溆?
- topologyKey: k8s
# 【pod標(biāo)簽】確定pod的表情,用于二次確認(rèn),選中了拓?fù)溆颍ü?jié)點(diǎn)標(biāo)簽的key),再次選中pod標(biāo)簽才能確認(rèn)調(diào)度到哪個(gè)節(jié)點(diǎn)
labelSelector:
matchExpressions:
#意思是是說,只要key的值是k8s的pod創(chuàng)建在了哪個(gè)節(jié)點(diǎn),“我”就跟隨他。也創(chuàng)建在這個(gè)節(jié)點(diǎn)上;
- key: k8s
#建議設(shè)置:in的方式進(jìn)行匹配,更精準(zhǔn),就要設(shè)置value了
operator: Exists # Exists的方式進(jìn)行匹配,這里value就不能設(shè)置了
containers:
- name: c1
image: nginx
ports:
- containerPort: 802、創(chuàng)建資源
[root@master deployment-demo]# kubectl apply -f dm-affinity.yaml
3、查看結(jié)果

因?yàn)槲覀兗褐兄挥?個(gè)節(jié)點(diǎn)可分配資源,所以我們可以看到上圖有2個(gè)pod資源被分配在不同節(jié)點(diǎn)上。
其它三個(gè)因?yàn)楣?jié)點(diǎn)都被占用了,根據(jù)反親和性特點(diǎn),余下的有“k8s”這個(gè)標(biāo)簽pod不會(huì)再創(chuàng)建在這兩個(gè)節(jié)點(diǎn)上了,所以一直處于Peding狀態(tài)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
K8S之StatefulSet有狀態(tài)服務(wù)詳解
本文主要介紹了K8S之StatefulSet有狀態(tài)服務(wù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
二進(jìn)制方式安裝?Kubernetes1.18.3版本實(shí)現(xiàn)腳本
這篇文章主要為大家介紹了二進(jìn)制方式安裝Kubernetes1.18.3版本實(shí)現(xiàn)腳本,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
kubelet為cadvisor添加namespace/pod/container標(biāo)簽示例詳解
這篇文章主要為大家介紹了kubelet為cadvisor添加namespace/pod/container標(biāo)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問題排查
這篇文章主要介紹了詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問題排查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
在AWS-EC2中安裝Minikube集群的詳細(xì)過程
這篇文章主要介紹了在AWS-EC2中安裝Minikube集群,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

