K8s影響Pod調(diào)度相關(guān)

調(diào)度方式

  • 定向調(diào)度
  • 親和性調(diào)度
  • 污點與容忍

1. 定向調(diào)度

1.1 nodeName

nodeName 用于強(qiáng)制約束將Pod調(diào)度到指定Name的Node節(jié)點上。這種方式持舆,其實是跳過Scheduler的調(diào)度邏輯,直接將Pod調(diào)度到指定名稱的節(jié)點上锥腻。

1.2 nodeSelector

nodeSelector 用于將Pod調(diào)度到指定標(biāo)簽的Node節(jié)點上。它是通過k8s的label-selector機(jī)制實現(xiàn)的母谎,在Pod創(chuàng)建之前旷太,會由Scheduler使用MatchNodeSelector調(diào)度策略進(jìn)行l(wèi)abel匹配,找出目標(biāo)node销睁。然后將Pod調(diào)度到目標(biāo)節(jié)點供璧,該匹配是強(qiáng)制約束

apiVersion: v1
kind: Pod
metadata:
  name: podsc
  namespace: dev
spec:
  #nodeName: 192.168.0.30
  # nodeSelector:
  #   nodename: node20
  containers:
    - image:  192.168.0.200/public/nginx:v1
      imagePullPolicy: Always
      name:  podsc

2.親和性調(diào)度

2.1 nodeAffinity node親和性

nodeAffinity 是以node為目標(biāo),解決Pod可以調(diào)度到那些node的問題冻记。
注意:
a. 如果同時設(shè)置了nodeSelector和nodeAffinity那么必須要滿足這兩個條件才能調(diào)度到節(jié)點上睡毒。
b. 如果nodeAffinity指定了多個nodeSelectorTerms,那么只需要滿足一個能夠匹配成功即可調(diào)度冗栗。
c. 如果一個nodeSelectorTerms中有多個matchExpressions演顾,則同一個節(jié)點必須要滿足所有的才能匹配成功。
d. 如果一個pod所在的Node在Pod運(yùn)行期間標(biāo)簽發(fā)生了改變隅居,不再符合Pod的節(jié)點親和性需求钠至,則系統(tǒng)忽略此變化。因為已經(jīng)經(jīng)過scheduler調(diào)度胎源。只有重新部署觸發(fā)scheduler才能重新調(diào)度棉钧。
應(yīng)用場景:

  1. 特殊資源使用:例如磁盤ssd,pod需要高IO性能涕蚤。
  2. 特殊場景:重點業(yè)務(wù)需要部署在常年沒有出現(xiàn)過故障的機(jī)器上等宪卿。
2.1.1 requiredDuringSchedulingIgnoredDuringExecution 硬限制,必須要node滿足這些條件才能調(diào)度万栅,否則就調(diào)度不上去, 不經(jīng)過scheduler 這個也屬于定向調(diào)度
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
            - key: nodename
              operator: In
              values: ["node20", "node21"]
2.1.2 preferredDuringSchedulingIgnoredDuringExecution 軟限制佑钾,非必要滿足這些條件,需要經(jīng)過scheduler烦粒,當(dāng)不滿足這些條件時則選擇其他節(jié)點休溶。
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 10
          preference: 
            matchExpressions:
            - key: nodename
              operator: In
              values: ["node24", "node23"] //沒有這些標(biāo)簽的
2.2 podAffinity pod親和性

podAffinity 是以pod為目標(biāo),解決pod可以和哪些已存在的pod部署在同一個拓?fù)溆蛑械膯栴}。
應(yīng)用場景:

  1. Pod之間需要頻繁交互兽掰,有必要使用親和性讓兩個應(yīng)用盡可能的靠近芭碍,這樣可以減少因網(wǎng)絡(luò)通信而帶來的性能損耗。
  2. 高可用場景下禾进,將同一個業(yè)務(wù)的pod將其自動放到部署了相同應(yīng)用pod的機(jī)器上豁跑。
2.2.1 preferredDuringSchedulingIgnoredDuringExecution 軟限制即不滿足也可調(diào)度
# pod親和度參照Pod
apiVersion: v1
kind: Pod
metadata:
  name: test
  namespace: dev
  labels:
    kk: vv
spec:
  containers:
  - name: test
    image:  192.168.0.200/public/nginx:v1

# Pod親和度使用軟限制
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution: #硬限制
        - weight: 10
          podAffinityTerm:
            namespaces: #指定參照Pod的名稱空間[]
            - "dev"
            topologyKey: kubernetes.io/hostname #指定匹配后的調(diào)度作用域
            labelSelector:
              matchExpressions:
              - key: kk
                operator: In
                values: 
                  - "vv"
                  - "bb"
