本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
MIPS 上的 Kubernetes
背景
MIPS (Microprocessor without Interlocked Pipelined Stages) 是一種精簡指令集電腦 (RISC) 指令集架構 (ISA),於 1981 年問世,由 MIPS Technologies 開發。現在 MIPS 架構廣泛應用於許多電子產品中。
Kubernetes 已正式支援多種 CPU 架構,例如 x86、arm/arm64、ppc64le、s390x。然而,遺憾的是 Kubernetes 不支援 MIPS。隨著雲端原生技術的廣泛應用,MIPS 架構下的使用者也迫切需要 MIPS 上的 Kubernetes。
成就
多年來,為了豐富開源社群的生態,我們一直致力於調整 MIPS 架構以適用於 Kubernetes 用例。隨著 MIPS CPU 的持續迭代最佳化和效能提升,我們在 mips64el 平台上取得了一些突破性進展。
多年來,我們一直積極參與 Kubernetes 社群,並在 Kubernetes 技術的使用和最佳化方面擁有豐富的經驗。最近,我們嘗試將 MIPS 架構平台適配於 Kubernetes,並在該旅程中邁向了新的階段。該團隊已完成 Kubernetes 和相關組件的遷移和適配,不僅建構了穩定且高度可用的 MIPS 叢集,還完成了 Kubernetes v1.16.2 的一致性測試。
圖 1 MIPS 上的 Kubernetes
K8S-MIPS 組件建置
幾乎所有與 Kubernetes 相關的原生雲端組件都沒有提供 MIPS 版本的安裝套件或映像檔。在 MIPS 平台上部署 Kubernetes 的先決條件是在 mips64el 平台上編譯和建置所有必需的組件。這些組件包括
- golang
- docker-ce
- hyperkube
- pause
- etcd
- calico
- coredns
- metrics-server
感謝 Golang 的卓越設計及其對 MIPS 平台的良好支援,上述雲端原生組件的編譯過程大大簡化。首先,我們在最新的穩定版本上為 mips64el 平台編譯了 Golang,然後我們使用原始碼編譯了上述大多數組件。
在編譯過程中,我們不可避免地遇到了許多平台相容性問題,例如 Golang 系統調用相容性問題 (syscall)、將 syscall.Stat_t 從 uint32 轉換為 uint64、EpollEvent 的修補等等。
為了建置 K8S-MIPS 組件,我們使用了交叉編譯技術。我們的流程涉及整合 QEMU 工具以轉換 MIPS CPU 指令,以及修改 Kubernetes 的建置腳本和 MIPS 架構上 Kubernetes、Hyperkube 和 E2E 測試映像檔的 E2E 映像檔腳本。
成功建置上述組件後,我們使用 kubespray 和 kubeadm 等工具完成 Kubernetes 叢集建構。
名稱 | 版本 | MIPS 儲存庫 |
---|---|---|
MIPS 上的 golang | 1.12.5 | - |
MIPS 上的 docker-ce | 18.09.8 | - |
適用於 MIPS 上 CKE 的 metrics-server | 0.3.2 | registry.inspurcloud.cn/library/cke/kubernetes/metrics-server-mips64el:v0.3.2 |
適用於 MIPS 上 CKE 的 etcd | 3.2.26 | registry.inspurcloud.cn/library/cke/etcd/etcd-mips64el:v3.2.26 |
適用於 MIPS 上 CKE 的 pause | 3.1 | registry.inspurcloud.cn/library/cke/kubernetes/pause-mips64el:3.1 |
適用於 MIPS 上 CKE 的 hyperkube | 1.14.3 | registry.inspurcloud.cn/library/cke/kubernetes/hyperkube-mips64el:v1.14.3 |
適用於 MIPS 上 CKE 的 coredns | 1.6.5 | registry.inspurcloud.cn/library/cke/kubernetes/coredns-mips64el:v1.6.5 |
適用於 MIPS 上 CKE 的 calico | 3.8.0 | registry.inspurcloud.cn/library/cke/calico/cni-mips64el:v3.8.0 registry.inspurcloud.cn/library/cke/calico/ctl-mips64el:v3.8.0 registry.inspurcloud.cn/library/cke/calico/node-mips64el:v3.8.0 registry.inspurcloud.cn/library/cke/calico/kube-controllers-mips64el:v3.8.0 |
注意:CKE 是 Inspur 推出的基於 Kubernetes 的雲端容器引擎
圖 2 K8S-MIPS 叢集組件
圖 3 CPU 架構
圖 4 叢集節點資訊
執行 K8S 一致性測試
驗證 K8S-MIPS 叢集的穩定性和可用性最直接的方法是執行 Kubernetes 一致性測試。
一致性是一個獨立的容器,用於啟動 Kubernetes 端對端測試以進行一致性測試。
測試開始後,它會為各種端對端測試啟動多個 Pod。這些 Pod 使用的映像檔原始碼主要來自 kubernetes/test/images
,而建置的映像檔位於 gcr.io/kubernetes-e2e-test-images
。由於儲存庫中沒有 MIPS 映像檔,我們必須先建置所有需要的映像檔才能執行測試。
建置測試所需的映像檔
第一步是找到測試所需的所有映像檔。我們可以執行 sonobuoy images-p e2e
命令來列出所有映像檔,或者我們可以在 /test/utils/image/manifest.go 中找到這些映像檔。雖然 Kubernetes 官方有一個完整的 Makefile 和 shell 腳本,提供了用於建置測試映像檔的命令,但仍有許多與架構相關的問題尚未解決,例如基礎映像檔和相依性的不相容性。因此,我們無法透過執行這些命令直接建置 mips64el 架構映像檔。
大多數測試映像檔都在 golang 中,然後編譯成二進制檔案,並作為基於相應 Dockerfile 的 Docker 映像檔建置。這些映像檔很容易建置。但請注意,大多數映像檔都使用 alpine 作為其基礎映像檔,而 alpine 目前尚未正式支援 mips64el 架構。目前,我們無法製作 mips64el 版本的 alpine,因此我們必須將 alpine 替換為現有的 MIPS 映像檔,例如 Debian-stretch、fedora、ubuntu。替換基礎映像檔也需要替換安裝相依性的命令,甚至是這些相依性的版本。
有些映像檔不在 kubernetes/test/images
中,例如 gcr.io/google-samples/gb-frontend:v6
。沒有明確的文件說明這些映像檔位於何處,儘管我們在儲存庫 github.com/GoogleCloudPlatform/kubernetes-engine-samples 中找到了原始碼。我們很快遇到了新的問題:要建置這些 google 範例映像檔,我們必須建置它使用的基礎映像檔,甚至是基礎映像檔的基礎映像檔,例如 php:5-apache
、redis
和 perl
。
經過漫長的映像檔建置過程,我們完成了大約四十多個映像檔,包括測試 Pod 使用的映像檔和基礎映像檔。我們執行測試之前的最後一步是將所有這些映像檔放入叢集中的每個節點,並確保 Pod 映像檔提取策略為 imagePullPolicy: ifNotPresent
。
以下是我們建置的一些映像檔:
docker.io/library/busybox:1.29
docker.io/library/nginx:1.14-alpine
docker.io/library/nginx:1.15-alpine
docker.io/library/perl:5.26
docker.io/library/httpd:2.4.38-alpine
docker.io/library/redis:5.0.5-alpine
gcr.io/google-containers/conformance:v1.16.2
gcr.io/google-containers/hyperkube:v1.16.2
gcr.io/google-samples/gb-frontend:v6
gcr.io/kubernetes-e2e-test-images/agnhost:2.6
gcr.io/kubernetes-e2e-test-images/apparmor-loader:1.0
gcr.io/kubernetes-e2e-test-images/dnsutils:1.1
gcr.io/kubernetes-e2e-test-images/echoserver:2.2
gcr.io/kubernetes-e2e-test-images/ipc-utils:1.0
gcr.io/kubernetes-e2e-test-images/jessie-dnsutils:1.0
gcr.io/kubernetes-e2e-test-images/kitten:1.0
gcr.io/kubernetes-e2e-test-images/metadata-concealment:1.2
gcr.io/kubernetes-e2e-test-images/mounttest-user:1.0
gcr.io/kubernetes-e2e-test-images/mounttest:1.0
gcr.io/kubernetes-e2e-test-images/nautilus:1.0
gcr.io/kubernetes-e2e-test-images/nonewprivs:1.0
gcr.io/kubernetes-e2e-test-images/nonroot:1.0
gcr.io/kubernetes-e2e-test-images/resource-consumer-controller:1.0
gcr.io/kubernetes-e2e-test-images/resource-consumer:1.5
gcr.io/kubernetes-e2e-test-images/sample-apiserver:1.10
gcr.io/kubernetes-e2e-test-images/test-webserver:1.0
gcr.io/kubernetes-e2e-test-images/volume/gluster:1.0
gcr.io/kubernetes-e2e-test-images/volume/iscsi:2.0
gcr.io/kubernetes-e2e-test-images/volume/nfs:1.0
gcr.io/kubernetes-e2e-test-images/volume/rbd:1.0.1
registry.k8s.io/etcd:3.3.15
(映像檔自發布以來已變更 - 先前使用的 registry 為 "k8s.gcr.io")registry.k8s.io/pause:3.1
(映像檔自發布以來已變更 - 先前使用的 registry 為 "k8s.gcr.io")
最後,我們執行了測試並獲得了測試結果,包括 e2e.log
,其中顯示所有測試案例均已通過。此外,我們將測試結果作為 pull request 提交給 k8s-conformance。
圖 5 一致性測試結果的 Pull request
下一步
我們手動建置了 kubernetes-MIPS 組件並完成了相符性測試,這驗證了 Kubernetes 在 MIPS 平台上的可行性,並大大增強了我們推動 Kubernetes 支援 MIPS 架構的信心。
未來,我們計劃積極將我們的經驗和成就貢獻給社群,提交 PR 和 MIPS 修補程式。我們希望社群中更多的開發人員和公司加入我們,共同推廣 MIPS 上的 Kubernetes。
貢獻計劃:
- 貢獻 MIPS 的 e2e 測試映像檔原始碼
- 貢獻 MIPS 的 hyperkube 原始碼
- 貢獻適用於 MIPS 的 kubeadm 等部署工具原始碼