溫馨提示×

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

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

K8S容器調(diào)度優(yōu)先級(jí)誤設(shè)導(dǎo)致集群雪崩踩坑記錄

發(fā)布時(shí)間:2020-06-23 16:30:33 來源:網(wǎng)絡(luò) 閱讀:826 作者:筑夢(mèng)攻城獅 欄目:云計(jì)算

????????今天上班的時(shí)候,突然收到集群很多容器調(diào)度失敗的告警,大致如下;

K8S容器調(diào)度優(yōu)先級(jí)誤設(shè)導(dǎo)致集群雪崩踩坑記錄

????????

????????看到大量容器調(diào)度失敗,里面查了下管理平臺(tái),看看這個(gè)時(shí)間段內(nèi)有沒有哪個(gè)業(yè)務(wù)發(fā)布,果然發(fā)現(xiàn)有一個(gè)轉(zhuǎn)碼服務(wù)(CPU消耗性)的業(yè)務(wù)在這個(gè)時(shí)間點(diǎn)發(fā)布了一批任務(wù)。但這批任務(wù)發(fā)布為什么會(huì)導(dǎo)致出現(xiàn)一堆任務(wù)調(diào)度失敗呢?

????????緊接著我們抽查了幾個(gè)告警的容器,發(fā)現(xiàn)這些容器狀態(tài)都處于proeempted (搶占)狀態(tài),原因只能是有更高優(yōu)先級(jí)的pod調(diào)度到這臺(tái)node節(jié)點(diǎn),把上面原有的pod 排擠走。但是剛剛發(fā)布的這個(gè)業(yè)務(wù)并沒有設(shè)置容器調(diào)度優(yōu)先級(jí),為什么會(huì)比其他容器優(yōu)先級(jí)高呢?


K8S容器調(diào)度優(yōu)先級(jí)誤設(shè)導(dǎo)致集群雪崩踩坑記錄


????????經(jīng)排查是因?yàn)橥略诠芾砥脚_(tái)上調(diào)整了容器默認(rèn)優(yōu)先級(jí),由原來的默認(rèn)低優(yōu)先級(jí)修改成高優(yōu)先級(jí),具體背景是這樣:

????????前幾天有業(yè)務(wù)反饋他們的業(yè)務(wù)跑著跑著突然容器掛掉了,最后發(fā)現(xiàn)是因?yàn)檎{(diào)度了高優(yōu)先級(jí)容器過去導(dǎo)致原本低優(yōu)先級(jí)pod被排擠走。業(yè)務(wù)方同事覺得這個(gè)策略不靠譜,如果大家上來都選擇最高優(yōu)先級(jí),那所有人優(yōu)先級(jí)都一樣了,他們建議默認(rèn)策略改成最高優(yōu)先級(jí),允許業(yè)務(wù)按需將優(yōu)先級(jí)調(diào)低,優(yōu)先級(jí)低的容器在最后做成本分?jǐn)偟臅r(shí)候適當(dāng)打折,于是容器組同事將管理平臺(tái)上面的容器調(diào)度默認(rèn)優(yōu)先級(jí)修改為最高優(yōu)先級(jí)。


同事將PriotityClasses 中highest-priority 的 globalDefault 設(shè)置成了true,也就是說默認(rèn)所有新調(diào)度的容器都將是最高優(yōu)先級(jí)。

查看 PriorityClasses 配置

apiVersion: scheduling.k8s.io/v1beta1

kind: PriorityClass

metadata:

name: highest-priority

value: 400

globalDefault: true


官網(wǎng)上關(guān)于priorityClass 做了以下解釋

????????The globalDefault field indicates that the value of this PriorityClass should be used for Pods without a priorityClassName. Only one PriorityClass with globalDefault set to true can exist in the system. If there is no PriorityClass with globalDefault set, the priority of Pods with no priorityClassName is zero.


????????PriorityClass 還有兩個(gè)可選的字段:globalDefault?和?description。globalDefault?表示 PriorityClass 的值應(yīng)該給那些沒有設(shè)置?PriorityClassName?的 Pod 使用。整個(gè)系統(tǒng)只能存在一個(gè)?globalDefault?設(shè)置為 true 的 PriorityClass。如果沒有任何?globalDefault?為 true 的 PriorityClass 存在,那么,那些沒有設(shè)置?PriorityClassName?的 Pod 的優(yōu)先級(jí)將為 0。


注意

1、If you upgrade your existing cluster and enable this feature, the priority of your existing Pods is effectively zero.

如果您升級(jí)已經(jīng)存在的集群環(huán)境,并且啟用了該功能,那么,那些已經(jīng)存在系統(tǒng)里面的 Pod 的優(yōu)先級(jí)將會(huì)設(shè)置為 0。


2、Addition of a PriorityClass with?globalDefault?set to?true?does not change the priorities of existing Pods. The value of such a PriorityClass is used only for Pods created after the PriorityClass is added.

將一個(gè) PriorityClass 的 globalDefault 設(shè)置為 true,不會(huì)改變系統(tǒng)中已經(jīng)存在的 Pod 的優(yōu)先級(jí)。也就是說,PriorityClass 的值只能用于在 PriorityClass 添加之后創(chuàng)建的那些 Pod 當(dāng)中。


????????也就是說priorityClass 中的globalDefault 設(shè)為true的話,只針對(duì)后續(xù)發(fā)布的Pod生效,已發(fā)布的Pod優(yōu)先級(jí)仍為0

????????今天早上遇到的問題是集群中一臺(tái)機(jī)器宕機(jī),然后上面所有的pod 都重新調(diào)度到其他機(jī)器,這些重新調(diào)度的Pod擁有最高優(yōu)先級(jí),當(dāng)這批容器調(diào)度到其他node節(jié)點(diǎn)后就會(huì)把該節(jié)點(diǎn)上面原有的低優(yōu)先級(jí)Pod排擠走。然后這些被排擠走的Pod 又擁有最高優(yōu)先級(jí)調(diào)度到其他node節(jié)點(diǎn),又把另外一臺(tái)節(jié)點(diǎn)上面的Pod擠走,最終造成整個(gè)集群雪崩(全部容器重啟了一遍)。


總結(jié):

1、將 priorityClass 中 globalDefault 設(shè)置為false 并通過前端默認(rèn)設(shè)置最高優(yōu)先級(jí)

在Pod中指定默認(rèn)優(yōu)先級(jí)而不是通過globalDefault指定

K8S容器調(diào)度優(yōu)先級(jí)誤設(shè)導(dǎo)致集群雪崩踩坑記錄


2、關(guān)注集群資源使用情況,資源不足時(shí)應(yīng)及時(shí)擴(kuò)容,至少保證集群中掛掉2,3臺(tái)node節(jié)點(diǎn)后,上面承載的容器能夠漂移到其他剩下的node節(jié)點(diǎn)上。



向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