如何顺利完成Kubernetes源码编译

12次阅读
没有评论

本篇文章给大家分享的是有关如何顺利完成 Kubernetes 源码编译,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

为什么要编译源码  ?

Kubernetes 是一个非常棒的容器集群管理平台。通常情况下,我们并不需要修改 K8S 代码即可直接使用。但如果,我们在环境中发现了某个问题 / 缺陷,或按照特定业务需求需要修改 K8S 代码时,如定制 Kubelet 的 StopContainer  逻辑、kube-scheduler 的 pod 调度逻辑等。为了让修改生效,那么就需要编译 K8S 代码了。

Kubernetes 源码编译,大致分为本地二进制可执行文件编译和 docker 镜像编译两种。由于在我们的环境中,Kubernetes 是由 Docker 容器方式运行的。故此我们需要采用后面一种方式编译,即镜像编译。

由于 Kubernetes 每个组件服务的镜像 Dockerfile 文件是由 Kubernetes 源码自动生成的,因此,社区并未提供每个组件的镜像 Dockerfile 文件。编译本地二进制可执行文件很简单,也更直接。而 docker 镜像编译资料却很少,且碍于某种特殊网络原因,会导致失败。此处,将介绍如何顺利的完成 K8S 镜像编译。

安装依赖  

安装 Golang

如何顺利完成 Kubernetes 源码编译

指定分支,下载 Kubernetes 源代码(默认 $GOPATH 目录为 /root/go/)

如何顺利完成 Kubernetes 源码编译

本地二进制文件编译 Kubernetes(方法一) 

修改运行平台配置参数(可选)

根据自己的运行平台(linux/amd64) 修改 hack/lib/golang.sh,把 KUBE_SERVER_PLATFORMS,KUBE_CLIENT_PLATFORMS 和 KUBE_TEST_PLATFORMS 中除 linux/amd64 以外的其他平台注释掉,以此来减少编译所用时间。

编译源码

进入 Kubernetes 根目录下

如何顺利完成 Kubernetes 源码编译

KUBE_BUILD_PLATFORMS 指定目标平台,WHAT 指定编译的组件,通过 GOFLAGS 和 GOGCFLAGS 传入编译时参数,如此处编译 kubelet  组件。

如何顺利完成 Kubernetes 源码编译

如果不指定 WHAT,则编译全部。

make all 是在本地环境中进行编译的。

make release 和 make quick-release 在容器中完成编译、打包成 docker 镜像。

编译 kubelet 这部分代码,也可执行 make clean make WHAT=cmd/kubelet

检查编译成果

编译过程较长,请耐心等待,编译后的文件在 kubernetes/_output 里。

或者进入 cmd/kubelet (以 kubelet 为例子)

执行 go build - v 命令, 如果没出错, 会生成可执行文件 kubelet

如何顺利完成 Kubernetes 源码编译

生成的可执行文件在当前文件夹下面

如何顺利完成 Kubernetes 源码编译

Docker 镜像编译 Kubernetes(方法二)

查看 kube-cross 的 TAG 版本号

如何顺利完成 Kubernetes 源码编译

查看 debian_iptables_version 版本号

如何顺利完成 Kubernetes 源码编译

这里,我使用 DockerHub 的 Auto build 功能,来构建 K8s 镜像。自然将编译需要用到的 base 镜像,放在了 DockerHub 上(也算是为促进国内 K8s 源码 docker 编译贡献绵薄之力吧!)。

如何顺利完成 Kubernetes 源码编译

把 build/lib/release.sh 中的–pull 去掉,避免构建镜像继续拉取镜像:

如何顺利完成 Kubernetes 源码编译

编辑文件 hack/lib/version.sh

将 KUBE_GIT_TREE_STATE=”dirty”  改为  KUBE_GIT_TREE_STATE=”clean”,确保版本号干净。

执行编译命令

如何顺利完成 Kubernetes 源码编译

其中 KUBE_BUILD_PLATFORMS=linux/amd64 指定目标平台为 linux/amd64,GOFLAGS=- v 开启 verbose 日志,GOGCFLAGS=”-N -l”禁止编译优化和内联,减小可执行程序大小。

编译的 K8s Docker 镜像以压缩包的形式发布在_output/release-tars 目录中

如何顺利完成 Kubernetes 源码编译

使用编译镜像

等待编译完成后,在_output/release-stage/server/linux-amd64/kubernetes/server/bin/ 目录下保存了编译生成的二进制可执行程序和 docker 镜像 tar 包。如导入 kube-apiserver.tar 镜像,并更新环境上部署的 kube-apiserver 镜像。

如何顺利完成 Kubernetes 源码编译

整个编译过程结束后,现在就可以到 master 节点上,修改 /etc/kubernetes/manifests/kube-apiserver.yaml 描述文件中的 image,修改完立即生效。

以上就是如何顺利完成 Kubernetes 源码编译,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。