导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    在基于全志D1的RISCV64架构下 Kubernetes(k8s) 相关软件编译

    MR Series
    1
    1
    1135
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 编辑

      本帖转载自知乎,原文链接:https://zhuanlan.zhihu.com/p/443777923
      作者:在路上

      Kubernetes(k8s)

      中文文档:http://docs.kubernetes.org.cn/

      Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

      在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

      为什么要使用容器?通过以下两个图对比:
      F7BDBF4B-CC0D-4429-97F6-09D835A4B050.png

      传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

      新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

      容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在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文件。

      1 条回复 最后回复 回复 引用 分享 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策