日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes构建过程分析

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/kubectl

Makefile是一個非常自動化構建工具,可以用來構建和測試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容器環境構建流程:
構建環境的配置及驗證:kube::build::verify_prereqs 構建容器鏡像:kube::build::build_image 構建代碼:kube::build::run_build_command make cross 將文件從容器復制到主機:kube::build::copy_output 打包:kube::release::package_tarballs

在容器環境構建過程中,有多個容器鏡像參與其中,分別介紹如下:

  • 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

function kube::build::build_image() {mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"...cp "${KUBE_ROOT}/build/build-image/Dockerfile" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"cp "${KUBE_ROOT}/build/build-image/rsyncd.sh" "${LOCAL_OUTPUT_BUILD_CONTEXT}/"dd if=/dev/urandom bs=512 count=1 2>/dev/null | LC_ALL=C tr -dc 'A-Za-z0-9' | dd bs=32 count=1 2>/dev/null > "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"chmod go= "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"kube::build::update_dockerfilekube::build::set_proxykube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false'...kube::build::ensure_data_containerkube::build::sync_to_container }

構建容器鏡像的流程如下:

  • 通過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

function kube::build::run_build_command_ex() {...local detach=false..."${docker_cmd[@]}" "${cmd[@]}"if [[ "${detach}" == false ]]; thenkube::build::destroy_container "${container_name}"fi }

在執行kube::build::run_build_command_ex函數中,通過dockercmd[@]""{docker_cmd[@]}""dockerc?md[@]""{cmd[@]}
命令執行構建操作(即在容器內執行make cross 命令)。容器內的構建過程與本地環境下的構建過程相同。其中構建平臺有KUBE_SUPPORTED_SERVER_PLATFORMS變量控制,代碼示例如下:
代碼路徑:hack/lib/golang.sh

readonly KUBE_SUPPORTED_SERVER_PLATFORMS=(linux/amd64linux/armlinux/arm64linux/s390xlinux/ppc64le )

構建的組件由KUBE_SERVER_TARGETS變量控制,代碼示例如下:
代碼路徑:hack/lib/golang.sh

kube::golang::server_targets() {local targets=(cmd/kube-proxycmd/kube-apiservercmd/kube-controller-managercmd/kubeletcmd/kubeadmcmd/kube-schedulervendor/k8s.io/kube-aggregatorvendor/k8s.io/apiextensions-apiservercluster/gce/gci/mounter)echo "${targets[@]}" }IFS=" " read -ra KUBE_SERVER_TARGETS <<< "$(kube::golang::server_targets)"

4.kube::build::copy_output

使用同步容器,將編譯后的代碼文件復制到主機上。

5.kube::release::package_tarballs

進行打包,將二進制文件打包到_output目錄中。
最終,代碼文件以tar.gz壓縮包的形式輸出至_output/release-tars文件夾。

總結

以上是生活随笔為你收集整理的Kubernetes构建过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。