Kubernetes(簡(jiǎn)稱“K8s”或者“Kube”)是一個(gè)開源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,K8s的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效,是理想的托管平臺(tái)。K8s于2015年發(fā)布,并迅速成為事實(shí)上的容器編排標(biāo)準(zhǔn)。
在相關(guān)項(xiàng)目中,采用麒麟云原生平臺(tái),基于K8s調(diào)度相關(guān)的scheduler-plugins和node-feature-discovery項(xiàng)目深度定制開發(fā)了NUMA感知調(diào)度功能,以滿足特定客戶需求。在開發(fā)測(cè)試驗(yàn)證環(huán)節(jié),分別發(fā)現(xiàn)開源社區(qū)的scheduler-plugins和node-feature-discovery項(xiàng)目存在以下問(wèn)題。
問(wèn)題現(xiàn)象描述
scheduler-plugins是K8s調(diào)度SIG的擴(kuò)展庫(kù)項(xiàng)目,用于增強(qiáng)K8s默認(rèn)調(diào)度器的功能。其中,noderesourcetopology插件支持NUMA感知調(diào)度,但若某臺(tái)服務(wù)器的NUMA節(jié)點(diǎn)中存在未插入內(nèi)存條的情況,可能會(huì)出現(xiàn)問(wèn)題:分配給Pod的NUMA節(jié)點(diǎn)組合中可能包含這些無(wú)內(nèi)存的節(jié)點(diǎn),導(dǎo)致Pod無(wú)法正常運(yùn)行。
node-feature-discovery是K8s另一個(gè)SIG的項(xiàng)目,用于收集節(jié)點(diǎn)硬件信息,包括NUMA拓?fù)湫畔ⅰM瑯樱裟硞€(gè)節(jié)點(diǎn)的NUMA節(jié)點(diǎn)存在未插入內(nèi)存條的情況,node-feature-discovery服務(wù)也可能無(wú)法啟動(dòng),從而無(wú)法獲取節(jié)點(diǎn)的NUMA拓?fù)湫畔ⅰ?/p>
問(wèn)題定位
針對(duì)scheduler-plugins問(wèn)題,經(jīng)過(guò)定位發(fā)現(xiàn):findSuitableCombination函數(shù)在選取NUMA node組合時(shí)未經(jīng)過(guò)充分的考慮。如下圖所示,該函數(shù)主要是在循環(huán)檢查每一種NUMA node組合,針對(duì)具體一種NUMA node組合,首先計(jì)算組合內(nèi)資源總和(下圖所標(biāo)識(shí)的第一步),接著判斷該資源總和是否滿足pod資源請(qǐng)求(下圖所標(biāo)識(shí)的第二步)。假設(shè)一種NUMA node組合為 "2,3,6",2和6的內(nèi)存之和滿足pod內(nèi)存請(qǐng)求,但是3沒(méi)有插入內(nèi)存條,此時(shí)依然認(rèn)為 "2,3,6"組合是滿足要求的。
針對(duì)node-feature-discovery問(wèn)題,經(jīng)過(guò)定位發(fā)現(xiàn),GetNumaMemoryResources函數(shù)在計(jì)算服務(wù)器上的NUMA node的memory與hugepages信息時(shí)發(fā)生錯(cuò)誤,該函數(shù)默認(rèn)所有NUMA node都有內(nèi)存條,導(dǎo)致遍歷計(jì)算某些未插入內(nèi)存條的NUMA node的hugepages信息發(fā)生錯(cuò)誤。如下圖所示:getHugepagesBytes函數(shù)計(jì)算某些未插入內(nèi)存條的NUMA node的hugepages信息會(huì)發(fā)生錯(cuò)誤,導(dǎo)致整個(gè)node-feature-discovery服務(wù)啟動(dòng)失敗。
問(wèn)題修復(fù)
基于上述分析及定位,麒麟軟件推出修復(fù)方案:
(1)針對(duì)scheduler-plugins問(wèn)題,在循環(huán)檢查每一種NUMA node組合中,先對(duì)具體的NUMA node組合進(jìn)行有效性校驗(yàn),對(duì)不存在某種資源的非法組合進(jìn)行過(guò)濾,有效的組合才會(huì)進(jìn)行接下來(lái)的計(jì)算。
(2)針對(duì)node-feature-discovery問(wèn)題,GetNumaMemoryResources函數(shù)遍歷計(jì)算服務(wù)器上的NUMA node的memory與hugepages信息時(shí),如果getHugepagesBytes函數(shù)返回的錯(cuò)誤是文件或者目錄不存在則跳過(guò)該計(jì)算。
以上修復(fù)方案已第一時(shí)間反饋,并被CNCF社區(qū)接受。