天天看點

Kubernetes源碼編譯Golang編譯鏡像編譯

目前有2種方向, 一種是直接使用golang來編譯出二進制包, 另外一種是通過容器來編譯.

前提當然是本地需要下載下傳k8s源碼

Golang編譯

直接編譯也可以分成2種,一種是一次編譯出來, 一種是每個子產品單獨編譯

全編譯

這種方法比較簡單, 進入源碼目錄直接執行

make

指令即可, 不過對應的k8s版本, 對go語言版本有一些要求, 具體可看k8s網站或者直接編譯會提示需要哪個版本go語言.

編譯會顯示如下資訊

[root@SZD-L0113231 kubernetes-release-1.9]# make
+++ [0830 08:50:54] Building the toolchain targets:
    k8s.io/kubernetes/hack/cmd/teststale
    k8s.io/kubernetes/vendor/github.com/jteeuwen/go-bindata/go-bindata
+++ [0830 08:50:54] Generating bindata:
    test/e2e/generated/gobindata_util.go
/home/czs/code/kubernetes-release-1.9 /home/czs/code/kubernetes-release-1.9/test/e2e/generated
/home/czs/code/kubernetes-release-1.9/test/e2e/generated
+++ [0830 08:50:55] Building go targets for linux/amd64:
    ./vendor/k8s.io/code-generator/cmd/deepcopy-gen
+++ [0830 08:51:02] Building the toolchain targets:
    k8s.io/kubernetes/hack/cmd/teststale
    k8s.io/kubernetes/vendor/github.com/jteeuwen/go-bindata/go-bindata
+++ [0830 08:51:02] Generating bindata:
    test/e2e/generated/gobindata_util.go
/home/czs/code/kubernetes-release-1.9 /home/czs/code/kubernetes-release-1.9/test/e2e/generated
/home/czs/code/kubernetes-release-1.9/test/e2e/generated
+++ [0830 08:51:03] Building go targets for linux/amd64:
    ./vendor/k8s.io/code-generator/cmd/defaulter-gen
+++ [0830 08:51:08] Building the toolchain targets:
    k8s.io/kubernetes/hack/cmd/teststale
    k8s.io/kubernetes/vendor/github.com/jteeuwen/go-bindata/go-bindata
+++ [0830 08:51:08] Generating bindata:
    test/e2e/generated/gobindata_util.go
/home/czs/code/kubernetes-release-1.9 /home/czs/code/kubernetes-release-1.9/test/e2e/generated
/home/czs/code/kubernetes-release-1.9/test/e2e/generated
+++ [0830 08:51:09] Building go targets for linux/amd64:
    ./vendor/k8s.io/code-generator/cmd/conversion-gen
+++ [0830 08:51:14] Building the toolchain targets:
    k8s.io/kubernetes/hack/cmd/teststale
    k8s.io/kubernetes/vendor/github.com/jteeuwen/go-bindata/go-bindata
+++ [0830 08:51:14] Generating bindata:
    test/e2e/generated/gobindata_util.go
/home/czs/code/kubernetes-release-1.9 /home/czs/code/kubernetes-release-1.9/test/e2e/generated
/home/czs/code/kubernetes-release-1.9/test/e2e/generated
+++ [0830 08:51:15] Building go targets for linux/amd64:
    ./vendor/k8s.io/code-generator/cmd/openapi-gen
+++ [0830 08:51:21] Building the toolchain targets:
    k8s.io/kubernetes/hack/cmd/teststale
    k8s.io/kubernetes/vendor/github.com/jteeuwen/go-bindata/go-bindata
+++ [0830 08:51:21] Generating bindata:
    test/e2e/generated/gobindata_util.go
