目录

Kubeadm系列-10-compile

概述

本文主要讲解编译 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,本地环境没有就装他。

1
yum install -y 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日,文中内容可能已过时,请谨慎参考。