吳晗,胡寧,蒲駿瑋
(航空工業西安航空計算技術研究所, 陜西西安,710065)
海思3559A芯片是華為海思技術有限公司推出的一款ARM架構的智能芯片,它提供了8K30/4K120廣播級圖像質量的數字視頻錄制,支持H.265編碼輸出或影視級的RAW數據輸出,并集成高性能ISP處理。在支持8K30/4K120視頻錄制下,Hi3559A提供硬化的6-Dof 數字防抖,減少了對機械云臺的依賴。Hi3559A集成了雙核A73和雙核A53,獨創性的大小核架構和雙操作系統,使得功耗和啟動時間達到均衡。集成了海思特有的SVP(Smart Vision Platform)平臺,提供了高效且多樣化的計算資源,支持用戶開發各種人工智能應用。還同時集成雙核DSP和雙核NNIE神經網絡計算引擎,算力高達4T,高算力可以更好地支持人工智能在嵌入式領域的應用,在邊緣計算、自動駕駛等領域有著極大的應用前景。
傳統上使用虛擬機程序或容器,必須基于目標平臺構建應用程序,使其能夠在對應體系結構上高效運行。雖然存在著模擬硬件平臺來運行為其它體系結構編譯的軟件的虛擬機解決方案,但是此類解決方案對性能的影響很大,不適用于嵌入式系統。而容器及容器集群管理技術的引入提供了管理軟件開發、測試、構建和部署的簡單方法。它們減少了在新嵌入式開發板上重新部署嵌入式軟件的痛苦,是將服務和應用程序重新部署到多個Linux發行版的理想選擇。使用容器集群管理系統來編排調度整個集群中運行的容器,可以為整個系統提供任務的動態遷移、彈性伸縮、負載均衡等諸多新特性。
容器集群管理技術相較于容器技術更為上層,目的是實現在容器集群上進行簡單的容器編排調度和部署。
目前國外容器集群管理工具主要有Kubernetes、Docker Swarm、Mesos等。Docker Swarm是Docker公司推出的原生容器集群管理系統,它主要通過Docker的Restful API并配合Docker公司的另一個工具Docker Compose,實現在容器集群上進行簡單的容器編排和部署。但是Docker Swarm的功能較簡單,只適合較小集群的管理,沒有集群的統一監控系統等組件。Mesosphere公司在Apache Mesos的基礎之上也開發了一個容器集群管理系統,稱之為 Marathon。Apache Mesos是同 Apache Yarn一樣是一個資源管理調度器,并非為容器的管理調度專門開發的工具。Kubernetes,簡稱K8S,是谷歌公司基于Borg在2014年6月開源的大規模容器集群管理系統,它是谷歌公司十幾年以來大規模應用容器技術的經驗累積和升華的一個重要結果。它可以為容器化的應用提供運行,服務發現,資源調度等一套功能。
K3S是輕量級Kubernetes發行版,易于安裝,內存減半,所有二進制文件不到40mb,k3s是完全兼容的Kubernetes發行版,有以下更改:移除過時的功能、Alpha功能、非默認功能,這些功能在大多數Kubernetes集群中已不可用。刪除內置插件,如云供應商插件和存儲插件,可用外部插件程序替換。添加SQLite3作為默認的數據存儲。etcd3仍然可用,但并非默認項。包含在一個簡單的啟動程序當中,可以處理復雜的TLS和其他選項。幾乎沒有操作系統依賴性,僅需要健全的內核和cgroup掛載。k3s軟件包所需的依賴:containerd、Flannel、CoreDNS、CNI及主機系統服務 (iptables, socat, etc)。
kubenetes,也即K8S集群,以Pod為最基本的操作單元,它包含一個或者多個相關的容器,將多個容器都“封裝”到一個虛擬的主機里,這樣容器之間就可以通過localhost進行通信。K8S集群主要由兩個節點組成,它們分別是:Master和Node。其總體架構如圖1所示。