/home/czs/code/kubernetes-release-1.9 /home/czs/code/kubernetes-release-1.9/test/e2e/generated
/home/czs/code/kubernetes-release-1.9/test/e2e/generated
+++ [0830 08:51:21] Building go targets for linux/amd64:
    cmd/kube-proxy
    cmd/kube-apiserver
    cmd/kube-controller-manager
    cmd/cloud-controller-manager
    cmd/kubelet
    cmd/kubeadm
    cmd/hyperkube
    vendor/k8s.io/kube-aggregator
    vendor/k8s.io/apiextensions-apiserver
    plugin/cmd/kube-scheduler
    cluster/gce/gci/mounter
    cmd/kubectl
    cmd/gendocs
    cmd/genkubedocs
    cmd/genman
    cmd/genyaml
    cmd/genswaggertypedocs
    cmd/linkcheck
    vendor/github.com/onsi/ginkgo/ginkgo
    test/e2e/e2e.test
    cmd/kubemark
    vendor/github.com/onsi/ginkgo/ginkgo
    test/e2e_node/e2e_node.test
    cmd/gke-certificates-controller
           

最後在

_output

裡面生成二進制檔案

編譯指定子產品

可以指定相關參數

make WHAT=cmd/kubelet           

單獨編譯

把k8s源碼放到如下路徑

/root/go/src/k8s.io/

, 并且把源碼檔案夾名稱改成

kubernetes/

然後進入

/cmd/kubelet

(隻是以kubelet為例子)

執行

go build -v

指令,如果沒出錯,可以生成可執行檔案

生成的可執行檔案在目前檔案夾下面

[root@SZD-L0113231 kubectl]# ls -l
total 66592
drwxr-x--- 2 root root       37 Aug 29 13:09 app
-rw-r----- 1 root root     1233 Aug 29 13:09 BUILD
-rwxr-x--- 1 root root 68177868 Aug 30 17:28 kubectl
-rw-r----- 1 root root      772 Aug 29 13:09 kubectl.go
-rw-r----- 1 root root       54 Aug 29 13:09 OWNERS           

鏡像編譯

可以通過編譯鏡像來編譯, 不過編譯鏡像一般是被牆的,需要自己在dockerhub或其鏡像網站先下載下傳好,

需要注意的是, 每個對應的k8s, 對應的編譯鏡像有特别的版本要求, 這個可以在源代碼中間的

build-image/cross/VERSION

裡面可以看到對應的版本

docker pull googlecontainer/kube-cross:v1.9.3-1
docker pull googlecontainer/debian-iptables-amd64:v5           

然後把tag改為k8s的tag,

docker tag docker.io/googlecontainer/kube-cross:v1.9.3-1 gcr.io/google_containers/kube-cross:v1.9.3-1

docker tag docker.io/googlecontainer/debian-iptables-amd64:v5 gcr.io/googlecontainer/debian-iptables-amd64:v5           
不要直接執行很多網上說的指令 ./build/release.sh , 實測會編譯很多處理器(如arm,ppc之類的)的版本,直接把我60G的磁盤寫滿(寫了27G),然後出錯退出了。

./build/run.sh make

, 隻編譯linux/amd64

最後會列印如下資訊

+++ [0830 16:30:14] Building go targets for linux/amd64:
    cmd/kube-proxy
    cmd/kube-apiserver
    cmd/kube-controller-manager
    cmd/cloud-controller-manager
    cmd/kubelet
    cmd/kubeadm
    cmd/hyperkube
    vendor/k8s.io/kube-aggregator
    vendor/k8s.io/apiextensions-apiserver
    plugin/cmd/kube-scheduler
    cluster/gce/gci/mounter
    cmd/kubectl
    cmd/gendocs
    cmd/genkubedocs
    cmd/genman
    cmd/genyaml
    cmd/genswaggertypedocs
    cmd/linkcheck
    vendor/github.com/onsi/ginkgo/ginkgo
    test/e2e/e2e.test
    cmd/kubemark
    vendor/github.com/onsi/ginkgo/ginkgo
    test/e2e_node/e2e_node.test
    cmd/gke-certificates-controller
Env for linux/amd64: GOOS=linux GOARCH=amd64 GOROOT=/usr/local/go CGO_ENABLED= CC=
+++ [0830 16:36:23] Placing binaries
+++ [0830 16:37:27] Syncing out of container
+++ [0830 16:37:27] Stopping any currently running rsyncd container
+++ [0830 16:37:27] Starting rsyncd container
+++ [0830 16:37:28] Running rsync
+++ [0830 16:38:47] Stopping any currently running rsyncd container           

并且把生成的二進制放到

_output/dockerized/

下面

繼續閱讀