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