概述
本文主要讲解编译 kubeadm 的过程,虽然 Kubernetes 1.24 已经正式弃用了 Dockershim,但是 Kubernetes 里关于构建的过程还是有很多 Docker 的产物。
build
首先查看一下官方仓库 build 的相关内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
kubernetes-1.21.7/build
├── OWNERS
├── README.md
├── build-image
│ ├── Dockerfile
│ ├── OWNERS
│ ├── VERSION
│ ├── cross
│ │ └── VERSION
│ └── rsyncd.sh
├── common.sh
├── copy-output.sh
├── dependencies.yaml
├── lib
│ └── release.sh
├── make-build-image.sh
├── make-clean.sh
├── nsswitch.conf
├── package-tarballs.sh
├── pause
│ ├── CHANGELOG.md
│ ├── Dockerfile
│ ├── Dockerfile_windows
│ ├── Makefile
│ ├── OWNERS
│ ├── cloudbuild.yaml
│ ├── linux
│ │ ├── orphan.c
│ │ └── pause.c
│ └── windows
│ ├── pause.c
│ └── wincat
│ └── wincat.go
├── release-images.sh
├── release-in-a-container.sh
├── release.sh
├── root
│ ├── Makefile
│ └── Makefile.generated_files
├── run.sh
├── server-image
│ ├── Dockerfile
│ └── kube-apiserver
│ └── Dockerfile
├── shell.sh
├── tools.go
└── util.sh
|
环境的话,大部分情况下都是在 Linux 下运行的 Kubernetes 所以这里也建议用 Linux 环境来编译,这里需要明确的是,我们在实际上产环境中,并不需要编译全平台的版本,也就是关于 Cross 的,我们可以避免,正常来说,我们一般是运行在 amd64 x86_64 这样的主机上的,所以只针对这类型的系统来编译就好,最后就是 Kubernetes 官方编译可以直接本地编译也可以用 docker 编译,后者的优势就是可以避免很多依赖的问题,但是需要比较熟悉 docker,个人推荐是用 docker 来编译的,网上也很多资料是关于本地编译的,老铁们可以自行参考。
1
|
build/run.sh make kubeadm KUBE_BUILD_PLATFORMS=linux/amd64
|
仔细阅读一些 README,k8s 各个组件主要还是依赖 docker 来编译的,所以本地环境必须得有。
准备工作
1
2
3
4
5
6
7
8
9
10
|
ssh root@139.162.59.116
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y wget unzip docker-ce rsync
systemctl start docker
wget https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.21.7.zip
unzip v1.21.7
cd kubernetes-1.21.7
|
下面会列举一些问题。
Can’t find ‘docker’
本地环境没有安装 docker。
1
2
3
4
|
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
|
Can’t connect to ‘docker’ daemon.
安装完 docker 之后没有启动,或者启动失败。
1
2
|
systemctl start docker
systemctl status docker
|
Get “https://k8s.gcr.io/v2/": dial tcp 74.125.203.82:443: connect: connection timed out
国内主机一般都无法访问 k8s.gcr.io,解决的方法要么通过代理,要么在国外的主机上进行编译,又或者用另外一些镜像源。
Can’t find ‘rsync’ in PATH
其实仔细阅读过 README 的,应该知道编译过程中会用到 rsync,本地环境没有就装他。
make: *** [Makefile:536: kubeadm] Error 1
如果报任何 error 的话,仔细看下报错,会告诉你具体是在 Makefile 里哪一行,那么就查看具体的文件就好。
编译成功
正常的话,应该是能看到下面这样的日志的。
1
2
3
4
5
|
Go version: go version go1.16.10 linux/amd64
+++ [0704 05:37:38] Building go targets for linux/amd64:
cmd/kubeadm
Env for linux/amd64: GOOS=linux GOARCH=amd64 GOROOT=/usr/local/go CGO_ENABLED= CC=
Coverage is disabled.
|
查看一下 _output
下面的文件,这些文件就是编译之后的输出文件了,可以在里面找到 kubeadm。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# tree
.
├── dockerized
│ ├── bin
│ │ ├── go-bindata
│ │ └── linux
│ │ └── amd64
│ │ ├── conversion-gen
│ │ ├── deepcopy-gen
│ │ ├── defaulter-gen
│ │ ├── go2make
│ │ ├── go-bindata
│ │ ├── kubeadm
│ │ ├── openapi-gen
│ │ └── prerelease-lifecycle-gen
│ └── go
└── images
├── kube-build:build-54e0f13ccd-5-v1.21.0-go1.16.10-buster.0
│ ├── Dockerfile
│ ├── localtime
│ ├── rsyncd.password
│ └── rsyncd.sh
└── kube-build:build-d1d15f6b4d-5-v1.21.0-go1.16.10-buster.0
├── Dockerfile
├── localtime
├── rsyncd.password
└── rsyncd.sh
|
查看一下 kubeadm 的版本。
1
2
|
# dockerized/bin/linux/amd64/kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.7", GitCommit:"1f86634ff08f37e54e8bfcd86bc90b61c98f84d4", GitTreeState:"archive", BuildDate:"2022-07-04T05:37:38Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}
|
编译镜像
最后看一下构建这样的编译环境,需要什么镜像。
1
2
3
4
5
6
7
|
# 主要截取了size
REPOSITORY TAG SIZE
kube-build build-54e0f13ccd-5-v1.21.0-go1.16.10-buster.0 4.36GB
k8s.gcr.io/build-image/kube-cross v1.21.0-go1.16.10-buster.0 3.26GB
# 保存一下镜像
docker save kube-build:build-54e0f13ccd-5-v1.21.0-go1.16.10-buster.0 k8s.gcr.io/build-image/kube-cross:v1.21.0-go1.16.10-buster.0 | gzip > kube-build-1-21-7.tar.gz
|
其他
总体来说,默认配置下编译还是挺快的,主要是 Docker 镜像里把需要的依赖都准备好了,其实很少需要再去拉取外部的依赖了,时间变成了主要在下载镜像上,另外就是编译的时候可以发现应该是单核操作的,如果想加快编译速度,可以考虑配置一些多核的配置,k8s 的编译流程和脚本比较复杂,如果不是遇到具体问题的话,个人觉得没必要太深入去研究。
警告
本文最后更新于 2022年3月20日,文中内容可能已过时,请谨慎参考。