溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析

發(fā)布時(shí)間:2021-11-22 17:13:43 來源:億速云 閱讀:146 作者:柒染 欄目:云計(jì)算

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

(避免Pod和Node同時(shí)出現(xiàn)在一小段文字中,所以Node以節(jié)點(diǎn)漢字表述)

Taint和Toleration

污點(diǎn)的理論支撐

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析

1.1 污點(diǎn)設(shè)置有哪些影響效果

使用效果(Effect):

  • PreferNoSchedule:調(diào)度器盡量避免把Pod調(diào)度到具有該污點(diǎn)效果的節(jié)點(diǎn)上,如果不能避免(如其他節(jié)點(diǎn)資源不足),Pod也能調(diào)度到這個(gè)污點(diǎn)節(jié)點(diǎn)上。

  • NoSchedule:不容忍該污點(diǎn)效果的Pod永不會(huì)被調(diào)度到該節(jié)點(diǎn)上,通過kubelet管理的Pod(static Pod)不受限制;之前沒有設(shè)置污點(diǎn)的Pod如果已運(yùn)行在此節(jié)點(diǎn)(有污點(diǎn)的節(jié)點(diǎn))上,可以繼續(xù)運(yùn)行。

  • NoExecute: 調(diào)度器不會(huì)把Pod調(diào)度到具有該污點(diǎn)效果的節(jié)點(diǎn)上,同時(shí)會(huì)將節(jié)點(diǎn)上已存在的Pod驅(qū)逐出去。

污點(diǎn)設(shè)置的第一前提是: 節(jié)點(diǎn)上的污點(diǎn)key和Pod上的污點(diǎn)容忍key相匹配。

1.2 設(shè)置污點(diǎn)的效果實(shí)測

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析


當(dāng)Pod未設(shè)置污點(diǎn)容忍而節(jié)點(diǎn)設(shè)置了污點(diǎn)時(shí)

  • 當(dāng)節(jié)點(diǎn)的污點(diǎn)影響效果被設(shè)置為:PreferNoSchedule時(shí),已存在于此節(jié)點(diǎn)上的Pod不會(huì)被驅(qū)逐;新增但未設(shè)置污點(diǎn)容忍的Pod仍然可以被調(diào)度到此節(jié)點(diǎn)上。

  • 當(dāng)節(jié)點(diǎn)的污點(diǎn)影響效果被設(shè)置為:NoSchedule時(shí),已存在于此節(jié)點(diǎn)上的Pod不會(huì)被驅(qū)逐;同時(shí),新增的Pod不會(huì)被調(diào)度此節(jié)點(diǎn)上。

  • 當(dāng)節(jié)點(diǎn)的污點(diǎn)影響效果被設(shè)置為:NoExecute時(shí),已存在于此節(jié)點(diǎn)上的Pod會(huì)發(fā)生驅(qū)逐(驅(qū)逐時(shí)間由tolerationSeconds字段確定,小于等于0會(huì)立即驅(qū)逐);新增的Pod不會(huì)調(diào)度到此節(jié)點(diǎn)上。

當(dāng)Node設(shè)置了污點(diǎn)且Pod設(shè)置了對(duì)應(yīng)的污點(diǎn)容忍時(shí),實(shí)測效果如下表:

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析


污點(diǎn)容忍設(shè)置, Exists和Equal這兩個(gè)操作符之間的區(qū)別是什么?

在配置上:

  • Exists必須把值設(shè)置為空字符串,而只關(guān)心key與節(jié)點(diǎn)的污點(diǎn)key是否匹配。

  • Equal需要同時(shí)設(shè)置key和value來匹配污點(diǎn)節(jié)點(diǎn)的Key和value。

兩者之間的理解加深:

  • 若一個(gè)節(jié)點(diǎn)存在多個(gè)污點(diǎn), Pod使用Exists只容忍了其中一個(gè)污點(diǎn), 仍然不能調(diào)度此節(jié)點(diǎn), 原因在于Pod不容忍此節(jié)點(diǎn)的其他污點(diǎn)。

  • 若一個(gè)節(jié)點(diǎn)存在多個(gè)污點(diǎn), Pod使用Equal只容忍了其中一個(gè)污點(diǎn), 仍然不能調(diào)度此節(jié)點(diǎn), 原因在于Pod還是不容忍此節(jié)點(diǎn)的其他污點(diǎn)。

  • 若想要一個(gè)Pod能夠調(diào)度到含有多個(gè)污點(diǎn)的節(jié)點(diǎn)上, 那么此Pod需要容忍此節(jié)點(diǎn)的所有污點(diǎn)。