2.2.2 requiredDuringSchedulingIgnoredDuringExecution 硬限制不滿足則無法調(diào)度直接報錯
# pod親和度參照Pod
apiVersion: v1
kind: Pod
metadata:
  name: test
  namespace: dev
  labels:
    kk: vv
spec:
  containers:
  - name: test
    image:  192.168.0.200/public/nginx:v1
# Pod親和度使用硬限制
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: "kk"
            operator: In
            values:
            - "yy"
            - "xx"
        namespaces:
        - "dev"
        topologyKey: kubernetes.io/hostname
2.3 podAntiAffinity pod反親性

podAntiAffinity 是以pod為目標(biāo)廉涕,解決pod不能和哪些已存在pod部署在同一個拓?fù)溆蛑械膯栴}

  1. 當(dāng)應(yīng)用采用多副本部署時泻云,有必要采用反親和性進(jìn)行打散,可以有效提高服務(wù)的高可用性狐蜕。
    注意:反親和硬限制情況下宠纯,如果沒有 匹配到指定標(biāo)簽的pod 那么就會按照其他算法來進(jìn)行分配。一般還會搭配其他調(diào)度算法進(jìn)行調(diào)度层释。
2.3.1 Pod反親和性requiredDuringSchedulingIgnoredDuringExecution硬限制
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    podAntiAffinity: #Pod反親和性
      requiredDuringSchedulingIgnoredDuringExecution: #硬限制
      - labelSelector:
          matchExpressions: #匹配kk的值在yy 或者 xx 中的標(biāo)簽
          - key: "kk"
            operator: In
            values:
            - "yy"
            - "vv"
        namespaces:
        - "dev"
        topologyKey: kubernetes.io/hostname #作用域主機(jī)打散
2.3.1 Pod反親和性preferredDuringSchedulingIgnoredDuringExecution軟限制
apiVersion: v1
kind: Pod
metadata:
  name: affinitytest
  namespace: dev
spec:
  containers:
  - name: affinitytest
    image: 192.168.0.200/public/nginx:v1
    imagePullPolicy: Always
  affinity:
    podAntiAffinity: #Pod反親和性
      preferredDuringSchedulingIgnoredDuringExecution: #硬限制
      - labelSelector:
          matchExpressions: #匹配kk的值在yy 或者 xx 中的標(biāo)簽
          - key: "kk"
            operator: In
            values:
            - "yy"
            - "vv"
        namespaces:
        - "dev"
        topologyKey: kubernetes.io/hostname #作用域主機(jī)打散

3.污點與容忍

3.1 污點

通過在Node上添加污點屬性婆瓜,決定是否允許Pod調(diào)度過來。
污點的格式為:key=value:effect
key和value是污點的標(biāo)簽贡羔,effect描述污點的作用廉白,支持如下三個選項:

  • PreferNoSchedule: Scheduler盡量避免把Pod調(diào)度到具有該污點的Node上,除非沒有其他節(jié)點可調(diào)度乖寒。
  • NoSchdule: Scheduler不會把Pod調(diào)度到具有該污點的Node上猴蹂,但是不會影響當(dāng)前Node上已經(jīng)存在的Pod。
  • NoExecute: Scheduler不會把Pod調(diào)度到具有該污點的Node上楣嘁,同時也會將Node上已經(jīng)存在的Pod隔離磅轻,除非是容忍程度為NoExecute。
    注意:當(dāng)節(jié)點打上污點設(shè)置為NoSchedule時通過指定節(jié)點(nodeName)任然可以設(shè)置運(yùn)行到該節(jié)點,但是使用nodeSelector就不可以逐虚。
  • 設(shè)置污點:
kubectl taint node NODENAME KEY=VALUE:EFFECT
  • 去除污點
kubectl taint nodes NODENAME KEY:EFFECT-
  • 去除所有污點
kubectl taint nodes NODENAME KEY-
3.2 容忍污點

當(dāng)節(jié)點設(shè)置了污點時聋溜,如果允許Pod調(diào)度到該污點上時需要在pod中設(shè)置容忍污點。 pod.spec.toleroations

apiVersion: v1
kind: Pod
metadata:
  name: test33
  namespace: dev
  labels:
    kk: vv
spec:
  nodeName: 192.168.0.21
  containers:
  - name: test33
    image:  192.168.0.200/public/nginx:v1
  tolerations: //容忍污點
  - key: "tag" // 對應(yīng)污點KEY叭爱,若為空則意味著匹配所有的鍵
    operator: "Equal" // 匹配符撮躁,支持Equal和Exists(默認(rèn))
    value: "tagtaint" // 對應(yīng)污點值
    effect: "NoExecute" // 對應(yīng)污點的級別,空則匹配所有
    #tolerationSeconds: //容忍時間买雾,當(dāng)effect為NoExecute時生效馒胆,表示pod在Node上停留的時間,當(dāng)時間到期時將會從此節(jié)點轉(zhuǎn)移走凝果,若永遠(yuǎn)沒有設(shè)置則永遠(yuǎn)不會被剔除
[root@master10 yaml]# kgpoowiden dev
NAME     READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
test33   1/1     Running   0          9s    172.20.4.223   192.168.0.21   <none>           <none>
[root@master10 yaml]# kdno 192.168.0.21 | grep Ta
Taints:             tag=tagtaint:NoExecute

4.隔離與驅(qū)逐

    1. 通常在需要對Node進(jìn)行停機(jī)維護(hù)時祝迂,一般需要進(jìn)行對節(jié)點的隔離拒絕新的Pod調(diào)度到該節(jié)點上。
kubectl describe node NODENAME

程序也是通過對節(jié)點添加不可調(diào)度的污點來進(jìn)行的隔離器净,使用的隔離程度為:NoSchedule型雳,使用nodeName來進(jìn)行指定調(diào)度,依然可以調(diào)度上去,可以避免資源不足導(dǎo)致新的Pod所有節(jié)點不可調(diào)度后導(dǎo)致節(jié)點Pending纠俭。

    1. 第二步即為對node節(jié)點上的Pod進(jìn)行驅(qū)逐沿量,drain會是一個平滑終止的過程,不會影響業(yè)務(wù)冤荆。
kubectl drain NODENAME --ignore-daemonsets --force

通常情況下需要忽略掉daemonset朴则,此處還有一些沒有被控制器控制的pod需要強(qiáng)制驅(qū)逐

    1. 查看當(dāng)前節(jié)點上剩余的pod
[root@master10 yaml]# kgpoowideall | grep 0.20
default       daemon1-4w2ng                                1/1     Running            0          28m     172.20.3.156   192.168.0.20   <none>           <none>
kube-system   kube-flannel-ds-amd64-wngbj                  1/1     Running            0          28m     192.168.0.20   192.168.0.20   <none>           <none>
kube-system   node-local-dns-7frgs                         1/1     Running            8          41d     192.168.0.20   192.168.0.20   <none>           <none>
monitoring    node-exporter-52rqc                          2/2     Running            16         41d     192.168.0.20   192.168.0.20   <none>           <none>
    1. 確認(rèn)沒有后就可以進(jìn)行維護(hù)或者將機(jī)器踢出集群后進(jìn)行維護(hù)。維護(hù)完畢后取消隔離钓简。
kubectl uncordon NODENAME
    1. 通過scalePod數(shù)量查看節(jié)點是否調(diào)度后完畢乌妒。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市外邓,隨后出現(xiàn)的幾起案子撤蚊,更是在濱河造成了極大的恐慌,老刑警劉巖损话,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦啸,死亡現(xiàn)場離奇詭異,居然都是意外死亡丧枪,警方通過查閱死者的電腦和手機(jī)光涂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拧烦,“玉大人忘闻,你說我怎么就攤上這事∈豪椋” “怎么了服赎?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長交播。 經(jīng)常有香客問我重虑,道長,這世上最難降的妖魔是什么秦士? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任缺厉,我火速辦了婚禮,結(jié)果婚禮上隧土,老公的妹妹穿的比我還像新娘提针。我一直安慰自己,他們只是感情好曹傀,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布辐脖。 她就那樣靜靜地躺著,像睡著了一般皆愉。 火紅的嫁衣襯著肌膚如雪嗜价。 梳的紋絲不亂的頭發(fā)上艇抠,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音久锥,去河邊找鬼家淤。 笑死,一個胖子當(dāng)著我的面吹牛瑟由,可吹牛的內(nèi)容都是我干的絮重。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼歹苦,長吁一口氣:“原來是場噩夢啊……” “哼青伤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暂氯,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤潮模,失蹤者是張志新(化名)和其女友劉穎亮蛔,沒想到半個月后痴施,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡究流,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年辣吃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芬探。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡神得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偷仿,到底是詐尸還是另有隱情哩簿,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布酝静,位于F島的核電站节榜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏别智。R本人自食惡果不足惜宗苍,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薄榛。 院中可真熱鬧讳窟,春花似錦、人聲如沸敞恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硬猫。三九已至补箍,卻和暖如春倚评,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馏予。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工天梧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霞丧。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓呢岗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛹尝。 傳聞我的和親對象是個殘疾皇子后豫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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