超詳細的ARM架構(gòu)適配介紹! - 掘金
本文主要介紹云聯(lián)壹云平臺如何適配ARM,并運行在ARM CPU架構(gòu)的機器上。
背景介紹
1、平臺服務(wù)運行架構(gòu)
云聯(lián)壹云平臺采用容器化,分布式的架構(gòu)運行在 Kubernetes(K8s)之上。下面是平臺服務(wù)運行的架構(gòu)圖:
在多個節(jié)點之上,我們會構(gòu)建Kubernetes的集群 ,它是一個容器管理的平臺。
在Kubernetes的平臺之上,后端服務(wù)都是容器化的,是以容器的方式去分布式運行。
通過K8s去做調(diào)度的管理,然后將服務(wù)自動地打散到多個節(jié)點上運行,總結(jié)兩點是服務(wù)容器化,并依靠K8s來提供容器分布式運行的環(huán)境。
另外,底層的節(jié)點是有類型的,控制層面的服務(wù)運行在控制節(jié)點,平臺內(nèi)置了一個私有云,提供了完整的私有云功能。
若要使用私用云這個功能,則還需要一些計算節(jié)點,計算節(jié)點上會跑虛擬化相關(guān)的軟件,提供私有云虛擬化的功能,總結(jié)來說就是計算節(jié)點運行私有云的虛擬機。
2、CPU架構(gòu)簡介
大家熟悉的服務(wù)器或者臺式機都是X86架構(gòu)的CPU,X86架構(gòu)的CPU特點是性能高,并且軟件的兼容性很好。
大家平常工作中使用的大部分是英特爾等提供的X86架構(gòu)的CPU,對于英特爾和AMD大家都不陌生,這兩家廠商專門生產(chǎn)X86架構(gòu)CPU。
另外X86 64位這種架構(gòu)的CPU存在別名,例如x86_64或者amd64都代表X86架構(gòu)的64位CPU。
與X86不同的是還有另一種稱為ARM的架構(gòu),這是本文的主題,那么ARM架構(gòu)的CPU和X86架構(gòu)的CPU相比有何不同?
它的制造成本更低,ARM架構(gòu)的芯片的功耗也很低,代表性的廠商和使用者是蘋果和華為。
蘋果將生產(chǎn)的ARM芯片用到筆記本或IMAC上,ARM架構(gòu)的CPU越來越普及。
國內(nèi)的華為會生產(chǎn)基于ARM架構(gòu)的服務(wù)器,64位ARM架構(gòu)CPU也有別名,例如arm64、aarch64,這兩種叫法表達同一個意思。
3、為什么適配ARM
因為ARM的CPU普及是大環(huán)境下的發(fā)展趨勢,例如在國際上,蘋果將ARM架構(gòu)的CPU投入到筆記本和臺式機上,在國產(chǎn)化方面,國內(nèi)有鯤鵬和飛騰CPU,國產(chǎn)的基于ARM架構(gòu)的服務(wù)器,現(xiàn)在市場上主流的是鯤鵬和飛騰。?在國產(chǎn)化上,使用ARM架構(gòu)也是一個趨勢。
另外是適配了ARM架構(gòu)能夠提升產(chǎn)品的競爭力,競爭力體現(xiàn)在能夠支持管理基于ARM64位和X86_64架構(gòu)的虛擬化混合部署。
這種混合部署的意思是可以同時把服務(wù)運行在ARM和X86的服務(wù)器上,同時運行各自的虛擬化,可以通過我們平臺統(tǒng)一部署和管理。
如何適配ARM64?
1、需要解決的關(guān)鍵問題
第一個方面是怎樣把服務(wù)運行在64位的ARM架構(gòu)上?
還有一方面是因為我們內(nèi)置了一個私有云,上層的私有云業(yè)務(wù)如何支持64位的ARM架構(gòu)?
通過架構(gòu)圖可以了解到服務(wù)是容器化運行在K8s之上的,再由K8s幫我們將服務(wù)分布式地運行在各個節(jié)點上,所以第一步是要部署異構(gòu)CPU架構(gòu)的K8s集群,異構(gòu)CPU架構(gòu)的意思是K8s集群要運行在X86和ARM架構(gòu)的機器上。
具體而言就是要選擇一個支持ARM架構(gòu)的Linux的發(fā)行版。
K8s節(jié)點上的操作系統(tǒng)是Linux,首先要選擇支持ARM架構(gòu)的Linux操作系統(tǒng),操作系統(tǒng)同時能夠安裝K8s必要的軟件(比如docker-ce、kubelet等)
當我們把K8s集群給部署起來之后,就要將不同架構(gòu)的容器鏡像統(tǒng)一制作出來。
統(tǒng)一容器鏡像的意思是一個容器鏡像中要包含X86和ARM架構(gòu),相當于同一個鏡像名稱中有兩種架構(gòu)的鏡像。
第二個大的方面是上層私有云業(yè)務(wù)怎樣支持ARM64。
主要是分為兩個問題,第一個問題是要支持ARM的虛擬機鏡像,同時上層的私有云業(yè)務(wù)能夠標記宿主機,宿主機就是運行虛擬機的服務(wù)器。
要能夠標記這種宿主機是什么架構(gòu),同時要在這個宿主機上運行ARM的虛擬化軟件。
平臺使用的虛擬化軟件基于qemu/kvm,網(wǎng)絡(luò)方面依賴openvswitch組件,要求這些組件也要能夠在ARM架構(gòu)上運行。
這就是要介紹的一些關(guān)鍵問題,解決好這些關(guān)鍵問題,不管是底層的業(yè)務(wù)還是上層的私有云業(yè)務(wù),都能在ARM上運行。
2、Linux發(fā)行版選擇
我們選擇的發(fā)行版是Debian 10(開源)和統(tǒng)信UOS(國產(chǎn)系統(tǒng))。
選擇這兩個發(fā)行版的第一個原因是客戶業(yè)務(wù)上要求在ARM64服務(wù)器上運行“統(tǒng)信UOS”。
要適配的話也是首先適配國產(chǎn)統(tǒng)信UOS,在適配過程中,UOS中的內(nèi)核和打包工具與Debian基本一致。
適配UOS之后,發(fā)現(xiàn)其工作基本相同,所以又選擇了Debian 10(開源)進行適配。
如此無論是對于開源用戶還是其他客戶,如果不選擇UOS,也可以選擇Debian 10的發(fā)型版運行此平臺,Debian系列對ARM64位的支持很好,
Debian發(fā)行版的官方軟件倉庫中已經(jīng)制作好了很多ARM64的包,如果要安裝docker和K8s的軟件包,Debian中已經(jīng)做好,直接下載安裝即可。
為什么不在ARM架構(gòu)上面再選擇CentOS7發(fā)行版?
原因在于CentOS7官方即將停止維護,所以選擇了Debian系列的發(fā)行版。
3、統(tǒng)信UOS適配認證
對統(tǒng)信UOS適配過后,經(jīng)過其官方測試,為我們頒發(fā)了認證證書。
4、統(tǒng)一軟件依賴—包管理工具
選擇好發(fā)行版后?怎樣統(tǒng)一安裝這些軟件?
我們能夠使用不同發(fā)行版的包管理工具去安裝相同的軟件,例如在X86的CentOS上安裝docker和K8s這些包時調(diào)用yum,在Debian上調(diào)用apt install 等同樣的包名即可。
上游的軟件倉庫中已經(jīng)把包做好,只需直接安裝,軟件直接下載即可使用。
在底層軟件方面,ARM和X86的管理,只要發(fā)行版是主流的,驗證Debian和X86的包沒有區(qū)別,已經(jīng)將底層的包安裝部署好。
5、部署kubernetes集群
另外一個話題是部署kubernetes集群,如何在ARM上部署K8s集群?
首先,我們寫了名稱為ocboot的部署工具,它的底層原理是調(diào)用ansible實現(xiàn)部署ARM64+X86_64的多節(jié)點Kubernetes,這個截圖的意思是通過這個工具部署過后的混布的就是異構(gòu)的K8s集群的節(jié)點的資源。
從截圖中可以發(fā)現(xiàn),第一個節(jié)點是centos-x86-64,發(fā)行版名稱是centos7,內(nèi)核是3.10,K8s會通過打標簽的方式標記這個節(jié)點,它是amd64。
amd64代表它是X86架構(gòu)的一個節(jié)點,另外一個節(jié)點是uos-arm64,它的發(fā)行版是uos,內(nèi)核是4.19.0-arm64的內(nèi)核。K8s會通過打標簽標記它是ARM64的一個節(jié)點,這就代表是一個同時基于X86和ARM64的節(jié)點構(gòu)建的K8s集群。
使用K8s集群的好處是K8s 集群提供了不同CPU架構(gòu)節(jié)點的統(tǒng)一管理,通過一個API能夠把所有架構(gòu)的節(jié)點拿到,能夠基于這些節(jié)點提供容器服務(wù)的運行。 6、服務(wù)統(tǒng)一鏡像運行 部署好K8s集群之后如何運行云聯(lián)壹云的服務(wù)?
例如K8s中有daemonset的資源,這種資源表示在每一個K8s節(jié)點上都會運行pod容器。
它要求在這個資源中寫好服務(wù)容器鏡像的地址,即紅框中所標記的。
只要按照這樣的格式寫,寫好之后創(chuàng)建到k8s集群中,K8s就會將提供的鏡像以容器化的方式運行到各個節(jié)點上。
從圖中可以了解到,在centos?X86的節(jié)點上和UOS ARM架構(gòu)的節(jié)點上都同時運行host的服務(wù),這是如何做到的呢?
這就要求統(tǒng)一服務(wù)的進項,要在host:v3.6.10的鏡像中包含兩種架構(gòu)的鏡像格式,它的底層同時將X86和ARM的格式捆綁到一起,在實際運行過程中,在不同的架構(gòu)的節(jié)點上,docker會根據(jù)當前節(jié)點的架構(gòu)拉取鏡像中不同架構(gòu)的格式的鏡像運行。
7、私有云業(yè)務(wù)如何支持ARM64?
- 宿主機 列表
在運行虛擬機的宿主機上去標記宿主機的架構(gòu)類別,云平臺的前端界面可以看到,給宿主機列表上面加了CPU架構(gòu)的屬性,ARM架構(gòu)服務(wù)器的宿主機,會給它一個稱為aarch64的CPU架構(gòu)來標記,X86則會標記x86_64的CPU架構(gòu)屬性 。
若要運行虛擬機,則需要先提供虛擬機的鏡像,我們在虛擬機的鏡像中也使用了CPU架構(gòu)的屬性來標記虛擬機鏡像是X86架構(gòu)還是ARM 64位的架構(gòu)。
提供宿主機和虛擬鏡像過后,即可創(chuàng)建虛擬機,在創(chuàng)建虛擬機的表單中,會讓用戶去選擇是要創(chuàng)建ARM架構(gòu)的虛擬機還是X86架構(gòu)的虛擬機。
創(chuàng)建好虛擬機過后,平臺負責將這些虛擬機根據(jù)所提供的CPU架構(gòu)調(diào)入到不同架構(gòu)的宿主機上,這是一個在平臺同時創(chuàng)建的X86和ARM的虛擬機列表界面。
在此列表中通過CPU架構(gòu)的字段了解虛擬機的架構(gòu)類型,這就是在私有云這個業(yè)務(wù)做的改造并支持ARM64位架構(gòu)。
技術(shù)細節(jié) 如何制作統(tǒng)一的容器鏡像(支持X86_64和ARM64)?
- docker?buildx方案
docker原生支持的多架構(gòu)鏡像制作方案
點擊進入官方介紹
- 使用交叉編譯然后打包
分別編譯打包出x86_64和arm64的容器鏡像,然后捆綁到一起。
1、統(tǒng)一容器鏡像—docker?buildx
- 編寫適用buildx的?Dockerfile
docker通過讀取file中的語句,制作出鏡像,Dockerfile先基于一個稱golang:alpine的鏡像,把它作為一個build容器。
同時,其中會傳兩個參數(shù),分別是TARGETPLATFORM 和BUILDPLATFORM。
TARGETPLATFORM的意思是制作出的鏡像架構(gòu),BUILDPLATFORM 是當前制作鏡像機器的架構(gòu) ,這里RUN的命令會讀取這兩個環(huán)境變量,然后將他們的值打到名稱為log的文件中。
第二步,F(xiàn)ROM alpine 的語句是找到alpine這個鏡像,基于這個容器鏡像將build容器中的log文件拷貝出來。
使用buildx 同時制作x86_64和arm64架構(gòu)的鏡像。
-t的意思是build出的鏡像的名稱,push代表要push到docker鏡像倉庫中,platform參數(shù)代表制作出來的鏡像同時代表兩個架構(gòu),分別是x86 64位架構(gòu)和arm64位架構(gòu)。
運行此命令,docker buildx就會基于dockerfile的步驟,同時拉取ARM架構(gòu)和X86架構(gòu)的基礎(chǔ)鏡像。
基于基礎(chǔ)鏡像運行里面相同的語句,例如紅色標記的地方,它同時運行兩個架構(gòu)的指令,相當于同時拉取了amd64和arm64的alpine 鏡像。
去build時,同一條build語句也在amd64和arm64這兩個架構(gòu)上運行。
通過build出的結(jié)果即可發(fā)現(xiàn)RUN的這個命令,是在X86架構(gòu)的機器上制作的鏡像build出的結(jié)果,例如第一條是build出了arm64的鏡像,第二條是build出X86 64位的鏡像。
build完鏡像過后,把它push到鏡像倉庫中,即可通過docker manifest 這個命令去查詢這個鏡像里面的一些元數(shù)據(jù),查看剛才制作的鏡像,manifest 中有兩種格式,第一種格式是amd64,表示X86_64架構(gòu),第二種格式是ARM64,是能夠運行在ARM上的鏡像,這些都是buildx做好的,我們只需要寫dockerfile。
它默認幫我們制作出來一個多架構(gòu)的容器鏡像。
buildx 如何在 x86_64的機器上制作arm64的鏡像?
通過binfmt_misc模擬arm64硬件的用戶空間,然后調(diào)用qemu的用戶態(tài)模式編譯程序。
最終結(jié)果是調(diào)用buildx的命令過后,編譯進程后,會運行qemu-aarch64 工具,相當于模擬出arm64的硬件環(huán)境,然后調(diào)用ARM的工具做編譯,截圖中,后端服務(wù)都是用Golang編寫,都需要做編譯。
2、統(tǒng)一容器鏡像-交叉編譯
交叉編譯:直接在x86_64開發(fā)機上編譯arm64二進制。
圖中的Go代碼,其中寫了main的函數(shù),在X86的機器上直接編譯,調(diào)go build工具,然后把它編譯成一個叫做t_x86_64的二進制可執(zhí)行文件。
然后在操作系統(tǒng)上調(diào)用file去看可執(zhí)行文件的內(nèi)容,通過信息可知這是一個64位的可執(zhí)行文件,并且是x86-64架構(gòu)。
Go中的交叉變異很簡單,指定GOARCH的環(huán)境變量,然后把它設(shè)置為arm64,然后再運行相同的go ?build的命令,即可使用交叉編譯,編譯出ARM可執(zhí)行的文件。?
編譯出來之后,再去看t_arm64的二進制文件,即可發(fā)現(xiàn)它也是64位的執(zhí)行文件,但其架構(gòu)為ARM,此即為交叉編譯的簡單的示例。?相當于在X86的開發(fā)機上使用交叉編譯工具編譯出ARM執(zhí)行文件。
3、如何將不同架構(gòu)鏡像打包
將交叉編譯后的x86_64和arm64容器鏡像組合到一起。
例如已經(jīng)有名稱為service:v1_x86_64的容器鏡像和service:v1_arm64的鏡像,如何將其組合為service:v1 = service:v1_x86_64 + service:v1_arm64 的容器鏡像?
首先創(chuàng)建 service:v1 的 manifest 鏡像,然后將x86_64的鏡像和arm64的鏡像捆綁到一起,然后調(diào)用docker manifest標記鏡像 service:v1_arm64 的架構(gòu)為 arm64 ,標記鏡像 service:v1_x86_64 的架構(gòu)為 amd64 ,再調(diào)用docker push將service:v1 鏡像上傳到鏡像倉庫即可,如此制作出來的一個鏡像中即可包含兩個架構(gòu)。
4、buildx與交叉編譯打包對比
如果使用buildx+binfmt_misc的方式,速度很慢,在本地x86機器上運行,復雜度很低。
如有ARM服務(wù)器,可以通知buildx ssh到遠程的ARM機器,會把編譯arm的部分交給遠端的ARM機器,速度很快,環(huán)境要求為本地x86+遠端arm64機器,因為一般不會給每個開發(fā)人員提供ARM服務(wù)器,所以未采用此種方式。
最后是交叉編譯+manifest打包的方式,速度很快,因為編譯器中做了交叉編譯的優(yōu)化,能夠直接編譯出ARM架構(gòu)的二進制,此種方式只依賴本地的開發(fā)環(huán)境,此種方式復雜度較高。
現(xiàn)階段使用的方式是同時使用buildx + binfmt_misc和交叉編譯 + manifest 打包的方式。
前端不需要編譯的服務(wù):使用buildx + binfmt_misc后端編譯型的服務(wù):使用交叉編譯然后打包
5、私有云管理—虛擬化軟件
私有云上層業(yè)務(wù)支持X86和ARM虛擬化混合管理,要做混布支持,首先要讓虛擬化軟件能夠運行在ARM架構(gòu)上,主要運行虛擬機的軟件是通過名稱為qemu的虛擬化軟件工具,通過交叉編譯的方式運行在ARM架構(gòu)上。
在做編譯之前,只需要配置好目標的架構(gòu)是aarch64即可。
qemu在實際生產(chǎn)使用中要結(jié)合KVM虛擬化加速工具,debian 10 4.19.0 aarch64 內(nèi)核原生支持。
openvswitch 網(wǎng)絡(luò)虛擬交換機可以直接在debian 中安裝使用。
6、私有云管理—業(yè)務(wù)支持
例如在宿主機的資源中加上屬性,標記宿主機是ARM架構(gòu)還是X86架構(gòu),還有在平臺虛擬機鏡像中加上架構(gòu)的屬性,同時調(diào)度器的服務(wù)也要做改造,保證用戶創(chuàng)建一臺ARM架構(gòu)的虛擬機,能夠調(diào)度到ARM的宿主機上。
大家可以根據(jù)圖中列出的 PR詳細地址了解業(yè)務(wù)支持詳情。
GitHub:?github.com/yunionio/cl…
官網(wǎng)地址:www.yunion.cn/文章來源:http://www.zghlxwxcb.cn/news/detail-492033.html
作者:云聯(lián)壹云
鏈接:https://juejin.cn/post/7055624332524912677
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。文章來源地址http://www.zghlxwxcb.cn/news/detail-492033.html
到了這里,關(guān)于超詳細的ARM架構(gòu)適配介紹!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!