Pod調(diào)度2-親和性調(diào)度(Affinity)

kubernetes提供了一種親和性調(diào)度(Affinity)。它在NodeSelector的基礎(chǔ)之上的進(jìn)行了擴(kuò)展烂琴,可以通過(guò)配置的形式误堡,實(shí)現(xiàn)優(yōu)先選擇滿(mǎn)足條件的Node進(jìn)行調(diào)度铆农,如果沒(méi)有,也可以調(diào)度到不滿(mǎn)足條件的節(jié)點(diǎn)上顶掉,使調(diào)度更加靈活草娜。

Affinity主要分為三類(lèi):

  • nodeAffinity(node親和性): 以node為目標(biāo),解決pod可以調(diào)度到哪些node的問(wèn)題
  • podAffinity(pod親和性) : 以pod為目標(biāo)痒筒,解決pod可以和哪些已存在的pod部署在同一個(gè)拓?fù)溆蛑械膯?wèn)題
  • podAntiAffinity(pod反親和性) : 以pod為目標(biāo)驱还,解決pod不能和哪些已存在pod部署在同一個(gè)拓?fù)溆蛑械膯?wèn)題
    首先我們先看下nodeAffinity,同樣我們舉個(gè)例子凸克,方便理解

nodeAffinity

首先創(chuàng)建pod.yaml
這里使用的是 requiredDuringSchedulingIgnoredDuringExecution 硬相關(guān),沒(méi)有匹配到闷沥,則返回失敗

apiVersion: v1
kind: Pod
metadata:
  name: nodeaffinity #pod名稱(chēng)
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx: latest
  affinity:  #親和性設(shè)置
    nodeAffinity: #設(shè)置node親和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
        nodeSelectorTerms:
        - matchExpressions: # 匹配env的值在["aa","bb"]中的標(biāo)簽
          - key: nodeenv
            operator: In
            values: ["aa","bb"]

生成yaml對(duì)應(yīng)的pod

# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nodeaffinity created

# 查看pod狀態(tài) (運(yùn)行失斘健)
[root@k8s-master01 ~]# kubectl get pods nodeaffinity -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP       NODE    ...... 
nodeaffinity   0/1     Pending   0          6s   <none>   <none>  ......

# 查看Pod的詳情
# 發(fā)現(xiàn)調(diào)度失敗,提示node選擇失敗
[root@k8s-master01 ~]# kubectl describe pod nodeaffinity -n dev
......


#接下來(lái)舆逃,停止pod
[root@k8s-master01 ~]# kubectl delete -f pod.yaml
pod "nodeaffinity" deleted

# 修改文件蚂维,將values: ["aa","bb"]------> ["pro","pod"]
[root@k8s-master01 ~]# vim pod.yaml

# 再次啟動(dòng)
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nodeaffinity created

# 此時(shí)查看,發(fā)現(xiàn)調(diào)度成功路狮,已經(jīng)將pod調(diào)度到了node1上
[root@k8s-master01 ~]# kubectl get pods nodeaffinity -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE  ...... 
nodeaffinity  1/1     Running   0          11s   10.200.1.9   node1 ......

接下來(lái)再演示一下requiredDuringSchedulingIgnoredDuringExecution
同樣先創(chuàng)建pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nodeaffinity
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
  affinity:  #親和性設(shè)置
    nodeAffinity: #設(shè)置node親和性
      preferredDuringSchedulingIgnoredDuringExecution: # 軟限制 優(yōu)先匹配設(shè)定的規(guī)則虫啥,沒(méi)有匹配也可以運(yùn)行
      - weight: 1
        preference:
          matchExpressions: # 匹配env的值在["dev","test"]中的標(biāo)簽(當(dāng)前環(huán)境沒(méi)有)
          - key: nodeenv
            operator: In
            values: ["dev","test"]
# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nodeaffinity created

# 查看pod狀態(tài) (運(yùn)行成功),即使沒(méi)有這樣標(biāo)簽的node
[root@k8s-master01 ~]# kubectl get pod nodeaffinity -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nodeaffinity  1/1     Running   0          40s
NodeAffinity規(guī)則設(shè)置的注意事項(xiàng):
    1 如果同時(shí)定義了nodeSelector和nodeAffinity奄妨,那么必須兩個(gè)條件都得到滿(mǎn)足涂籽,Pod才能運(yùn)行在指定的Node上
    2 如果nodeAffinity指定了多個(gè)nodeSelectorTerms,那么只需要其中一個(gè)能夠匹配成功即可
    3 如果一個(gè)nodeSelectorTerms中有多個(gè)matchExpressions 砸抛,則一個(gè)節(jié)點(diǎn)必須滿(mǎn)足所有的才能匹配成功
    4 如果一個(gè)pod所在的Node在Pod運(yùn)行期間其標(biāo)簽發(fā)生了改變评雌,不再符合該P(yáng)od的節(jié)點(diǎn)親和性需求,則系統(tǒng)將忽略此變化

PodAffinity

PodAffinity主要實(shí)現(xiàn)以運(yùn)行的Pod為參照直焙,實(shí)現(xiàn)讓新創(chuàng)建的Pod跟參照pod在一個(gè)區(qū)域的功能,前面是以Node為參照景东。
同樣首先創(chuàng)建一個(gè)參照Pod yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-target
  namespace: dev
  labels:
    podenv: pro #設(shè)置標(biāo)簽
spec:
  containers:
  - name: nginx
    image: nginx: latest
  nodeName: node1 # 將目標(biāo)pod名確指定到node1上
# 啟動(dòng)目標(biāo)pod
[root@k8s-master01 ~]# kubectl create -f pod-target.yaml
pod/pod-target created

# 查看pod狀況
[root@k8s-master01 ~]# kubectl get pods  pod-target -n dev
NAME                     READY   STATUS    RESTARTS   AGE
pod-target   1/1     Running   0          4s

2)創(chuàng)建pod-podaffinity-required.yaml,內(nèi)容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-podaffinity-required
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx: latest
  affinity:  #親和性設(shè)置
    podAffinity: #設(shè)置pod親和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制 同樣還有軟連接效果類(lèi)似奔誓,只是即使未匹配依然可以運(yùn)行
      - labelSelector:
          matchExpressions: # 匹配env的值在["aa","bb"]中的標(biāo)簽
          - key: podenv
            operator: In
            values: ["aa","bb"]
        topologyKey: kubernetes.io/hostname
# 啟動(dòng)pod
[root@k8s-master01 ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created

# 查看pod狀態(tài)斤吐,發(fā)現(xiàn)未運(yùn)行
[root@k8s-master01 ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE
pod-podaffinity-required   0/1     Pending   0          9s

# 查看詳細(xì)信息
[root@k8s-master01 ~]# kubectl describe pods pod-podaffinity-required  -n dev
......
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are available: 2 node(s) didn't match pod affinity rules, 1 node(s) had taints that the pod didn't tolerate.

# 接下來(lái)修改  values: ["aa","bb"]----->values:["pro","pod"]
[root@k8s-master01 ~]# vim pod-podaffinity-required.yaml

# 然后重新創(chuàng)建pod,查看效果
[root@k8s-master01 ~]# kubectl delete -f  pod-podaffinity-required.yaml
pod "pod-podaffinity-required" deleted
[root@k8s-master01 ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created

# 發(fā)現(xiàn)此時(shí)Pod運(yùn)行正常
[root@k8s-master01 ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
pod-podaffinity-required   1/1     Running   0          6s    <none>

podAntiAffinity

這個(gè)與podAAffinity 使用方式完全一致厨喂,只是效果相反和措,不再贅述。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杯聚,一起剝皮案震驚了整個(gè)濱河市臼婆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幌绍,老刑警劉巖颁褂,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故响,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颁独,警方通過(guò)查閱死者的電腦和手機(jī)彩届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)誓酒,“玉大人樟蠕,你說(shuō)我怎么就攤上這事】扛蹋” “怎么了寨辩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)歼冰。 經(jīng)常有香客問(wèn)我靡狞,道長(zhǎng),這世上最難降的妖魔是什么隔嫡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任甸怕,我火速辦了婚禮,結(jié)果婚禮上腮恩,老公的妹妹穿的比我還像新娘梢杭。我一直安慰自己,他們只是感情好秸滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布武契。 她就那樣靜靜地躺著,像睡著了一般荡含。 火紅的嫁衣襯著肌膚如雪吝羞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天内颗,我揣著相機(jī)與錄音钧排,去河邊找鬼。 笑死均澳,一個(gè)胖子當(dāng)著我的面吹牛恨溜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播找前,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糟袁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了躺盛?” 一聲冷哼從身側(cè)響起项戴,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎槽惫,沒(méi)想到半個(gè)月后周叮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辩撑,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年仿耽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了合冀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡项贺,死狀恐怖君躺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情开缎,我是刑警寧澤棕叫,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站奕删,受9級(jí)特大地震影響谍珊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜急侥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侮邀。 院中可真熱鬧坏怪,春花似錦、人聲如沸绊茧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)华畏。三九已至鹏秋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亡笑,已是汗流浹背侣夷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仑乌,地道東北人百拓。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晰甚,于是被迫代替她去往敵國(guó)和親衙传。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在默認(rèn)情況下厕九,一個(gè)Pod在哪個(gè)Node節(jié)點(diǎn)上運(yùn)行蓖捶,是由Scheduler組件采用相應(yīng)的算法計(jì)算出來(lái)的,這個(gè)過(guò)程是不...
    _大叔_閱讀 747評(píng)論 0 2
  • node 節(jié)點(diǎn)選擇器 我們?cè)趧?chuàng)建 pod 資源的時(shí)候扁远,pod 會(huì)根據(jù) schduler 進(jìn)行調(diào)度俊鱼,那么默認(rèn)會(huì)調(diào)度到...
    菜頭_355f閱讀 459評(píng)論 0 0
  • 前面文章一部分已有介紹Pod親和性相關(guān)的調(diào)度策略算法分析刻像,接下來(lái)我們繼續(xù)Pod相關(guān)調(diào)度算法分析: 三 POD親和性...
    Xiao_Yang閱讀 1,605評(píng)論 0 1
  • 前言:由于Affinity對(duì)pod的調(diào)度更加精細(xì),我們?cè)谑褂弥兄饾u代替了NodeSelector亭引∫锼伲可以分為node...
    玄德公筆記閱讀 1,518評(píng)論 0 1
  • Pod調(diào)度方式有,自動(dòng)調(diào)度焙蚓、定向調(diào)度纹冤、Node親和性調(diào)度、Pod親和性和互斥性調(diào)度 自動(dòng)調(diào)度:Deployment...
    hnbcao閱讀 1,389評(píng)論 1 0