![Kubernetes源码剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/962/32435962/b_32435962.jpg)
2.3 容器环境构建
通过容器(Docker)进行Kubernetes构建也非常简单,Kubernetes提供了两种容器环境下的构建方式:make release和make quick-release,它们之间的区别如下。
● make release:构建所有的目标平台(Darwin、Linux、Windows),构建过程会比较久,并同时执行单元测试过程。
● make quick-release:快速构建,只构建当前平台,并略过单元测试过程。
make quick-release在Makefile中的定义如下:
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_31_4.jpg?sign=1738867451-GeMlV4L9bH5m9O51Qk2f4n7AK4WJ2oGk-0-5528023cc0df2433f69221c85b6b2f89)
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_32_1.jpg?sign=1738867451-onw8H0NquNyuTBAqTqko8ujlRnc5487A-0-305a23b2fba4688db10721a204b12863)
make quick-release与make release相比多了两个变量,即KUBE_RELEASE_RUN_TESTS和KUBE_FASTBUILD。KUBE_RELEASE_RUN_TESTS变量,将其设为n则跳过运行单元测试;KUBE_FASTBUILD变量,将其设为true则跳过跨平台交叉编译。通过这两个变量可以实现快速构建,最终执行build/release.sh脚本,运行容器环境构建。Kubernetes容器环境构建过程如图2-2所示。
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_32_2.jpg?sign=1738867451-VFemW8Jcaev2eeGos5qyOjiGaPl3UHsq-0-dc23f1712149a0679f9e93305039d156)
图2-2 Kubernetes容器环境构建过程
在容器环境构建过程中,有多个容器镜像参与其中,分别介绍如下。
● build容器(kube-cross):即构建容器,在该容器中会对代码文件执行构建操作,完成后其会被删除。
● data容器:即存储容器,用于存放构建过程中所需的所有文件。
● rsync容器:即同步容器,用于在容器和主机之间传输数据,完成后其会被删除。
下面介绍一下Kubernetes容器环境构建过程。
1.kube::build::verify_prereqs
进行构建环境的配置及验证。该过程会检查本机是否安装了Docker容器环境,而对于Darwin平台,该过程会检查本机是否安装了docker-machine环境。
2.kube::build::build_image
根据Dockerfile文件构建容器镜像。Dockerfile文件来源于build/build-image/Dockerfile,代码示例如下:
代码路径:build/common.sh
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_33_1.jpg?sign=1738867451-unLpQCbXLJkZVYLtcFixK0fHmAD3m92T-0-22a1d92029a50507c5e6331d71fcad90)
构建容器镜像的流程如下。
● 通过mkdir命令创建构建镜像的文件夹(即_output/images/…)。
● 通过cp命令复制构建镜像所需的相关文件,如Dockerfile文件和rsyncd同步脚本等。
● 通过kube::build::docker_build函数,构建容器镜像。
● 通过kube::build::ensure_data_container函数,运行存储容器并挂载Volume。
● 通过kube::build::sync_to_container函数,运行同步容器并挂载存储容器的Volume,然后通过rsync命令同步Kubernetes源码到存储容器的Volume。
3.kube::build::run_build_command make cross
此时,容器构建环境已经准备好,下面开始运行构建容器并在构建容器内部执行构建Kubernetes源码的操作,代码示例如下:
代码路径:build/common.sh
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_34_1.jpg?sign=1738867451-sKCIIs8a51kR3ZUJUfwYcUEqKOYQe4hl-0-7d8d92a88477993ee875661f42c08013)
在kube::build::run_build_command_ex函数中,通过${docker_cmd[@]}""${cmd[@]}命令执行构建操作(即在容器内执行make cross命令)。容器内的构建过程与本地环境下的构建过程相同,故不再赘述。
其中,构建的平台由KUBE_SUPPORTED_SERVER_PLATFORMS变量控制,代码示例如下:
代码路径:hack/lib/golang.sh
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_34_2.jpg?sign=1738867451-ob3hTAmhT2gAz5uhadWMPawdI5cUtuEi-0-b5b34734c0edb65a7cd81f34f0aefa53)
构建的组件由KUBE_SERVER_TARGETS变量控制,代码示例如下:
代码路径:hack/lib/golang.sh
![](https://epubservercos.yuewen.com/FF83E6/17517091906682706/epubprivate/OEBPS/Images/38914_35_1.jpg?sign=1738867451-dogj4mxpfGjoKNf0nYwvHhJvmHnmhw3t-0-0c3f064983cba38113507cde112aab35)
4.kube::build::copy_output
使用同步容器,将编译后的代码文件复制到主机上。
5.kube::release::package_tarballs
进行打包,将二进制文件打包到_output目录中。
最终,代码文件以tar.gz压缩包的形式输出至_output/release-tars文件夹。