Kubernetes构建过程分析
構建方式
Kubernetes的構建方式可以分為3種,分別是本地環境構建、容器環境構建、Bazel環境構建。
Kubernetes構建方式:
- 本地環境構建
- make
- make all
- 容器環境構建
- make release
- make quick-release
- Bazel環境構建
- make bazel-build
下面將詳細介紹前兩種構建方式:
本地環境構建
執行make或者make all命令,會編譯Kubernetes的所有組件,組件二進制文件輸出的相對路徑是_output/bin。如果我們需要對Makefile的執行過程進行調試,可以在make命令后面加-n參數,輸出但不執行所有執行命令,這樣可以展示更詳細的編譯構建過程。假設我們想單獨構建某個組價,如kubectl組件,則需要指定WHAT參數。命令示例如下:
make WHAT=cmd/kubectlMakefile是一個非常自動化構建工具,可以用來構建和測試Go語言的應用程序,Makefile還適用于大多數編程語言,在Kubernetes的源碼根目錄中,有兩個與Makefile相關的文件,功能分別如下:
- Makefile:頂層Makefile文件,描述了整個項目所有代碼文件的編譯順序、編譯規則及編譯后的二進制文件輸出等。
- Makefile.generated_file:描述了代碼生成的邏輯。
本地構建過程
通過調用hack/make-rules/build.sh腳本開始構建組件,傳入要構建的組件名稱,不指定組件名稱則構建所有組件。hack/make-rules/build.sh代碼示例如下:
kube::golang::build_binaries "$@"build_binaries接收構建的組件名稱,設置構建所需要的環境及一些編譯時所需的Go flags選項,然后通過go install構建組件:
go install "${build_args[@]}" "$@"在go install命令執行完成后,二進制輸出的目錄為_output/bin。
最后,可以使用make clean命令來清理構建環境。
容器環境構建
通過容器(Docker)進行Kubernetes構建也非常簡單,Kubernetes提供了兩種容器環境下得構建方式:make release 和make quick-release,它們之間的區別如下:
- make release:構建所有目標平臺(Darwin、Linux、Windows),構建過程會比較久,并同時執行單元測試過程。
- make quick-release:快速構建,只構建當前平臺,并略過單元測試過程。
Kubernetes容器環境構建流程:
在容器環境構建過程中,有多個容器鏡像參與其中,分別介紹如下:
- build 容器(kube-cross):即構建容器,在該容器中會對代碼文件執行構建操作,完成后會被刪除。
- data容器:即存儲容器,用于存放構建過程中所需要的的所有文件。
- raync容器:即同步容器:用于在容器和主機之間傳輸數據,完成后會被刪除。
下面介紹一下Kubernetes容器環境構建過程。
1.kube::build::verfy_prereqs
進行構建環境的配置及驗證。該過程會檢查本機是否安裝了Docker容器環境,對于Darwin平臺,該過程會檢查本機是否安裝了docker-machine環境。
2.kube::build::build_image
根據Dockerfile文件構建容器鏡像。Dockerfile文件來源于build/build-image/Dockerfile,代碼示例如下:
代碼路徑:build/common.sh
構建容器鏡像的流程如下:
- 通過mkdir命令創建構建鏡像的文件夾(即_output/images/…)。
- 通過cp命令復制構建鏡像所需的相關文件,如Dockerfile文件和rsyncd同步腳本等。
- 通過kube::build::docker_build函數,構建容器鏡像。
- 通過kube::build::ensure_data_container函數,運行存儲容器并掛載Volume。
- 通過kube::build::sync_to_container函數,運行同步容器并掛載存儲容器的Volume,然后通過rsnyc命令同步Kubernetes源碼到存儲容器的Volume。
3.kube::build::run_build_command make cross
此時,容器構建環境已經準備好,下面開始運行構建容器并在構建容器內部執行構建Kubernetes源碼的操作,代碼示例如下:
代碼路徑:build/common.sh
在執行kube::build::run_build_command_ex函數中,通過dockercmd[@]""{docker_cmd[@]}""dockerc?md[@]""{cmd[@]}
命令執行構建操作(即在容器內執行make cross 命令)。容器內的構建過程與本地環境下的構建過程相同。其中構建平臺有KUBE_SUPPORTED_SERVER_PLATFORMS變量控制,代碼示例如下:
代碼路徑:hack/lib/golang.sh
構建的組件由KUBE_SERVER_TARGETS變量控制,代碼示例如下:
代碼路徑:hack/lib/golang.sh
4.kube::build::copy_output
使用同步容器,將編譯后的代碼文件復制到主機上。
5.kube::release::package_tarballs
進行打包,將二進制文件打包到_output目錄中。
最終,代碼文件以tar.gz壓縮包的形式輸出至_output/release-tars文件夾。
總結
以上是生活随笔為你收集整理的Kubernetes构建过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes各组件的功能
- 下一篇: 深入了解Kubernetes CRD开发