如何順利完成Kubernetes源碼編譯?

爲何要編譯源碼 ?html

Kubernetes是一個很是棒的容器集羣管理平臺。一般狀況下,咱們並不須要修改K8S代碼便可直接使用。但若是,咱們在環境中發現了某個問題/缺陷,或按照特定業務需求須要修改K8S代碼時,如定製Kubelet的StopContainer 邏輯、kube-scheduler的pod調度邏輯等。爲了讓修改生效,那麼就須要編譯K8S代碼了。linux

Kubernetes源碼編譯,大體分爲本地二進制可執行文件編譯和docker鏡像編譯兩種。因爲在咱們的環境中,Kubernetes是由Docker容器方式運行的。故此咱們須要採用後面一種方式編譯,即鏡像編譯。git

因爲Kubernetes每一個組件服務的鏡像Dockerfile文件是由Kubernetes源碼自動生成的,所以,社區並未提供每一個組件的鏡像Dockerfile文件。編譯本地二進制可執行文件很簡單,也更直接。而docker鏡像編譯資料卻不多,且礙於某種特殊網絡緣由,會致使失敗。此處,將介紹如何順利的完成K8S鏡像編譯。github

安裝依賴 golang

安裝Golangdocker

0416_1.jpg

指定分支,下載 Kubernetes 源代碼(默認$GOPATH目錄爲/root/go/)api

0416_2.jpg

 

本地二進制文件編譯Kubernetes(方法一) 網絡

修改運行平臺配置參數(可選)優化

根據本身的運行平臺(linux/amd64)修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS,KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64之外的其餘平臺註釋掉,以此來減小編譯所用時間。ui

編譯源碼

進入Kubernetes根目錄下

0416_3.jpg

KUBE_BUILD_PLATFORMS指定目標平臺,WHAT指定編譯的組件,經過GOFLAGS和GOGCFLAGS傳入編譯時參數,如此處編譯kubelet 組件。

0416_4.jpg

  • 若是不指定WHAT,則編譯所有。

  • make all是在本地環境中進行編譯的。

  • make release和make quick-release在容器中完成編譯、打包成docker鏡像。

  • 編譯kubelet這部分代碼,也可執行make clean && make WHAT=cmd/kubelet

檢查編譯成果

編譯過程較長,請耐心等待,編譯後的文件在kubernetes/_output裏。

或者進入cmd/kubelet (以kubelet爲例子)

執行go build -v命令,若是沒出錯,會生成可執行文件kubelet

0416_5.jpg

生成的可執行文件在當前文件夾下面

0416_6.jpg

 

Docker鏡像編譯Kubernetes(方法二)

查看kube-cross的TAG版本號

0416_7.jpg

查看debian_iptables_version版本號

0416_8.jpg

這裏,我使用DockerHub的Auto build功能,來構建K8s鏡像。天然將編譯須要用到的base鏡像,放在了DockerHub上(也算是爲促進國內K8s源碼docker編譯貢獻綿薄之力吧!)。

0416_9.jpg

把build/lib/release.sh中的–pull去掉,避免構建鏡像繼續拉取鏡像:

0416_10.jpg

編輯文件hack/lib/version.sh

將KUBE_GIT_TREE_STATE=」dirty」 改成 KUBE_GIT_TREE_STATE=」clean」,確保版本號乾淨。

執行編譯命令

0416_11.jpg

其中KUBE_BUILD_PLATFORMS=linux/amd64指定目標平臺爲linux/amd64,GOFLAGS=-v開啓verbose日誌,GOGCFLAGS=」-N -l」禁止編譯優化和內聯,減少可執行程序大小。

編譯的K8s Docker鏡像以壓縮包的形式發佈在_output/release-tars目錄中

0416_12.jpg

使用編譯鏡像

等待編譯完成後,在_output/release-stage/server/linux-amd64/kubernetes/server/bin/目錄下保存了編譯生成的二進制可執行程序和docker鏡像tar包。如導入kube-apiserver.tar鏡像,並更新環境上部署的kube-apiserver鏡像。

0416_13.jpg

整個編譯過程結束後,如今就能夠到master節點上,修改/etc/kubernetes/manifests/kube-apiserver.yaml描述文件中的image,修改完當即生效。

參考資料:

https://github.com/kubernetes/kubernetes/tree/master/build/

原文連接:

https://xuchao918.github.io/2019/01/26/%E7%BC%96%E8%AF%91%E5%92%8C%E8%BF%90%E8%A1%8CKubernetes%E6%BA%90%E7%A0%81/

相關服務請訪問:https://support.huaweicloud.com/cce/index.html?utm_content=cce_helpcenter_2019

相關文章
相關標籤/搜索