圖1 K8S總體架構
Master節點運行著四個組件:etcd、API Server、Controller Manager、Scheduler,除了etcd,后面三個組件主要負責對集群中的資源進行管理和調度,它們構成了K8S的總控中心。API Server是資源對象的操作入口,而且就跟main()函數是程序唯一執行入口一樣,API Server也是唯一的。Controller Manager是集群內部的控制管理中心,主要用于K8S的故障排查和修復。Scheduler是K8S集群中的調度器,負責Pod在集群節點中的調度分配。
Node節點是相對于Master來說的工作主機,它既可以是物理的,也可以是虛擬的,每個Node上管理著Pod生命周期的kubelet同時也被Master管理,Node的主要信息有:地址、運行狀態、條件、系統容量等,在Node節點上運行的服務進程主要有kubelet、kube-proxy和容器運行時。Node節點往往不止一個,它們負責對管理本節點的Pod的生命周期和服務代理。kubelet負責當前Node節點的Pod的創建、監控、修改和刪除等。Proxy負責Service代理,同時也是軟件模式的負載均衡器。etcd是用來存儲所有 Kubernetes 的集群狀態的,它除了具備狀態存儲的功能,還有事件監聽和訂閱、Leader選舉的功能,所謂事件監聽和訂閱,各個其他組件通信,都并不是互相調用 API 來完成的,而是把狀態寫入 etcd(相當于寫入一個消息),其他組件通過監聽 etcd的狀態的的變化(相當于訂閱消息),然后做后續的處理,然后再一次把更新的數據寫入 etcd。所謂 Leader 選舉,其它一些組件比如 Scheduler,為了做實現高可用,通過 etcd從多個(通常是3個)實例里面選舉出來一個做Master,其他都是Standby。
API Server作為集群的核心,負責集群各功能模塊之間的通信。集群內的功能模塊通過Api Server將信息存入到etcd,其他模塊通過Api Server讀取這些信息,從而實現模塊之間的信息交互。Node節點上的Kubelet每隔一個時間周期,通過Api Server報告自身狀態,Api Server接收到這些信息后,將節點信息保存到etcd中。Controller Manager中 的node controller通過Api server定期讀取這些節點狀態信息,并做響應處理。Scheduler監聽到某個Pod創建的信息后,檢索所有符合該pod要求的節點列表,并將pod綁定到節點列表中最符合要求的節點上。如果scheduler監聽到某個Pod被刪除,則調用api server刪除該Pod資源對象。kubelet監聽pod信息,如果監聽到pod對象被刪除,則刪除本節點上的相應的pod實例,如果監聽到修改Pod信息,則會相應地修改本節點的Pod實例。
基于海思3559A的容器集群管理框架如圖2所示,框架為:海思3559A+嵌入式Linux+Docker+Harbor+K3S。

圖2 基于海思3559A的容器集群管理框架
海思3559A芯片作為嵌入式ARM開發板,具有高算力、低功耗等特性,為嵌入式領域人臉識別,語音識別,智能算法等人工智能應用提供了硬件支撐。容器技術提供了管理軟件開發、測試、構建和部署的簡單方法。
同時使用Harbor作為容器鏡像倉庫嗎,Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署私有環境內的Registry是必要的。Harbor是一個由VMware公司開源的企業級的Docker Registry管理項目,用于存儲和分發Docker鏡像的開源鏡像倉庫,用于容器鏡像管理,主要提供權限管理(RBAC)、LDAP、日志審核、管理界面、自我注冊、基于角色的鏡像訪問控制、鏡像復制、鏡像漏洞分析、鏡像驗真和操作審計、中文支持等功能。
運行在整個集群中的容器需要容器集群管理系統對其進行編排調度,占據統治地位的Kubernetes集成了許多組件,源碼規模龐大,超百萬行,在嵌入式領域資源受限的情況下難以直接應用。因此,選用輕量級Kubernetes發行版K3S,更適合在ARM架構、嵌入式領域、以及邊緣環境下運行使用,海思3559A芯片配合輕量化容器集群管理系統K3S可以滿足邊緣計算、物聯網、ARM架構平臺下對容器集群管理的需求。
實驗硬件環境由五塊海思3559A開發板組成,開發板之間經由網線通過交換機聯通,構成五個節點的容器集群,控制節點1、控制節點2、控制節點3作為主節點,運行K3S Master進程,工作節點1、工作節點2作為工作節點,運行K3S節點代理進程,五個節點上都部署了嵌入式Linux操作系統,每個節點都安裝了Docker容器引擎,另外控制節點1布置Harbor鏡像倉庫,用于整個集群鏡像的存儲拉取和推送,測試硬件環境如圖3所示。

