韋建文, 王一超, 文敏華, 林新華, 周子豪
(上海交通大學網絡信息中心,上海200240)
高性能計算集群是為求解大型計算問題、由多個節點通過高速網絡連接而組成的集群,其能否有效工作很大程度上取決于集群中各節點是否處于協調一致的配置狀態。集群節點從上架通電到下線退役發生的軟件配置調整,都可歸入配置管理的范疇,包括為節點初始化做的離線配置和不中斷節點服務的在線配置。傳統配置方法關注配置的具體操作,譬如“使用useradd命令添加用戶”“用戶已存在該如何處理”等。受限于命令式配置的建模能力,傳統配置方法很難快速正確地將復雜系統配置到預期狀態,而由此導致作業運行效率低甚至集群下線,將嚴重影響高性能計算集群的正常使用。
“基礎設施即代碼”(Infrastructure as Code,IaC)[1]是為解決復雜系統配置問題而提出的方法,其核心理念是專注表達配置的需求——即構建配置建模,具體煩瑣的配置操作則由程序在模型驅動下完成。
以表1 所示的添加用戶為例,配置建模使用“聲明式”描述,相比配置過程使用的“命令式”描述,能更加簡潔準確地表達配置意圖。盡管由模型驅動的配置管理在云計算領域已獲得廣泛應用,但這項技術是否適合于物理機占比高、異構硬件數量多的高性能計算集群,仍需要進一步探索。

表1 “聲明式”與“命令式”配置對比
上海交通大學高性能計算平臺是國內規模最大的校級計算平臺之一[2],已建成π1.0(2013 年上線)、π2.0(2019 年上線)兩代集群,理論計算能力超過3PFlops,存儲容量超過10 PB,配備CPU計算節點、多路胖節點、GPU計算節點等總計超過1 000 個物理節點,以及數十個虛擬管理節點。將這些節點配置成一個協同工作的集群,是一項很有挑戰性的工作。本文介紹一種以配置模型為核心的高性能計算集群配置管理方法,包括:配置管理工具選型、Puppet特性、模型驅動的集群配置管理流程、配置時間對比和配置集群的流程展示。
在“基礎設施即代碼”實踐中,配置管理與編程解題有很多共同點。如圖1 所示。
程序員使用高級語言編寫程序代碼,經編譯器編譯后得到可執行程序,執行后輸出計算結果。類似地,管理員使用建模語言描述配置模型,經配置管理工具翻譯后得到可執行腳本,執行后將目標節點配置到預期狀態。程序員在選擇編程工具鏈時會考察編程語言的表達能力、執行效率、第3 方庫豐富程度以及對版本回溯等軟件工程特性的支持。同樣地,管理員選擇配置管理工具時,也會重點考察建模能力、配置速度、模塊數量、對版本回溯的支持和部署難度。

圖1 配置管理執行流程
現有主流開源配置管理工具特性對比見表2。表中,Puppet使用了語法類似Ruby 的定制語言,具有很強的建模能力,又因為使用了獨立的客戶端所以配置速度快,龐大的社區提供了超過6 000 個模塊,且可與git版本控制系統[7]整合提供變更回溯功能。盡管Puppet部署難度要比其他配置管理工具高,但其提供的層次化建模、邏輯與數據分離特性對管理復雜集群配置提供了極大的便利。

表2 主流開源配置管理系統對比
Puppet配置管理工具的3 個主要組件如圖2 所示,包括建模組件、主控節點和客戶端。管理員使用建模組件構建的配置模型由主控節點編譯后變成可執行腳本,客戶端執行腳本把目標節點配置到預期狀態。

圖2 Puppet配置管理系統組件
Puppet的配置模型包含“邏輯”與“數據”兩個要素,分別描述“配置什么”和“配置參數”。
模型的邏輯使用名為Puppet DSL 的特定領域描述語言(Domain Specific Language,DSL)描述。這個語言專為配置管理設計,不僅提供了完成基礎配置所需的函數,如安裝特定RPM包、啟動特定服務等,還包含了用于構建復雜功能的語言特性,如變量、數據結構、條件分支等。Puppet 推薦使用名為“角色-剖繪”(Roles-Profiles)編碼規范[8]把模型代碼分散到多個文件中。這個編碼規范使用角色和剖繪兩層抽象,分別描述節點的功能(如compute、nameserver等)以及實現這些功能所需的軟件棧(如slurm、bind 等)。部分具有共性功能的模型代碼(如配置MySQL、SLURM)可發布在Puppet Forge 社區[9]或GitHub[10]供其他用戶使用。Puppet社區提供的模塊數量和質量一直在不斷提高,已經積累了超過6 000 個模塊,涵蓋了高性能計算集群所需絕大部分軟件棧。
Puppet使用名為Hiera 的程序組織模型中的數據。Hiera提供了從最細粒度的“節點”到最粗粒度“全局默認”之間多粒度層次化的參數匹配方法。Hiera可從節點角色、操作系統或其他特征搜索參數,并按照用戶指定的優先級替換或合并參數,若搜索失敗將使用默認的全局參數。Hiera 很好地處理了配置數據中“一般”與“特殊”的關系,通過多粒度參數匯聚避免重復配置在多處出現。Hiera 使用“邏輯”與“數據”分離的編程理念,使得敏感配置信息得以從配置邏輯中分離出來得到保護。
Puppet提供了“文件”和“模型”兩個級別的配置變更跟蹤機制。在文件一級,Puppet 主控節點會備份file函數每一次對配置文件所做的修改,管理員可以查看、對比和恢復配置文件的歷史記錄。在模型一級,Puppet與git 集成,跟蹤整個配置模型,即“邏輯+數據”的代碼變更歷史。管理員可使用“git 簽出”抽取任意時刻的模型應用到目標節點,或使用“git分支”創造多個獨立于生產環境的配置模型。Puppet配置變更跟蹤機制是實現配置回溯和獨立測試環境的基礎。
使用Puppet建模組件構建了上海交大高性能計算集群的配置模型,并借助Puppet配置變更跟蹤特性搭建了可回溯可測試的在線配置流程,結合Cobbler操作系統部署工具,搭建了無須人工干預的節點離線配置流程。
按照Roles-Profiles 編碼規范,集群節點的角色和所需軟件棧見表3。

