kubernetes 源码编译分为本地编译和镜像编译,本地编译是指最终编译出来的是二进制可执行文件,镜像编译是
最终编译出来的产出物为 docker 镜像 tar 包。本文主要介绍本地编译的方法,以编译 kube-apiserver 组件为例说明。
环境要求
- Go 环境: go1.12.xx
- gcc
我的环境说明:Mac Os + go1.12.10 + gcc,如果读者本地的 Go 版本不是 go1.12.xx,可以使用 gvm 工具安装一个,gvm 是 Go 多版本管理工具,具体使用方法可以看之前的文章:Golang 多版本管理神器 gvm
本地编译也分为两种,一种是 make 编译,另一种是 Go 命令行编译,下面一一介绍:
一、make 编译
1.下载 k8s 源码1
go get k8s.io/kubernetes
2.编译指定版本源码(以1.16.3为例)1
2cd $GOPATH/src/k8s.io/kubernetes
git checkout tags/v1.16.3
3.设置要编译的组件(以编译 kube-apiserver 组件为例说明)
mac 下编译要安装 GNU tar: sudo brew install gnu-tar
1 | make clean && make WHAT=cmd/kube-apiserver |
编译产出物会在 _output/bin 目录生成:1
2
3
4
5
6
7
8$ ls -1 _output/bin
conversion-gen
deepcopy-gen
defaulter-gen
go-bindata
go2make
kube-apiserver
openapi-gen
二、Go 命令编译
1.cd $GOPATH/src/k8s.io/kubernetes && make generated_files
2.进入对应组件目录编译(以 kube-apiserver组件编译为例)1
cd cmd/kube-apiserver && go build -v
源码编译可能遇到的问题
编译可能报类似下面错误:1
2
3
4
5
6
7
8go/build: importGo k8s.io/kubernetes: exit status 1
can't load package: package k8s.io/kubernetes: cannot find module providing package k8s.io/kubernetes
+++ [0301 18:04:57] Building go targets for darwin/amd64:
./vendor/k8s.io/code-generator/cmd/deepcopy-gen
can't load package: package k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/deepcopy-gen: cannot find module providing package k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/deepcopy-gen
!!! [0301 18:05:04] Call tree:
!!! [0301 18:05:04] 1:
解决办法:golang 版本换成 go1.12.xx 即可。
具体 issue 见这里:https://github.com/kubernetes/kubernetes/issues/84224
参考资料
https://www.kubernetes.org.cn/5033.html
https://blog.csdn.net/boling_cavalry/article/details/88591982
https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/master/virtualization/windowscontainers/kubernetes/compiling-kubernetes-binaries.md