如何順利完成Kubernetes原始碼編譯?
為什麼要編譯原始碼 ?
Kubernetes是一個非常棒的容器叢集管理平臺。通常情況下,我們並不需要修改K8S程式碼即可直接使用。但如果,我們在環境中發現了某個問題/缺陷,或按照特定業務需求需要修改K8S程式碼時,如定製Kubelet的StopContainer 邏輯、kube-scheduler的pod排程邏輯等。為了讓修改生效,那麼就需要編譯K8S程式碼了。
Kubernetes原始碼編譯,大致分為本地二進位制可執行檔案編譯和docker映象編譯兩種。由於在我們的環境中,Kubernetes是由Docker容器方式執行的。故此我們需要採用後面一種方式編譯,即映象編譯。
由於Kubernetes每個元件服務的映象Dockerfile檔案是由Kubernetes原始碼自動生成的,因此,社群並未提供每個元件的映象Dockerfile檔案。編譯本地二進位制可執行檔案很簡單,也更直接。而docker映象編譯資料卻很少,且礙於某種特殊網路原因,會導致失敗。此處,將介紹如何順利的完成K8S映象編譯。
安裝依賴
安裝Golang
指定分支,下載 Kubernetes 原始碼(預設$GOPATH目錄為/root/go/)
本地二進位制檔案編譯Kubernetes(方法一)
修改執行平臺配置引數(可選)
根據自己的執行平臺(linux/amd64)修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS,KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64以外的其他平臺註釋掉,以此來減少編譯所用時間。
編譯原始碼
進入Kubernetes根目錄下
KUBE_BUILD_PLATFORMS指定目標平臺,WHAT指定編譯的元件,透過GOFLAGS和GOGCFLAGS傳入編譯時引數,如此處編譯kubelet 元件。
-
如果不指定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
生成的可執行檔案在當前資料夾下面
Docker映象編譯Kubernetes(方法二)
檢視kube-cross的TAG版本號
檢視debian_iptables_version版本號
這裡,我使用DockerHub的Auto build功能,來構建K8s映象。自然將編譯需要用到的base映象,放在了DockerHub上(也算是為促進國內K8s原始碼docker編譯貢獻綿薄之力吧!)。
把build/lib/release.sh中的–pull去掉,避免構建映象繼續拉取映象:
編輯檔案hack/lib/version.sh
將KUBE_GIT_TREE_STATE=”dirty” 改為 KUBE_GIT_TREE_STATE=”clean”,確保版本號乾淨。
執行編譯命令
其中KUBE_BUILD_PLATFORMS=linux/amd64指定目標平臺為linux/amd64,GOFLAGS=-v開啟verbose日誌,GOGCFLAGS=”-N -l”禁止編譯最佳化和內聯,減小可執行程式大小。
編譯的K8s Docker映象以壓縮包的形式釋出在_output/release-tars目錄中
使用編譯映象
等待編譯完成後,在_output/release-stage/server/linux-amd64/kubernetes/server/bin/目錄下儲存了編譯生成的二進位制可執行程式和docker映象tar包。如匯入kube-apiserver.tar映象,並更新環境上部署的kube-apiserver映象。
整個編譯過程結束後,現在就可以到master節點上,修改/etc/kubernetes/manifests/kube-apiserver.yaml描述檔案中的image,修改完立即生效。
參考資料:
原文連結:
%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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908804/viewspace-2641499/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kubernetes原始碼編譯原始碼編譯
- Kubernetes原始碼學習之一:下載和編譯原始碼原始碼編譯
- 線上直播原始碼想要順利完成直播軟體開發需要哪些條件原始碼
- Spring原始碼編譯Spring原始碼編譯
- 如何對 Neuron 原始碼進行交叉編譯原始碼編譯
- 原始碼編譯Vim 8原始碼編譯
- MongoDB(0)- 原始碼編譯MongoDB原始碼編譯
- XCode 編譯 PAG 原始碼XCode編譯原始碼
- Docker編譯Azerothcore原始碼Docker編譯原始碼
- 如何學習 PHP 原始碼 – 從編譯開始PHP原始碼編譯
- MacOS X 編譯Android原始碼Mac編譯Android原始碼
- 原始碼編譯 apache2.4原始碼編譯Apache
- WebRTC研究 (一) 編譯原始碼Web編譯原始碼
- 原始碼編譯安裝Redis原始碼編譯Redis
- nvme driver 原始碼修改、編譯原始碼編譯
- Android FrameWork 之原始碼編譯AndroidFramework原始碼編譯
- 龍芯原始碼編譯MySQL原始碼編譯MySql
- Swift原始碼專案編譯Swift原始碼編譯
- Dubbo原始碼之動態編譯原始碼編譯
- android 反編譯APK取原始碼。Android編譯APK原始碼
- 原始碼編譯安裝的原理原始碼編譯
- 【轉】MySQL原始碼編譯安裝MySql原始碼編譯
- openssl原始碼編譯及配置方法原始碼編譯
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- 一文了解如何原始碼編譯Rainbond基礎元件原始碼編譯AI元件
- 寫Java這麼久,JDK原始碼編譯過沒?編譯JDK原始碼踩坑紀實JavaJDK原始碼編譯
- Ubuntu 15.04編譯Android 6.0.1原始碼-Nexus5真機編譯Ubuntu編譯Android原始碼
- 如何用web3j編譯solidity智慧合約原始碼Web編譯Solid原始碼
- MySQL5.7.16原始碼編譯安裝MySql原始碼編譯
- 【Visual Leak Detector】原始碼編譯 VLD 庫原始碼編譯
- RocketMQ--原始碼編譯和介紹MQ原始碼編譯
- 阿里雲mysql原始碼編譯安裝阿里MySql原始碼編譯
- 編譯python(cpython)的原始碼及其用途編譯Python原始碼
- nginx原始碼編譯安裝(詳解)Nginx原始碼編譯
- Flink1.9.2原始碼編譯和使用原始碼編譯
- grpc-java原始碼環境編譯RPCJava原始碼編譯
- 編譯除錯Net6原始碼編譯除錯原始碼
- Android 11 原始碼下載+編譯教程Android原始碼編譯