如何順利完成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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM