完事后再聊應用場景,K8S調(diào)度實戰(zhàn):Node Affinity

寫在開篇

Node Affinity(節(jié)點親和性)允許在節(jié)點級別上指定一些條件來控制Pod被調(diào)度到哪些節(jié)點上霉晕。它還有兩種策略笼痛,本篇通過實戰(zhàn)演示如何使用兩種策略來控制Pod的調(diào)度士八。

測試環(huán)境

還是老樣子容燕,本次實戰(zhàn)繼續(xù)使用以下K8S集群環(huán)境進行:

節(jié)點 主機名 IP
Master節(jié)點 k8s-b-master 192.168.11.100
工作節(jié)點1 k8s-b-node01 192.168.11.101
工作節(jié)點2 k8s-b-node02 192.168.11.102
工作節(jié)點3 k8s-b-node03 192.168.11.103
工作節(jié)點4 k8s-b-node04 192.168.11.104
工作節(jié)點5 k8s-b-node05 192.168.11.105
工作節(jié)點6 k8s-b-node06 192.168.11.106

開始實戰(zhàn)

在本次實戰(zhàn)中,使用一個名為goweb的測試應用程序來演示Node Affinity的使用婚度。goweb是我用Golang開發(fā)的簡單Web應用程序蘸秘,用于測試和驗證K8S的調(diào)度策略。當然了蝗茁,你也可以自己開發(fā)一個類似的應用醋虏,然后使用自己的應用來進行本篇的實戰(zhàn)內(nèi)容。

策略1

在這個實戰(zhàn)案例中哮翘,我將使用requiredDuringSchedulingIgnoredDuringExecution策略颈嚼,該策略要求Pod只能調(diào)度到特定的節(jié)點上。 我將創(chuàng)建一個Node Affinity規(guī)則饭寺,要求goweb應用只能調(diào)度到主機名為k8s-b-node03的節(jié)點上阻课。

首先,需要創(chuàng)建一個名為goweb-node-affinity.yaml的文件艰匙,并將以下內(nèi)容復制到文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb
  namespace: goweb-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      containers:
      - name: goweb
        image: 192.168.11.253/library/goweb:latest
        ports:
        - containerPort: 80
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-b-node03

保存文件后限煞,使用以下命令應用goweb應用的Node Affinity規(guī)則:

kubectl apply -f goweb-node-affinity.yaml

現(xiàn)在,K8S調(diào)度器將只會將goweb應用調(diào)度到主機名為k8s-b-node03的節(jié)點上员凝。

[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
goweb-5559b4bbf5-5mpd8   1/1     Running   0          64s   10.244.199.138   k8s-b-node03   <none>           <none>
goweb-5559b4bbf5-lbq4j   1/1     Running   0          63s   10.244.199.139   k8s-b-node03   <none>           <none>
goweb-5559b4bbf5-lqkzh   1/1     Running   0          70s   10.244.199.137   k8s-b-node03   <none>           <none>

策略2

在這個實戰(zhàn)案例中署驻,我將使用preferredDuringSchedulingIgnoredDuringExecution策略,該策略盡量將Pod調(diào)度到滿足條件的節(jié)點上,但不是強制要求旺上。 我將創(chuàng)建一個Node Affinity規(guī)則瓶蚂,優(yōu)先將goweb應用調(diào)度到擁有標簽app=goweb-node的節(jié)點上。

首先抚官,我創(chuàng)建一個名為goweb-preferred-node-affinity.yaml的文件扬跋,并將以下內(nèi)容復制到文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb
  namespace: goweb-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      containers:
      - name: goweb
        image: 192.168.11.253/library/goweb:latest
        ports:
        - containerPort: 80
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: app
                operator: In
                values:
                - goweb-node

保存文件后,使用以下命令應用goweb應用的Node Affinity規(guī)則:

kubectl apply -f goweb-preferred-node-affinity.yaml

現(xiàn)在凌节,K8S調(diào)度器將優(yōu)先將goweb應用調(diào)度到擁有標簽app=goweb-node的節(jié)點上钦听,但如果沒有滿足條件的節(jié)點,它仍然可以調(diào)度到其他節(jié)點上倍奢。

查看node標簽和調(diào)度結(jié)果:

# 查看label:
[root@k8s-b-master ~]# kubectl get node --show-labels
NAME           STATUS   ROLES           AGE   VERSION   LABELS
k8s-b-master   Ready    control-plane   49d   v1.25.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-b-node01   Ready    <none>          49d   v1.25.4   app=goweb-node,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-node01,kubernetes.io/os=linux
k8s-b-node02   Ready    <none>          49d   v1.25.4   app=goweb-node,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-node02,kubernetes.io/os=linux
...

# 調(diào)度結(jié)果:
[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
goweb-58799f9b4c-cd5j4   1/1     Running   0          16s   10.244.51.204    k8s-b-node01   <none>           <none>
goweb-58799f9b4c-hpwlt   1/1     Running   0          16s   10.244.232.147   k8s-b-node02   <none>           <none>
goweb-58799f9b4c-ksps5   1/1     Running   0          16s   10.244.232.146   k8s-b-node02   <none>           <none>

刪除app標簽后再次查看調(diào)度結(jié)果:

# 刪除
kubectl label nodes k8s-b-node01 app-
kubectl label nodes k8s-b-node02 app-

# 調(diào)度結(jié)果:
[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
goweb-58799f9b4c-5hr8h   1/1     Running   0          2s    10.244.25.77     k8s-b-node05   <none>           <none>
goweb-58799f9b4c-5vnr9   1/1     Running   0          2s    10.244.232.148   k8s-b-node02   <none>           <none>
goweb-58799f9b4c-hwxjc   1/1     Running   0          2s    10.244.151.4     k8s-b-node06   <none>           <none>

注意到了吧朴上?刪除app標簽后,就沒有滿足條件的節(jié)點了卒煞,但它仍然可以調(diào)度到其他節(jié)點上痪宰。通過實戰(zhàn),已經(jīng)證實了這一點畔裕。

使用場景

下面聊聊兩種策略在實際工作中可能的使用場景衣撬。

1. requiredDuringSchedulingIgnoredDuringExecution

它的特點是:強制要求Pod只能調(diào)度到特定節(jié)點的策略“缛模可能適用的場景:

  • 硬件特性要求:比如對底層硬件有特殊要求的應用具练,就可以將Pod調(diào)度到擁有特定標簽貨其它屬性的節(jié)點上。
  • 數(shù)據(jù)本地性要求:比如需要訪問特定數(shù)據(jù)源的應用甜无,將Pod調(diào)度到與數(shù)據(jù)源最近的節(jié)點上扛点,這樣可以減少網(wǎng)絡延遲和提高性能。
  • 資源隔離:將特定類型的任務或工作負載隔離到專用的節(jié)點上岂丘。

舉個貼近實際的例子陵究,假設有一組節(jié)點,其中幾個節(jié)點擁有牛逼的CPU和內(nèi)存資源奥帘。希望將一些需要較高計算能力的任務調(diào)度到這些節(jié)點上铜邮。這時候就可以使用此策略來指定這些節(jié)點的標簽或其他屬性,就可以將Pod限制在這些節(jié)點上了寨蹋。

2. preferredDuringSchedulingIgnoredDuringExecution

它的特點是:優(yōu)先選擇滿足條件的節(jié)點進行調(diào)度的策略牲距。可能適用的場景:

  • 資源利用率優(yōu)化:比如希望將Pod調(diào)度到擁有特定資源的節(jié)點上钥庇,但如果沒有滿足條件的節(jié)點牍鞠,仍然可以將Pod調(diào)度到其他節(jié)點上。
  • 可用性和容錯性:為了提高應用程序的可用性和容錯性评姨,我們可以將Pod調(diào)度到多個節(jié)點上难述,但仍然優(yōu)先將其調(diào)度到特定節(jié)點上萤晴。如果該節(jié)點不可用,調(diào)度器將選擇次優(yōu)節(jié)點進行調(diào)度胁后。

舉個例子店读,假設有一組節(jié)點,其中一些節(jié)點的網(wǎng)卡連接的是光交換機攀芯,網(wǎng)絡更快屯断。希望將網(wǎng)絡密集型的應用優(yōu)先調(diào)度到這些節(jié)點上,這時候就可以指定這些節(jié)點的網(wǎng)絡特性標簽或其他屬性侣诺。

再舉個例子殖演,假設在具有不同地理位置的多個數(shù)據(jù)中心中部署應用。就可以優(yōu)先將Pod調(diào)度到與應用所服務的區(qū)域最近的節(jié)點上年鸳,以此來達到減少延遲趴久、提高用戶體驗的效果。

我為什么要用“可能適用的場景”來說明搔确?因為我覺得彼棍,看這篇文章的你應該可以想到更好的應用場景,歡迎留言討論膳算。

最后總結(jié)

接下來做個關鍵性的總結(jié):

  1. Node Affinity有兩種策略:
  • requiredDuringSchedulingIgnoredDuringExecution:調(diào)度器只有在規(guī)則被滿足的時候才能執(zhí)行調(diào)度(硬策略)
  • preferredDuringSchedulingIgnoredDuringExecution:調(diào)度器會嘗試尋找滿足對應規(guī)則的節(jié)點座硕。如果找不到匹配的節(jié)點,調(diào)度器仍然會調(diào)度該Pod(軟策略)
  1. 匹配方式有兩種:
  • matchExpressions:基于標簽的匹配涕蜂,可以包含一個或多個條件华匾,每個條件由鍵、運算符和值組成宇葱,適用于更復雜的標簽匹配邏輯的場景瘦真。
  • matchFields:允許基于節(jié)點的字段選擇節(jié)點刊头,而不是基于標簽黍瞧。比如指定節(jié)點上的字段名稱和值進行匹配。這對于選擇節(jié)點的特定屬性非常有用原杂,例如節(jié)點的操作系統(tǒng)印颤、內(nèi)存大小等。
  1. operator屬性可能的枚舉值:
  • "DoesNotExist": 用于檢查標簽或注解不存在的情況穿肄。
  • "Exists": 用于檢查標簽或注解存在的情況年局。
  • "Gt": 用于數(shù)字類型的匹配,表示大于指定值咸产。
  • "In": 用于匹配給定值列表中的任何一個值矢否。
  • "Lt": 用于數(shù)字類型的匹配,表示小于指定值脑溢。
  • "NotIn": 用于匹配不在給定值列表中的任何一個值僵朗。

希望本篇的實戰(zhàn)能對你理解和使用K8S中的Node Affinity特性有所幫助。你可以根據(jù)實際需求和集群環(huán)境,靈活應用Node Affinity來優(yōu)化應用的調(diào)度行為验庙。好了顶吮,本篇就到此結(jié)束,有問題可以評論區(qū)留言討論或者私信討論粪薛。


注重運維實戰(zhàn)悴了,我們比誰都拼!日常分享實用干貨违寿,助你成為運維大神湃交!探索技術的魅力,從這里開始陨界!

點擊鏈接巡揍,暢讀精彩文章,從中獲取洞見菌瘪,為自己的技術之旅注入新的動力腮敌!關注我的微信公眾號,不錯過更多精彩內(nèi)容俏扩。

【K8S(專注于深入研究K8S相關的各種技術和知識分享糜工。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2474851867500544003&count=3#wechat_redirect

【Go&Py(涵蓋了Go和Python兩種流行的編程語言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869340550028771330&count=3#wechat_redirect

【Ops(運維領域的討論和交流录淡。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869345486221262853&count=3#wechat_redirect

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捌木,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嫉戚,更是在濱河造成了極大的恐慌刨裆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彬檀,死亡現(xiàn)場離奇詭異帆啃,居然都是意外死亡,警方通過查閱死者的電腦和手機窍帝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門努潘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坤学,你說我怎么就攤上這事疯坤。” “怎么了深浮?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵压怠,是天一觀的道長。 經(jīng)常有香客問我飞苇,道長菌瘫,這世上最難降的妖魔是什么洋闽? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮突梦,結(jié)果婚禮上诫舅,老公的妹妹穿的比我還像新娘。我一直安慰自己宫患,他們只是感情好刊懈,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娃闲,像睡著了一般虚汛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皇帮,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天卷哩,我揣著相機與錄音,去河邊找鬼属拾。 笑死将谊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的渐白。 我是一名探鬼主播尊浓,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纯衍!你這毒婦竟也來了栋齿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤襟诸,失蹤者是張志新(化名)和其女友劉穎瓦堵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歌亲,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡菇用,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了应结。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刨疼。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡泉唁,死狀恐怖鹅龄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亭畜,我是刑警寧澤扮休,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拴鸵,受9級特大地震影響玷坠,放射性物質(zhì)發(fā)生泄漏蜗搔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一八堡、第九天 我趴在偏房一處隱蔽的房頂上張望樟凄。 院中可真熱鬧,春花似錦兄渺、人聲如沸缝龄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叔壤。三九已至,卻和暖如春口叙,著一層夾襖步出監(jiān)牢的瞬間炼绘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工妄田, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俺亮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓疟呐,卻偏偏與公主長得像铅辞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萨醒,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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