表3 節點角色分配表
具體地,lib/facter/role.rb配置文件通過正則表達式為其指定角色變量puppet_role 和計算節點子類型變量puppet_subtype,接著在角色文件中引入所需軟件棧剖繪。從Puppet Forge和GitHub站點選取軟件棧對應的模塊加剖繪文件,并針對高性能計算領域特有的軟硬件系統,如Omni-Path 網絡[11]、SLURM 調度系統[12]編寫了Puppet 擴展模塊。Hiera 使用“角色(role)-子類(subtype)-節點(node)”的優先級順序合并參數。git代碼倉庫的多個分支分別對應不同的測試環境,每個環境都可獨立地分配“角色-剖繪”配置、使用其他外部模塊、指派配置數據。
在線配置用于完成那些無須重啟節點的維護操作,包括SLURM 隊列設置、增加軟件包、調整告警檢查閾值等。
如圖3 所示,基于生產環境的模型新建git測試環境分支,在這個分支上修改模型選擇個別節點應用新模型,確認新配置模型工作正常后再將git分支的修改合并到生產環境分支。在所有節點上應用更新后的配置模型。在新的git 分支調試新模型時,可以使用git revert撤回某一個錯誤修改,或者用git checkout 回滾到某個歷史狀態,還可以使用puppet agent -t --environment production把測試分支的集群配置復位到生產環境狀態,然后開啟新的git 分支繼續“開發-測試-合并”的流程。
Cobbler[13]節點部署工具和Puppet 配置工具用于無人值守離線配置,可以一鍵完成節點上線的流程。離線配置適合重大更新,如操作系統大版本升級、更換節點角色等。
如圖4 所示,首先,管理員通過IPMI設置目標節點通過PXE網絡啟動并重啟節點,節點從Cobbler 服務器獲得啟動鏡像和Kickstart文件[14],重新部署操作系統。然后,安裝程序調用puppet 客戶端在這個新部署的操作系統上配置其他服務組件。最后,安裝程序退出,節點自動上線提供服務。經測試,這個流程可并發部署超過1 000 個物理機或虛擬機。通過調整Cobbler和Kickstart的設置,還可以定制每個節點使用的操作系統和分區方案。

圖3 在分支環境測試配置變更

圖4 無人值守部署流程圖
以“配置SLURM作業調度系統”和“配置一個新的節點”這兩個任務為例,傳統配置方法和模型驅動的Puppet方法的工作效率對比見表4。
模型驅動方法在準備階段時間、執行階段時間和需要撰寫代碼行數均優于傳統配置方法。傳統配置方法在“配置SLURM 調度系統”時,需要單獨為slurmctld、slurmdbd、slurmd 這幾個服務維護內容相似的配置文件,并配置相應的MUNGE、SSSD等服務;Puppet配置方法則可以共享SLURM 主要配置信息,并直接使用現成的SLURM、MUGNE、SSSD 配置模塊。傳統配置方法在“配置一個新的節點”時,需要額外編寫配置流程,或在操作系統部署后人工運行配置程序;Puppet配置方法則可完全復用已有的配置流程,只需在Kickstart 文件末尾加入一行調用puppet 客戶端的代碼。除此以外,模型驅動的配置方法引入了模塊化設計、變更追溯等軟件工程方法,使管理員能夠像發布軟件一樣,保障質量地進行配置變更,這是傳統配置方法做不到的。

表4 模型驅動配置和傳統配置方法對比
圖5 展示了使用模型驅動的配置方法部署一個高性能計算集群的主要過程和耗時。

圖5 集群配置主要流程圖
在管理節點物理機上安裝Cobbler 部署服務和Puppet主控節點服務;在管理節點安裝Ovirt虛擬機管理器服務[15],另選一臺服務器安裝Ovirt宿主機服務;新建Ovirt虛擬機承載集群內的Bind 域名解析、Squid代理、MariaDB數據庫、SLURM 主控節點服務;批量為計算節點部署和配置系統,與此同時使用Spack 軟件包管理器為集群安裝編譯器、MPI 庫、數學庫等工具。傳統部署方法最耗時的操作系統安裝和系統配置部分,被Puppet +Cobbler 無人值守部署流程替代,使得部署一個包含幾十甚至上千計算節點集群的時間,從1 周縮短到了一天。
傳統“命令式”配置方法建模能力受限,不能勝任日益復雜的高性能計算集群配置任務。借鑒“基礎設施即代碼”的思想,將配置問題轉換為建模問題。在以模型為核心的配置管理中,管理員專注編寫配置模型,具體的配置操作交由模型驅動的程序執行。這套方法在開源Puppet配置管理工具基礎上實現,并加入了模塊劃分、邏輯-數據分離、變更追溯等特性提高配置的執行效率、通用性和正確性。這套方法支撐了上海交大校級高性能計算平臺超過1 000 個節點的配置,極大縮短在線配置、離線部署的時間,為開發新的服務內容提供了便利的測試流程。后續將整合“連續集成”技術用于自動驗證和應用配置,進一步將管理員從煩瑣重復的運維工作中解放出來。