圖3 測試硬件環境
編寫任務A與負載B兩類容器化應用程序。任務A:http服務器應用,其作用是返回當前任務運行的宿主機名稱。負載B:腳本訪問程序,其工作內容是使用腳本不間斷訪問任務A所設立的服務器應用,訪問強度可以自定義。
3.2.1 動態遷移
當集群處于初始狀態時,工作節點1上容器內運行任務A:http服務器應用,使用負載B,不間斷訪問此服務。此時采用斷電/斷開網絡連接等方式使得工作節點1失效,k3s容器集群管理系統可以不經人為干預自動地將工作節點1上運行的任務A遷移至工作節點2上運行,具體流程如下:當K3S控制節點發現工作節點1失聯,任務A無法正常運行時,經過確認以及重試無法重新連接時,向工作節點2發送啟動任務A命令,工作節點2上的節點代理kubelet收到消息后,調用Docker容器引擎從控制節點1上部署的Harbor中拉取鏡像,然后創建容器任務A,實現任務的動態遷移。
3.2.2 彈性伸縮
當集群處于初始狀態時,工作節點1上容器內運行任務A:http服務器應用,使用負載B,不間斷訪問此服務。增大負載B的訪問強度,當超出工作節點1上任務A的設計承受范圍時,系統根據設置自動擴容,在工作節點2上啟動新的容器,容器中部署任務A。工作節點1與工作節點2上同時運行任務A,共同承擔訪問流量壓力,且都在設計承受范圍內,系統不再擴容。減小負載B的訪問強度,回歸初始狀態值,工作節點4和工作節點2負載降低,低于預定下限值后,K3S容器管理系統執行縮容操作,隨機保留一個工作節點之上的任務A,即滿足負載B的訪問需求。實現了系統的彈性伸縮。
3.2.3 負載均衡
當集群處于初始狀態時,工作節點1、工作節點2上都運行著任務A,此時運行負載B,訪問流量會根據預先設定的策略(此處為均分策略),將訪問流量平均發送到工作節點1和工作節點2之上,實現了負載均衡。
3.2.4 測試結果分析
在ARM架構的海思3559A平臺上使用K3S對容器集群進行管理時:系統可以將一個節點之上的任務遷移至另一個節點,實現了動態遷移;同時,系統能夠隨請求的增減,實現系統擴容,在業務下降的時候,能實現系統縮容,實現了動態伸縮;此外,系統將網絡請求進行平衡,分攤到多個嵌入式開發板上進行運行,將網絡流量平均發送到多個工作節點上,保證了整個業務系統的高可用,實現了負載均衡。
總結下來,在5片海思3559A嵌入式開發板所構成的集群上,通過引入容器和輕量化容器集群管理技術,實現了容器化工作任務的動態遷移、彈性伸縮、負載均衡。
本文使用5塊部署了嵌入式Linux的海思3559A芯片開發板,在其上運行了容器集群,并使用輕量級容器集群管理系統K3S對整個集群的容器化應用進行管理,編寫程序對動態遷移、彈性伸縮、負載均衡等功能特性進行了測試驗證。未來隨著云原生、邊緣計算等向嵌入式領域擴展,更多高算力、低功耗的嵌入式開發板的出現,容器及容器集群管理系統在嵌入式領域將迎來更加廣闊的應用前景。