Kubernetes高級(jí)調(diào)度中如何進(jìn)行Taint和Toleration、Node Affinity分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
目前創(chuàng)新互聯(lián)已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、越秀網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
(避免Pod和Node同時(shí)出現(xiàn)在一小段文字中,所以Node以節(jié)點(diǎn)漢字表述)
Taint和Toleration
污點(diǎn)的理論支撐
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)上,通過(guò)kubelet管理的Pod(static Pod)不受限制;之前沒(méi)有設(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í)測(cè)
當(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í)測(cè)效果如下表:
污點(diǎn)容忍設(shè)置, Exists和Equal這兩個(gè)操作符之間的區(qū)別是什么?
在配置上:
Exists必須把值設(shè)置為空字符串,而只關(guān)心key與節(jié)點(diǎn)的污點(diǎn)key是否匹配。
Equal需要同時(shí)設(shè)置key和value來(lái)匹配污點(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)容忍里的一些小竅門(mé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í),則等于沒(méi)有設(shè)置。
默認(rèn)情況下,操作符是Equal。
如果節(jié)點(diǎn)的影響效果是NoExecute,且不想Pod被立即驅(qū)逐,那么可以設(shè)置TolerationSeconds(延遲驅(qū)逐時(shí)間),若值是0或者負(fù)數(shù)會(huì)立即驅(qū)逐,若值大于0,則在此時(shí)間后開(kāi)始驅(qū)逐。
從測(cè)試結(jié)果來(lái)看,只要節(jié)點(diǎn)設(shè)置了污點(diǎn)且效果是:NoExecute,不管Pod是否容忍了該污點(diǎn)都不能在對(duì)應(yīng)節(jié)點(diǎn)上正常運(yùn)行(一直處于刪除,重建的過(guò)程),原因是能被調(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的過(guò)程。
對(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沒(méi)有設(shè)置任何的污點(diǎn)容忍,Pod就不能調(diào)度到有污點(diǎn)的節(jié)點(diǎn)上。(錯(cuò))
如果節(jié)點(diǎn)的污點(diǎn)效果是: PreferNoSchedule, 沒(méi)有設(shè)置任何污點(diǎn)容忍的Pod也能調(diào)度到此節(jié)點(diǎn)上。原因在于:PreferNoSchedule的意思是優(yōu)先不調(diào)度,但是當(dāng)沒(méi)有節(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)上開(kāi)始?xì)⒚矗?這些問(wèn)題, 我們都不能全靠注釋和理解去揣測(cè)答案,必須經(jīng)過(guò)實(shí)測(cè)得到真實(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(不重要)
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)簽。也就是說(shuō):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)度池,顯而易見(jiàn),只有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列表求并集。也就是說(shuō):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)度池,顯而易見(jiàn),這個(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)根本沒(méi)有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ì)看到:
如表所示, 最終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 問(wèn)題總結(jié)
其實(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)度失敗(沒(méi)錯(cuò),就是頭鐵),就首選親和性來(lái)說(shuō),能調(diào)度到最優(yōu)節(jié)點(diǎn)是一件非常值得開(kāi)心的事情,如果不能調(diào)度到最優(yōu)節(jié)點(diǎn)可以退而求其次,總有適合自己的。 (回答問(wèn)題1)
首選親和性體現(xiàn)在PodLabel的權(quán)重值上,而與節(jié)點(diǎn)Label的匹配個(gè)數(shù)無(wú)關(guān)。(回答問(wèn)題2)
在首選親和性配置中會(huì)多一個(gè)權(quán)重值的字段(weight),這個(gè)值越大,權(quán)重越大,Pod調(diào)度到對(duì)應(yīng)此Label的節(jié)點(diǎn)的概率越高。(回答問(wèn)題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ì)親和性來(lái)說(shuō)是隨機(jī)的,實(shí)際情況還要考慮其他情況)。而不會(huì)管Label的匹配個(gè)數(shù)。(回答問(wèn)題5)
創(chuàng)建或擴(kuò)容Pod時(shí),優(yōu)先選擇Label匹配權(quán)重值大的節(jié)點(diǎn),若此節(jié)點(diǎn)的其他條件不滿足(比如內(nèi)存不足),選擇次權(quán)重的,最后選擇Label不匹配或者根本沒(méi)有Label的節(jié)點(diǎn)。
(回答問(wèn)題6)縮容時(shí),隨機(jī)選擇Pod殺掉,而不是我們預(yù)想的從低權(quán)重的節(jié)點(diǎn)開(kāi)始?xì)?這點(diǎn)值得注意。
(回答問(wèn)題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é)
就污點(diǎn)而言,它的使用通常是負(fù)向的, 也就說(shuō), 污點(diǎn)常用在某Node不讓大多數(shù)Pod調(diào)度只讓少部分Pod調(diào)度時(shí),又或者節(jié)點(diǎn)根本不參加工作負(fù)載時(shí)。比如:我們常見(jiàn)的master節(jié)點(diǎn)上不調(diào)度負(fù)載pod,保證master組件的穩(wěn)定性;節(jié)點(diǎn)有特殊資源,大部分應(yīng)用不需要而少部分應(yīng)用需要,如GPU。
就Node Affinity來(lái)說(shuō),他的使用可以正向的,也就是說(shuō),我們想讓某個(gè)應(yīng)用的Pod部署在指定的一堆節(jié)點(diǎn)上。當(dāng)然,也可以是負(fù)向的,比如說(shuō)我們常說(shuō)的Node 反親和性,只需要把操作符設(shè)置為NotIn就能達(dá)成預(yù)期目標(biāo)。
就污點(diǎn)而言,如果節(jié)點(diǎn)設(shè)置的污點(diǎn)效果是NoSchedule或者NoExecute,意味著沒(méi)有設(shè)置污點(diǎn)容忍的Pod絕不可能調(diào)度到這些節(jié)點(diǎn)上。
就Node Affinity而言,如果節(jié)點(diǎn)設(shè)置了Label,但是Pod沒(méi)有任何的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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!