在基于全志D1的RISCV64架构下 Kubernetes(k8s) 相关软件编译
-
本帖转载自知乎,原文链接:https://zhuanlan.zhihu.com/p/443777923
作者:在路上Kubernetes(k8s)
中文文档:http://docs.kubernetes.org.cn/
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
为什么要使用容器?通过以下两个图对比:
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。
编译环境
- OS : openEuler Linux 5.4.61 (openEuler镜像下载地址:openEuler-D1-wifi-hdmi-docker-20210826.img.bz2)
- ARCH : riscv64
- 平台 : 全志D1开发板
- go版本 : go version go1.17 linux/riscv64
go和docker安装
详见教程:在D1/openEuler上安装docker,并运行docker/Debian
docker安装前请先确认一下内核配置是否满足:check-config.sh
安装完成docker后还是无法正常使用docker(报错与libseccomp相关),建议重新安装一下libseccomp。
conntrack安装
## 安装支持包 yum install -y bison yum install -y flex ## 手动编译安装conntrack-tools, 因为openEuler-riscv64的软件源中还没有 git clone git://git.netfilter.org/conntrack-tools ./configure --prefix=/usr/local/conntrack && make && make install
在编译conntrack-tools会出现依赖包文件找不到的问题,根据提示进行安装即可。目前openEuler软件源有大部分的包,可直接下载软件以及对应的devel软件。依赖包源码下载地址:https://git.netfilter.org/
# 依赖包如果需要手动安装,一般默认安装路径为/usr/local/lib,需要把对应文件拷贝到以下位置中 /usr/include/libnetfilter_conntrack/ /usr/include/libnfnetlink/ /usr/lib64/libnetfilter_conntrack.la /usr/lib64/libnetfilter_conntrack.so /usr/lib64/libnetfilter_conntrack.so.3 /usr/lib64/libnetfilter_conntrack.so.3.1.3 /usr/lib64/pkgconfig/libnetfilter_conntrack.pc /usr/lib64/pkgconfig/libnfnetlink.pc
编译Kubernetes
由于目前还没有基于riscv架构的kubernetes release包,因此需要从源码入手。
RISCV移植过的源码地址:https://github.com/carlosedp/kubernetes/tree/riscv64_build
对应的PR地址:https://github.com/kubernetes/kubernetes/pull/86011
# 全部编译 KUBE_BUILD_PLATFORMS=linux/riscv64 make # 编译指定组件 KUBE_BUILD_PLATFORMS=linux/riscv64 make all WHAT=cmd/kubelet GOFLAGS=-v GOGCFLAGS="-N -l"
编译完成后,可以在 _output/local/bin/linux/riscv64/ 中找到需要的二进制文件
[root@openEuler-RISCV-rare kubernetes]# ls -l _output/local/bin/linux/riscv64/ total 1166679 -rwxr-xr-x 1 root root 41711688 Nov 30 06:43 apiextensions-apiserver -rwxr-xr-x 1 root root 6227408 Nov 27 08:57 conversion-gen -rwxr-xr-x 1 root root 5961136 Nov 27 08:51 deepcopy-gen -rwxr-xr-x 1 root root 5944720 Nov 27 08:54 defaulter-gen -rwxr-xr-x 1 root root 107038704 Nov 30 06:44 e2e.test -rwxr-xr-x 1 root root 116796584 Nov 30 06:42 e2e_node.test -rwxr-xr-x 1 root root 38709064 Nov 30 06:44 gendocs -rwxr-xr-x 1 root root 129439752 Nov 30 06:44 genkubedocs -rwxr-xr-x 1 root root 135353224 Nov 30 06:42 genman -rwxr-xr-x 1 root root 3285672 Nov 30 06:42 genswaggertypedocs -rwxr-xr-x 1 root root 38704744 Nov 30 06:45 genyaml -rwxr-xr-x 1 root root 7187536 Nov 30 06:42 ginkgo -rwxr-xr-x 1 root root 1900544 Nov 27 09:09 go-bindata -rwxr-xr-x 1 root root 1801424 Nov 30 06:43 go-runner -rwxr-xr-x 1 root root 3366768 Nov 27 08:51 go2make -rwxr-xr-x 1 root root 102367232 Nov 30 06:44 kube-apiserver -rwxr-xr-x 1 root root 95092736 Nov 30 06:43 kube-controller-manager -rwxr-xr-x 1 root root 33816576 Nov 30 06:42 kube-proxy -rwxr-xr-x 1 root root 37289984 Nov 30 06:45 kube-scheduler -rwxr-xr-x 1 root root 35192832 Nov 30 06:44 kubeadm -rwxr-xr-x 1 root root 39321600 Nov 30 06:44 kubectl -rwxr-xr-x 1 root root 96825128 Nov 30 06:43 kubelet -rwxr-xr-x 1 root root 95325544 Nov 30 06:43 kubemark -rwxr-xr-x 1 root root 4674000 Nov 30 06:43 linkcheck -rwxr-xr-x 1 root root 1572864 Nov 30 06:43 mounter -rwxr-xr-x 1 root root 9751176 Nov 27 09:04 openapi-gen
本实验在全志D1的开发板上进行,系统采用的openEuler,由于CPU核数和存储的限制,以下是编译过程中可能遇到的错误:
(1).network: /usr/local/go/pkg/tool/linux_riscv64/compile: signal: killed
问题重现:go build k8s.io/kubernetes/vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network: /usr/local/go/pkg/tool/linux_riscv64/compile: signal: killed
解决方法:
属于OOM错误,需要扩大swap分区
1.创建作为swap分区的文件:增加1GB大小的交换分区
dd if=/dev/zero of=/root/swapfile bs=1M count=1024
2.格式化为交换分区文件
mkswap /root/swapfile
3.启用交换分区文件
swapon /root/swapfile
(2)1_output/bin/deepcopy-gen: Permission denied
问题重现:编译kubernetes时遇到报错./hack/run-in-gopath.sh: line 33: _output/bin/deepcopy-gen: Permission denied
解决方法
yum install -y rsync chmod +x _output/bin/deepcopy-gen make clean make clean_generated
然后重新 make 编译操作。
(3)vendor/http://github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go:10:9: undefined: syscall.Dup2
问题重现:编译kubernetes时遇到报错信息# k8s.io/kubernetes/vendor/github.com/onsi/ginkgo/internal/remote vendor/github.com/onsi/ginkgo/internal/remote/syscall_dup_unix.go:10:9: undefined: syscall.Dup2
解决方法:
这是由于kubernetes库 go.mod 中依赖 ginkgo ,但是 go.mod 中为 ginkgo v1.10.1 版本,而支持riscv的ginkgo版本从v1.11.0开始,因此在编译前需要将go.mod中的ginkgo版本修改为1.11.0
github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.11.0
(4)tmp存储Out of Memory
解决方法参考,如何增加 Linux 下临时文件夹 /tmp 的大小
http://xiehongfeng100.github.io/2016/01/18/ops-how-to-increase-tmp-partition-size/(5)编译etcd
etcd的RISCV移植已经并入主线可直接下载主线代码:https://github.com/etcd-io/etcd
对应的PR地址:https://github.com/etcd-io/etcd/pull/10834# 编译命令 GOOS=linux GOARCH=riscv64 ARCH=riscv64 GO_BUILD_FLAGS='-v -mod=readonly' ./build.sh # 编译结果 [root@k8s-01 etcd]# ls -l bin/ total 70377 -rwxr-xr-x 1 root root 30298920 Nov 28 05:46 etcd -rwxr-xr-x 1 root root 22962560 Nov 28 05:48 etcdctl -rwxr-xr-x 1 root root 18803030 Nov 28 05:46 etcdutl
etcd编译过程中出现的问题
(1)etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=riscv64 set
问题重现:安装etcd时出现etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=riscv64 set,致使etcd启动失败。解决方法
vim etcd/server/etcdmain/etcd.go # 在最后checkSupportArch()函数中添加 if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "riscv64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x" { return } # 重新编译 GOOS=linux GOARCH=riscv64 ARCH=riscv64 GO_BUILD_FLAGS='-v -mod=readonly' ./build.sh 重启一下etcd即成功。
编译flannel
尚未进行RISCV移植,目前只支持二进制编译。
源码地址:https://github.com/flannel-io/flannel
# 编译命令 CGO_ENABLED=1 make dist/flanneld
部署flannel需要dist目录下编译出的flanneld二进制文件和mk-docker-opts.sh文件。
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号