K8S源码构建
K8S是使用golang进行编写的,所以在运行的时候需要将golang代码转换成二进制,K8S代码的构建方式有三种,本地构建、容器环境构建和Bazel环境构建。
本地构建
和C++项目类似的,大型项目不可能使用命令行逐个进行go build
,所以可以使用makefile的方法构建项目。
在k8s所有项目中,存在两个MakeFile文件:
Makefile:描述项目的编译顺序、编译规则和输出。
Makefile.generated_files: 描述代码生成逻辑。
Makefile文件解析
1 |
|
这是执行make all
的第一步,判断了是否为帮助输出,非帮助输出时,执行generated_files,用于代码生成,然后调用hack/make-rules/build.sh
进行构建,参数$(WHAT)
为欲构建的组件列表。
追溯到hack/make-rules/build.sh
文件,其中调用的第一段函数是kube::golang::build_binaries "$@"
,该段函数进行二进制构建,传入值即为上边说过的$(WHAT)
。
调用链:
kube::golang::build_binaries -> kube::golang::host_platform(获取平台类型) -> kube::golang::get_physmem(判断内存是否达到标准) -> kube::golang::build_binaries_for_platform(构建指定平台的二进制) -> kube::golang::build_some_binaries(构建二进制) -> go install
容器构建
以下为make release
的构建代码:
1 |
|
以下为make quick-release
的构建代码:
1 |
|
可以看出,两种构建方式使用的家谱本是同一个,但是quick-release
多了两个变量KUBE_RELEASE_RUN_TESTS
和KUBE_FASTBUILD
。
追溯到build/release.sh
:
1 | kube::build::verify_prereqs #检查构建环境 |
构建时会使用三个容器:
build: 进行构建工作的容器
data: 数据存储容器
sync:同步容器