1.3 污點(diǎn)容忍里的一些小竅門:

  • 在污點(diǎn)容忍設(shè)置時(shí),若key,value是空字符且操作符是Exists 那么能Pod容忍節(jié)點(diǎn)的所有污點(diǎn)。(注意:仍然遵從于容忍效果的等級(jí)設(shè)置)。例如:一個(gè)Pod在設(shè)置污點(diǎn)容忍時(shí),key,value為空且操作符是Exists,容忍效果為:NoExecute,那么該P(yáng)od不會(huì)調(diào)度到污點(diǎn)效果為:NoSchedule的節(jié)點(diǎn)上。

  • 在設(shè)置污點(diǎn)容忍時(shí), 若Pod的容忍效果(effect)被設(shè)置為空字符,那么Pod能匹配所有的容忍效果。

  • 在設(shè)置污點(diǎn)容忍時(shí), 若key,value為空、操作符是Exists且容忍效果(effect)也為空時(shí),則等于沒有設(shè)置。

默認(rèn)情況下,操作符是Equal。

如果節(jié)點(diǎn)的影響效果是NoExecute,且不想Pod被立即驅(qū)逐,那么可以設(shè)置TolerationSeconds(延遲驅(qū)逐時(shí)間),若值是0或者負(fù)數(shù)會(huì)立即驅(qū)逐,若值大于0,則在此時(shí)間后開始驅(qū)逐。

從測試結(jié)果來看,只要節(jié)點(diǎn)設(shè)置了污點(diǎn)且效果是:NoExecute,不管Pod是否容忍了該污點(diǎn)都不能在對(duì)應(yīng)節(jié)點(diǎn)上正常運(yùn)行(一直處于刪除,重建的過程),原因是能被調(diào)度到節(jié)點(diǎn)上是調(diào)度器選擇的結(jié)果,Pod被殺掉是本地kubelet決策的結(jié)果,這是兩個(gè)組件分管不同工作產(chǎn)生的效果,下面這種配置除外。

tolerations:      
    - operator: Exists

#此Pod的污點(diǎn)配置能夠容忍所有的污點(diǎn),所有的影響效果,所有能調(diào)度到所有的節(jié)點(diǎn)上(包括影響效果被設(shè)置為:NoExecute的Node).

1.4 認(rèn)知誤區(qū)

1.4.1當(dāng)一個(gè)節(jié)點(diǎn)設(shè)置了污點(diǎn),那么只要設(shè)置Pod對(duì)此污點(diǎn)容忍就能調(diào)度上去且能正常運(yùn)行。(錯(cuò))

當(dāng)節(jié)點(diǎn)的一個(gè)污點(diǎn)的影響效果被設(shè)置為:NoExecute,此時(shí)Pod對(duì)此污點(diǎn)的容忍效果也是NoExecute時(shí), Pod能調(diào)度上去,但是也會(huì)被Terminating,不斷的處于Terminating,ContainerCreating的過程。

對(duì)Node設(shè)置污點(diǎn):

kubectl taint nodes 1xx status=unavailable:NoExecute

Pod設(shè)置的污點(diǎn)容忍:

tolerations:
     - effect: NoExecute
        key: status
        operator: Equal 
        tolerationSeconds: 0
         value: unavailable

效果:

tolerations:      
    - operator: Exists
#此Pod的污點(diǎn)配置能夠容忍所有的污點(diǎn),所有的影響效果,所有能調(diào)度到所有的節(jié)點(diǎn)上(包括影響效果被設(shè)置為:
NoExecute的Node).

