1、编译环境
- OS :Loongnix-Server Linux release 8.3
- CPU指令集 : loongarch64
- 平台 : 龙芯
- go版本 : go version go1.15.6 linux/loong64
2、go和docker安装
docker安装:
golang安装:
默认安装golang版本是 go version go1.15.6 linux/loong64,如果需要升级golang版本的话可以
然后根据search结果yum -y install指定golang版本。
3、编译kubernetes源码
kubernetes全部组件编译:
编译指定kubernetes组件:
编译完成后,可以在 _output/local/bin/linux/loong64/
中找到需要的二进制文件。
1)下载指定版本kubernetes源码
从github获取指定版本的k8s源码
解压并进入到kubernetes-1.21.5目录
注意:本文以kubernetes1.21.5版本源码编译为例,其他kubernetes版本编译步骤和kubernetes1.21.5版本源码编译步骤一致。
2)组件编译及错误处理
2.1) 编译kubelet
编译发现报如下错误:
安装一下make即可:
安装完make后重新编译kubelet:
首先会发现golang版本太低,这个直接yum search golang然后通过yum安装>=1.16.0以上版本的即可,详细步骤不再赘余,升级完golang版本后重新编译kubeadm:
会发现kubernetes源码不支持loongarch64指令集问题,下面主要说一下如何解决kubernetes源码不支持loongarch64指令集问题。根据安装完make后重新编译kubelet错误提示,编辑hack/run-in-gopath.sh,发现其引用了hack/lib/init.sh,然后继续编辑hack/lib/init.sh,并递归检查他们依赖的.sh文件,查看这些文件中是否存在CPU指令集相关的逻辑判断,如果存在的话加上龙芯平台loongarch64架构的指令集,这里直接说下哪些文件需要调整:
(1)修改hack/lib/golang.sh文件
在KUBE_SUPPORTED_SERVER_PLATFORMS , KUBE_SUPPORTED_NODE_PLATFORMS ,KUBE_SUPPORTED_CLIENT_PLATFORMS,KUBE_SUPPORTED_TEST_PLATFORMS分别添加上linux/loong64
(2)修改hack/lib/util.sh文件
在kube::util::host_arch() 里添加
(3)修改hack/local-up-cluster.sh文件
(4)修改vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go文件
第二行注释后面追加loong64
修改完以上4个文件后再次编译kubelet
发现找不到rsync,需要安装rsync并赋予prerelease-lifecycle-gen可执行权限
解决完上面错误后再次编译kubelet
发现报golang.org/x/sys/unix包下某些函数没有定义等错误,这是因为它找不到当前平台所对应的硬件信息文件。解决办法是,用GOROOT下的golang.org/x/sys/unix包替换vendor/golang.org/x/sys/路径下面的unix包。
替换完unix包后再次重新编译kubelet:
经过几分钟等待发现kubelet编译成功。
这里可以到_output/bin目录下验证下kubelet是否编译成功。
可以看到kebelet组件没问题,至此kubernetes kueblet组件编译成功。
2.2) 编译kubernetes其他组件
编译kubernetes其他组件(如kubeadm、kubectl...)步骤和编译kubelet一致,这里不再赘余。