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

爲什麼要編譯源碼 ?

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

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

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

安裝依賴 

安裝Golang

0416_1.jpg

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

0416_2.jpg

 

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

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

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

編譯源碼

進入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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章