kubernetes原始碼編譯
阿新 • • 發佈:2022-05-16
本地構建
選擇要構建的版本
git checkout tags/v1.19.5
將依賴包複製到對應路徑下
cp staging/src/k8s.io vendor/
調整makefile
在windows上編譯的克隆下可能檔案編碼變了,需要手動修改下檔案編碼。比如說出現 \r not found
類似關鍵詞時
這裡轉換編碼使用了 dos2unix,需要提前安裝下
apt install dos2unix
轉換原因是因為對於bash 指令碼執行識別不了windows的換行
find . -name '*.sh' -exec dos2unix {} \;
然後將 build/root/
的檔案複製到專案根目錄
cp build/root/Makefile* ./
編譯
檢視幫助 make help
編譯 make all WHAT=cmd/kube-apiserver GOFLAGS=-v
WHAT=cmd/kube-apiserver
為僅編譯單一元件,all
為所有的元件
還可以增加其他的一些環境變數 KUBE_BUILD_PLATFORMS=
如編譯的平臺
更多的可以 make help
檢視幫助
編譯中問題
Makefile:93: recipe for target 'all' failed
!!! [0515 21:32:52] Call tree: !!! [0515 21:32:52] 1: /mnt/d/src/go_work/src/kubernetes/hack/lib/golang.sh:717 kube::golang::build_some_binaries(...) !!! [0515 21:32:52] 2: /mnt/d/src/go_work/src/kubernetes/hack/lib/golang.sh:861 kube::golang::build_binaries_for_platform(...) !!! [0515 21:32:52] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0515 21:32:52] Call tree: !!! [0515 21:32:52] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0515 21:32:52] Call tree: !!! [0515 21:32:52] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) Makefile:93: recipe for target 'all' failed
這裡看報錯根本不知道發生什麼問題,使用 strace
追送了下,很明顯看到是沒有gcc
cgo: exec gcc: exec: "gcc": executable file not found in $PATH
rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU XFSZ], NULL, 8) = 0 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbf45410a10) = 17890 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 wait4(-1, +++ [0515 21:34:40] Building go targets for linux/amd64: cmd/kubelet k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/system k8s.io/kubernetes/vendor/github.com/mindprince/gonvml # k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/system cgo: exec gcc: exec: "gcc": executable file not found in $PATH # k8s.io/kubernetes/vendor/github.com/mindprince/gonvml cgo: exec gcc: exec: "gcc": executable file not found in $PATH !!! [0515 21:34:42] Call tree: !!! [0515 21:34:42] 1: /mnt/d/src/go_work/src/kubernetes/hack/lib/golang.sh:717 kube::golang::build_some_binaries(...) !!! [0515 21:34:42] 2: /mnt/d/src/go_work/src/kubernetes/hack/lib/golang.sh:861 kube::golang::build_binaries_for_platform(...) !!! [0515 21:34:42] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0515 21:34:42] Call tree: !!! [0515 21:34:42] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0515 21:34:42] Call tree: !!! [0515 21:34:42] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 17890 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=17890, si_uid=0, si_status=1, si_utime=0, si_stime=0} --- rt_sigreturn({mask=[]}) = 17890 openat(AT_FDCWD, "/usr/share/locale/C.UTF-8/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/usr/share/locale/C.utf8/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/usr/share/locale/C/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/usr/share/locale-langpack/C.UTF-8/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/usr/share/locale-langpack/C.utf8/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/usr/share/locale-langpack/C/LC_MESSAGES/make.mo", O_RDONLY) = -1 ENOENT (No such file or directory) fstat(1, {st_mode=S_IFCHR|0640, st_rdev=makedev(4, 1), ...}) = 0 ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(1, "Makefile:93: recipe for target '"..., 44Makefile:93: recipe for target 'all' failed ) = 44 write(2, "make: *** [all] Error 1\n", 24make: *** [all] Error 1 ) = 24 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU XFSZ], NULL, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 chdir("/mnt/d/src/go_work/src/kubernetes") = 0 close(1) = 0 exit_group(2) = ? +++ exited with 2 +++
修改後編譯問題可以明顯看出是哪裡
如嘗試增加一種資源型別後編譯,這種型別的錯誤可以根據報錯提示進行修改
+++ [0515 21:47:59] Building go targets for linux/amd64:
cmd/kube-apiserver
k8s.io/kubernetes/vendor/k8s.io/api/apps/v1
# k8s.io/kubernetes/vendor/k8s.io/api/apps/v1
vendor/k8s.io/api/apps/v1/register.go:48:3: cannot use &StateDeploy{} (type *StateDeploy) as type runtime.Object in argument to scheme.Ad
dKnownTypes:
*StateDeploy does not implement runtime.Object (missing DeepCopyObject method)
!!! [0515 21:48:01] Call tree:
!!! [0515 21:48:01] 1: /mnt/d/src/go_work/src/kubernetes/hack/lib/golang.sh:706 k