kubernetes修改源碼手動編譯鏡像


對於 kubectl 還有 kubelet 這種比較簡單,go build 之后直接把生成的二進制文件替換掉原來 /usr/bin 下面的就可以了,
但是有一些組件是需要啟動一個 pod 來執行的,比如 apiserver,這就需要我們把修改后的源碼編譯成鏡像,在編譯的時候也是遇到了許多的坑,記錄一下整個編譯過程。

OS:centos7.6

kubernetes version:1.20.0

就拿 apiserver 組件來舉例子

默認你已經有一個可用的k8s集群並且clone下來了k8s的源代碼。

方法一

1.首先按照你自己的需要修改源代碼

這個根據需要自己改就可以

2.執行鏡像編譯命令

KUBE_BUILD_PLATFORMS=linux/amd64 make quick-release
# KUBE_BUILD_PLATFORMS=linux/amd64 只編譯生成針對linux的鏡像,但是這個參數好像沒必要,因為quick-release就有這樣的效果
# quick-release 只生成linux64 位系統的鏡像,不走test,主要是為了節省編譯時間
# WHAT=cmd/kube-apiserver 只編譯apiserver組件

直接在 kubernetes 代碼目錄下面執行就行,但是一般來說執行的時候肯定會報錯,因為需要依賴的三個基礎鏡像是需要FQ的,我這邊公司內部有對應的鏡像資源,所以就直接修改了一下
/data/gopath/src/k8s.io/kubernetes/build/common.sh
這個腳本,更換了一下鏡像倉庫的地址。

(line 46) readonly KUBE_BASE_IMAGE_REGISTRY="${KUBE_BASE_IMAGE_REGISTRY:-k8s.gcr.io/build-image}"

把這個命令里面的 k8s.gcr.io/build-image 換成你能獲取鏡像的倉庫地址就行了。另外還可以去 dockerhub 上面找找有沒有能用得上的,拉下來到本地,看看報錯提示的是缺少哪個鏡像,需要找到相對應的版本才行。

大概需要的就是下面這三個鏡像,但是版本有可能有出入

k8s.gcr.io/build-image/go-runner         buster-v2.2.2                  
k8s.gcr.io/build-image/kube-cross        v1.15.5-1
k8s.gcr.io/build-image/debian-iptables   buster-v1.3.0

總之,可以修改腳本里面的鏡像倉庫地址,保證 docker pull 可以成功,或者從別的地方 pull 下來對應的鏡像,然后修改 tag。

做完這些之后,在執行KUBE_BUILD_PLATFORMS=linux/amd64 make quick-release應該就不會報錯了,如果還有錯,需要你自己看看錯誤信息然后去解決一下了。

編譯對硬件要求還是比較高的,我看推薦 需要 8G 內存,然后找了台 8G 的服務器,倒是沒什么問題,就是編譯的時間有點長。

然后可以在 kubernetes/_output/release-images/amd64/ 下面找到編譯成功的鏡像壓縮包了。

3.部署新的鏡像

把你需要的鏡像壓縮包copy到集群的master上面,如果集群使用的是 docker 搭建的,應該直接使用 docker load 命令就可以把 tar 文件家在城 image 了,我這邊是用的是 containerd 搭建的集群,需要使用

sudo ctr -n=k8s.io images import xxxxx.tar

去導入鏡像,使用

crictl images list

查看鏡像是不是導入成功,如果成功了,接着修改

/etc/kubernetes/manifests/kube-apiserver.yaml

文件,把里面的 image 字段修改成你剛剛導入的鏡像名字,等一會,k8s 集群會自動重啟。
大概等個幾十秒就 應該重啟完畢了,使用
kubectl get pod -A 看看是不是所有 pod 都正常了,有可能會出現以下問題

Q1:Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
把 $HOME/.kube 這個刪除了再試試
Q2:The connection to the server localhost:8080 was refused - did you specify the right host or port?
執行 export KUBECONFIG=/etc/kubernetes/admin.conf 命令試試

一般來說整個系統應該就可以使用新的鏡像來正常工作了。

方法二

上面那種方法缺點是對應的鏡像確實比較難找,我當初也是在網上找了半天,沒找到我需要的版本,后來從同事口中得知公司內部鏡像庫都有的,然后就是編譯環節,對機器配置要求高,編譯時間長,每次都需要把四個組件全部編譯一遍,具體能不能只編譯單個組件我還沒試過。

那么可以使用下面這種方法,就是自己寫一個 dockerfile,還是用 apiserver 來舉例:

apiserver 需要依賴一個 debian 的基礎鏡像,也就是我在上面列出的
k8s.gcr.io/build-image/debian-iptables:buster-v1.3.0 這個鏡像,這就可以隨便換了,隨便找一個 debian 的基礎鏡像就可以,我試過其他的 linux 發行版基礎鏡像也是可以的,把 debain 換成 centos 照樣可以編譯成功並且能正常工作。

1.首先把 apiserver 的代碼 build 一下,生成二進制文件

2.寫一個 dockerfile:
(第一行根據你的實際情況換一下基礎依賴鏡像)

FROM k8s.gcr.io/build-image/debian-iptables:buster-v1.3.0
ADD apiserver /usr/local/bin/kube-apiserver
WORKDIR /usr/local/bin/

3.然后執行
docker build . -t xxxxxxx (隨便取個名字,版本號最好和其他的組件保持一致,比如寫成 xxxxxxx:v1.20.0)

4.修改
/etc/kubernetes/manifests/kube-apiserver.yaml 文件,把里面的 image 字段修改成你剛剛導入的鏡像名字,等待集群重啟


免責聲明!

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



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