1.4.2 當(dāng)一個(gè)節(jié)點(diǎn)設(shè)置了多個(gè)污點(diǎn),只要使用Exists操作符匹配到其中一個(gè)污點(diǎn),此Pod就能調(diào)度到對(duì)應(yīng)的節(jié)點(diǎn)上。(錯(cuò))

原因在于Pod只能匹配到其中一個(gè)污點(diǎn),但是還是不能匹配到其他污點(diǎn)。所以,不能調(diào)度上去。

1.4.3 在設(shè)置Pod容忍時(shí),只要匹配到key和value就行了,不用關(guān)心容忍效果的設(shè)置。(錯(cuò))

容忍效果的設(shè)置和key/value的設(shè)置一樣重要,甚至更加重要。如果容忍效果不匹配。也會(huì)導(dǎo)致Pod調(diào)度不能到對(duì)應(yīng)節(jié)點(diǎn)上。

1.4.4 如果Pod沒有設(shè)置任何的污點(diǎn)容忍,Pod就不能調(diào)度到有污點(diǎn)的節(jié)點(diǎn)上。(錯(cuò))

如果節(jié)點(diǎn)的污點(diǎn)效果是: PreferNoSchedule, 沒有設(shè)置任何污點(diǎn)容忍的Pod也能調(diào)度到此節(jié)點(diǎn)上。原因在于:PreferNoSchedule的意思是優(yōu)先不調(diào)度,但是當(dāng)沒有節(jié)點(diǎn)可用時(shí),Pod仍然能調(diào)度到此節(jié)點(diǎn)。

Node Affinity

Node Affinity可以讓指定應(yīng)用調(diào)度到指定的節(jié)點(diǎn),這有利于應(yīng)用的穩(wěn)定性,減少重要業(yè)務(wù)和不重要業(yè)務(wù)之間相互搶占資源的可能,同時(shí)也可以降低不重要業(yè)務(wù)對(duì)重要業(yè)務(wù)的影響,另一方面,也能夠進(jìn)行多租戶之間的隔離。根據(jù)租戶需求為租戶提供特定的運(yùn)行環(huán)境。

2.1 NodeAffinity配置要點(diǎn)

NodeAffinity配置分類兩大部分:

requiredDuringSchedulingIgnoredDuringExecution (強(qiáng)親和性)

preferredDuringSchedulingIgnoredDuringExecution (首選親和性)

但是,在真實(shí)的配置環(huán)節(jié)時(shí),又會(huì)犯迷糊:

  • 強(qiáng)親和性到底多強(qiáng)算強(qiáng)?

  • 首選親和性中的首選體現(xiàn)在那些方面?

  • 強(qiáng)親和性配置時(shí),有兩種配置方式,兩種的區(qū)別是什么?

  • 首選親和性中的權(quán)重值到底是什么規(guī)則? 值越大權(quán)重值越高么?還是值越小越高(1最大)?

  • 首選親和性配置中, 如果Pod能匹配A節(jié)點(diǎn)的多個(gè)Label,也能匹配B節(jié)點(diǎn)的一個(gè)Label(A的Label權(quán)重之和等于B單個(gè)Label的權(quán)重),這時(shí)Pod會(huì)優(yōu)先調(diào)度到A節(jié)點(diǎn)么?

  • 縮容時(shí),是先從低權(quán)重的節(jié)點(diǎn)上開始?xì)⒚矗?這些問題, 我們都不能全靠注釋和理解去揣測答案,必須經(jīng)過實(shí)測得到真實(shí)答案,否則一旦上了生產(chǎn)再想修改就需要付出更大的成本。

  • 如果Pod是以強(qiáng)親和性的方式綁定在節(jié)點(diǎn)上且Pod已經(jīng)正常運(yùn)行在此節(jié)點(diǎn)上,此時(shí)刪除節(jié)點(diǎn)的標(biāo)簽是否會(huì)導(dǎo)致Pod重啟發(fā)生漂移。

強(qiáng)親和性:

requiredDuringSchedulingIgnoredDuringExecution

例子Node Labels設(shè)定:

level: important(重要),general(一般),unimportant(不重要)

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析

Pod與運(yùn)算的配置:

注意: 強(qiáng)親和性的配置分為: 與運(yùn)算、或運(yùn)算兩部分

requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
              - matchExpressions:
              - key: level
                  operator: In
                  values:    
                   - important
               - key: app
                   operator: In
                   values:
                   - 1

在與運(yùn)算的配置中,我們發(fā)現(xiàn),在同一個(gè)matchExpressions中既需要匹配level=important的標(biāo)簽也需要匹配app=1的標(biāo)簽。也就是說:Pod只會(huì)選擇同時(shí)匹配這兩個(gè)Label的節(jié)點(diǎn)。

根據(jù)上面Pod的Node親和性設(shè)置,兩個(gè)Label求一個(gè)交集,只有同時(shí)滿足兩個(gè)Label的節(jié)點(diǎn)才會(huì)納入這個(gè)Pod的調(diào)度池,顯而易見,只有10.x.x.80這個(gè)節(jié)點(diǎn)。所以,此Pod只能調(diào)度到這個(gè)節(jié)點(diǎn),如果這個(gè)節(jié)點(diǎn)資源不足,那么此Pod調(diào)度失敗。

Pod或運(yùn)算配置:

requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
              - key: level 
               operator: In
               values:
               - important
            - matchExpressions:
              - key: level 
               operator: In
               values:
               - unimportant

在或運(yùn)算的配置中,我們發(fā)現(xiàn)有一個(gè)matchExpressions數(shù)組,里面的Label列表求并集。也就是說:Pod可以選擇只要匹配其中一個(gè)Label的節(jié)點(diǎn)就行,不用全匹配。

舉個(gè)例子:

節(jié)點(diǎn)的Label設(shè)置沿用上一個(gè)例子的。 節(jié)點(diǎn)的標(biāo)簽只要能滿足Pod的其中一個(gè)標(biāo)簽, 節(jié)點(diǎn)就能納入這個(gè)Pod的調(diào)度池,顯而易見,這個(gè)Pod可選的節(jié)點(diǎn)有:10.x.x.78, 10.x.x.79,10.x.x.80, 10.x.x.86, 10.x.x.87, 10.x.x.88。

首選親和性: 

preferredDuringSchedulingIgnoredDuringExecution

它的使用風(fēng)格應(yīng)該是:如果Pod能調(diào)度到指定Label的節(jié)點(diǎn)最好,如果不能,也不強(qiáng)求,Pod選擇其他的節(jié)點(diǎn)也行,即使這個(gè)節(jié)點(diǎn)根本沒有Label或者節(jié)點(diǎn)的Label和我完全不匹配。

Pod首選親和性設(shè)置:

preferredDuringSchedulingIgnoredDuringExecution:
         - preference:
              matchExpressions:
             - key: level 
               operator: In 
               values:
               - important
            weight: 5
         - preference: 
             matchExpressions:
             - key: app
                operator: In 
               values:
               - "1"
           weight: 4
         - preference:
              matchExpressions:
             - key: master
                operator: In
                values:
               - "1"
           weight: 10

示例: Node的Label設(shè)置沿用上一個(gè)例子的, 根據(jù)上面的配置,我們會(huì)看到:

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析

如表所示, 最終Pod優(yōu)先調(diào)度到10.x.x.85, 原因在于app=1的權(quán)重是4, level=important的權(quán)重是5, 所以:節(jié)點(diǎn) 10.x.x.80的權(quán)重是:9,但是仍然小于節(jié)點(diǎn):10.x.x.85的權(quán)重。

