MIPS上的捕鱼大亨网络版

作者: 时添贤,尹天ic,王湛,蒋洁ica,蔡Will,高俊杰,孙Simon(浪潮)

背景

MIPS (无互锁流水线级微处理器)是一种简化的指令集计算机(RISC)指令集体系结构(ISA),于1981年出现,由MIPS Technologies开发。现在,MIPS架构已广泛用于许多电子产品中。

捕鱼大亨网络版 已正式支持各种CPU架构,例如x86,arm / arm64,ppc64le和s390x。但是,遗憾的是捕鱼大亨网络版不支持MIPS。随着云原生技术的广泛使用,MIPS架构下的用户也迫切需要MIPS上的捕鱼大亨网络版。

成就成就

多年来,为了丰富开源社区的生态,我们一直在努力针对捕鱼大亨网络版用例调整MIPS架构。通过不断的迭代优化和MIPS CPU的性能改进,我们在mips64el平台上取得了一些突破性进展。

多年来,我们一直积极参与捕鱼大亨网络版社区,并在使用和优化捕鱼大亨网络版技术方面拥有丰富的经验。最近,我们试图为捕鱼大亨网络版改编MIPS架构平台,并在此过程中迈上了一个新台阶。该团队已完成捕鱼大亨网络版及其相关组件的迁移和改编,不仅构建了稳定且高度可用的MIPS集群,还完成了捕鱼大亨网络版 v1.16.2的一致性测试。

MIPS上的捕鱼大亨网络版

图1 MIPS上的捕鱼大亨网络版

K8S-MIPS组件构建

与捕鱼大亨网络版相关的几乎所有本机云组件都不提供MIPS版本的安装包或映像。在MIPS平台上部署捕鱼大亨网络版的前提条件是在mips64el平台上编译和构建所有必需的组件。这些组件包括:

  • 高朗
  • 码头工人
  • 超库
  • 暂停
  • 印花布
  • 核心域名
  • 指标服务器

由于Golang的出色设计及其对MIPS平台的良好支持,上述云原生组件的编译过程得以大大简化。首先,我们在mips64el平台的最新稳定版本上编译了Golang,然后使用源代码编译了上述大多数组件。

在编译过程中,我们不可避免地遇到许多平台兼容性问题,例如Golang系统调用兼容性问题(syscall),类型转换。从uint32到uint64的Stat_t,为EpollEvent进行修补,等等。

为了构建K8S-MIPS组件,我们使用了交叉编译技术。我们的流程涉及集成QEMU工具以转换MIPS CPU指令,并修改MIPS体系结构上的捕鱼大亨网络版的构建脚本和捕鱼大亨网络版的E2E图像脚本,Hyperkube和E2E测试图像。

成功构建以上组件后,我们使用诸如kubespray和kubeadm之类的工具来完成kubernetes集群的构建。

名称MIPS资料库
MIPS上的golang1.12.5-
MIPS上的docker-ce18.09.8-
MIPS上CKE的metrics-server0.3.2registry.inspurcloud.cn/library/cke/kubernetes/metrics-server-mips64el:v0.3.2
等在MIPS上用于CKE3.2.26registry.inspurcloud.cn/library/cke/etcd/etcd-mips64el:v3.2.26
在MIPS上暂停CKE3.1registry.inspurcloud.cn/library/cke/kubernetes/pause-mips64el:3.1
MIPS上用于CKE的hyperkube1.14.3registry.inspurcloud.cn/library/cke/kubernetes/hyperkube-mips64el:v1.14.3
MIPS上的CKE的coredns1.6.5registry.inspurcloud.cn/library/cke/kubernetes/coredns-mips64el:v1.6.5
MIPS上的CKE的印花布3.8.0registry.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)推出的基于捕鱼大亨网络版的云容器引擎

K8S-MIPS群集组件

图2 K8S-MIPS群集组件

CPU架构

图3 CPU架构

集群节点信息

图4群集节点信息

运行K8S一致性测试

验证K8S-MIPS集群的稳定性和可用性的最直接方法是运行捕鱼大亨网络版 一致性测试.

一致性是一个独立的容器,用于启动捕鱼大亨网络版端到端测试以进行一致性测试。

Once the test has started, it launches several pods for various end-to-end tests. The source code of those images used by these pods is mostly from kubernetes/test/images, and the built images are at gcr.io/kubernetes-e2e-test-images. Since there are no MIPS images in the repository, we must first build all needed images to run the test.

建立所需的图像进行测试

The first step is to find all needed images for the test. We can run sonobuoy images-p e2e command to list all images, or we can find those images in /test/utils/image/manifest.go。尽管捕鱼大亨网络版正式具有完整的Makefile和shell脚本,它们提供了用于构建测试映像的命令,但是仍然存在许多与架构相关的问题尚未解决,例如基本映像和依赖项的不兼容性。因此,我们无法通过执行这些命令直接构建mips64el体系结构映像。

大多数测试映像都在golang中,然后编译为二进制文件,并根据相应的Dockerfile构建为Docker映像。这些图像易于构建。但是请注意,大多数图像都使用alpine作为其基础图像,该图像暂时不正式支持mips64el体系结构。目前,我们无法制作mips64el版本的 高山的,因此我们必须将Alpine替换为现有的MIPS映像,例如Debian-stretch,fedora,ubuntu。替换基础映像还需要替换命令以安装依赖项,甚至安装这些依赖项的版本。

Some images are not in kubernetes/test/images, such as gcr.io/google-samples/gb-frontend:v6. There is no clear documentation explaining where these images are locaated, though we found the source code in repository github.com/GoogleCloudPlatform/kubernetes-engine-samples. We soon ran into new problems: to build these google sample images, we have to build the base image it uses, even the base image of the base images, such as php:5-apache, redis, and perl.

After a long process of building an image, we finished with about four dozen images, including the images used by the test pod, and the base images. The last step before we run the tests is to place all those images into every node in the cluster and make sure the Pod image pull policy is 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
  • k8s.gcr.io/etcd:3.3.15
  • k8s.gcr.io/pause:3.1

Finally, we ran the tests and got the test result, include e2e.log, which showed that all test cases passed. Additionally, we submitted our test result to k8s一致性 作为一个 拉取要求.

拉取一致性测试结果的请求

图5要求一致性测试结果的请求

下一步是什么

我们手动构建了kubernetes-MIPS组件并完成了一致性测试,这验证了捕鱼大亨网络版在MIPS平台上的可行性,并极大地增强了我们促进捕鱼大亨网络版支持MIPS架构的信心。

将来,我们计划积极向社区贡献我们的经验和成就,提交PR,并为MIPS打补丁。我们希望社区中更多的开发人员和公司加入我们,并在MIPS上推广捕鱼大亨网络版。

贡献计划:

  • 为MIPS贡献e2e测试图像的来源
  • 为MIPS贡献hyperkube的来源
  • 为MIPS贡献诸如kubeadm之类的部署工具的来源