2.2 問題總結(jié)

  1. 其實(shí)強(qiáng)親和性和首選親和性區(qū)別體現(xiàn)在:Pod對(duì)節(jié)點(diǎn)的選擇上。就強(qiáng)親和性而言,如果節(jié)點(diǎn)不能匹配Pod對(duì)Label的要求, Pod永遠(yuǎn)不會(huì)調(diào)度到這類節(jié)點(diǎn)上,即使是Pod調(diào)度失敗(沒錯(cuò),就是頭鐵),就首選親和性來說,能調(diào)度到最優(yōu)節(jié)點(diǎn)是一件非常值得開心的事情,如果不能調(diào)度到最優(yōu)節(jié)點(diǎn)可以退而求其次,總有適合自己的。 (回答問題1)

  2. 首選親和性體現(xiàn)在PodLabel的權(quán)重值上,而與節(jié)點(diǎn)Label的匹配個(gè)數(shù)無關(guān)。(回答問題2)

  3. 在首選親和性配置中會(huì)多一個(gè)權(quán)重值的字段(weight),這個(gè)值越大,權(quán)重越大,Pod調(diào)度到對(duì)應(yīng)此Label的節(jié)點(diǎn)的概率越高。(回答問題4)

  4. 一個(gè)節(jié)點(diǎn)有多個(gè)Label且節(jié)點(diǎn)能滿足Pod所要求的所有Label,如果多個(gè)Label的權(quán)重值相加仍然小于某單個(gè)Label的節(jié)點(diǎn),那么Pod首選是權(quán)重值高的節(jié)點(diǎn);如果Pod能匹配到A 節(jié)點(diǎn)的所有Label,同時(shí)也能匹配到B 節(jié)點(diǎn)某一個(gè)Label.但是,A節(jié)點(diǎn) Label的權(quán)重之和剛好等于B 節(jié)點(diǎn)的單個(gè)Label的權(quán)重,這時(shí),Pod優(yōu)先選擇的A還是B這是隨機(jī)的(只針對(duì)親和性來說是隨機(jī)的,實(shí)際情況還要考慮其他情況)。而不會(huì)管Label的匹配個(gè)數(shù)。(回答問題5)

  5. 創(chuàng)建或擴(kuò)容Pod時(shí),優(yōu)先選擇Label匹配權(quán)重值大的節(jié)點(diǎn),若此節(jié)點(diǎn)的其他條件不滿足(比如內(nèi)存不足),選擇次權(quán)重的,最后選擇Label不匹配或者根本沒有Label的節(jié)點(diǎn)。

  6. (回答問題6)縮容時(shí),隨機(jī)選擇Pod殺掉,而不是我們預(yù)想的從低權(quán)重的節(jié)點(diǎn)開始?xì)?這點(diǎn)值得注意。

  7. (回答問題7)答案是不會(huì),正在運(yùn)行的Pod不會(huì)被調(diào)度到新的節(jié)點(diǎn)去, 當(dāng)Pod因?yàn)槟撤N原因重啟(指Pod名字改變,觸發(fā)重調(diào)度,名字不改變,意味著不觸發(fā)調(diào)度器調(diào)度,只是原地重啟)后,會(huì)自動(dòng)調(diào)度到符合親和性選擇的節(jié)點(diǎn)上。

污點(diǎn)和Node Affinity的使用總結(jié)

Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析
  1. 就污點(diǎn)而言,它的使用通常是負(fù)向的, 也就說, 污點(diǎn)常用在某Node不讓大多數(shù)Pod調(diào)度只讓少部分Pod調(diào)度時(shí),又或者節(jié)點(diǎn)根本不參加工作負(fù)載時(shí)。比如:我們常見的master節(jié)點(diǎn)上不調(diào)度負(fù)載pod,保證master組件的穩(wěn)定性;節(jié)點(diǎn)有特殊資源,大部分應(yīng)用不需要而少部分應(yīng)用需要,如GPU。

  2. 就Node Affinity來說,他的使用可以正向的,也就是說,我們想讓某個(gè)應(yīng)用的Pod部署在指定的一堆節(jié)點(diǎn)上。當(dāng)然,也可以是負(fù)向的,比如說我們常說的Node 反親和性,只需要把操作符設(shè)置為NotIn就能達(dá)成預(yù)期目標(biāo)。

  3. 就污點(diǎn)而言,如果節(jié)點(diǎn)設(shè)置的污點(diǎn)效果是NoSchedule或者NoExecute,意味著沒有設(shè)置污點(diǎn)容忍的Pod絕不可能調(diào)度到這些節(jié)點(diǎn)上。

  4. 就Node Affinity而言,如果節(jié)點(diǎn)設(shè)置了Label,但是Pod沒有任何的Node Affinity設(shè)置,那么Pod是可以調(diào)度到這些節(jié)點(diǎn)上的。

看完上述內(nèi)容,你們掌握Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI