首页
从源码编译k8s镜像

环境信息

  1. 操作系统:CentOS Linux release 7.3.1611
  2. go版本:1.18.9
  3. Docker:23.0.3
  4. Kubernetes:1.24.1

依赖镜像下载

编译过程中,主要会用到k8s.gcr.io/kube-cross镜像,但是该镜像国内无法下载。我们可以先下载好镜像备用。

# 下载对应版本的cross镜像
docker pull k8s.dockerproxy.com/build-image/kube-cross:v1.24.0-go1.18.8-bullseye.0

# 重命名为编译时需要的名字
docker tag k8s.dockerproxy.com/build-image/kube-cross:v1.24.0-go1.18.8-bullseye.0 k8s.gcr.io/build-image/kube-cross:v1.24.0-go1.18.8-bullseye.0

注意: 具体的镜像版本可以查看build/build-image/cross/VERSION文件中的定义。

修改源码

根据需求修改代码。

开始构建

进入目录$GOPATH/src/k8s.io/kubernetes,执行以下命令开始构建镜像:

KUBE_GIT_TREE_STATE=clean KUBE_BASE_IMAGE_REGISTRY=k8s.dockerproxy.com/build-image KUBE_BUILD_PULL_LATEST_IMAGES=n KUBE_BUILD_PLATFORMS=linux/amd64 KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_HYPERKUBE=n make release-images GOFLAGS=-v GOGCFLAGS="-N -l"

具体环境变量含义,可以参看build/lib/release.sh文件,主要就是这个文件控制编译过程。根据build/root/Makefile中的描述来修改编译参数。

  • KUBE_BUILD_CONFORMANCE参数用来控制是否创建一致性测试镜像,KUBE_BUILD_HYPERKUBE控制是否创建hyperkube镜像(各种工具集成在一起),这两个目前都用不上,因此是设置为"n"表示不构建;
  • 在目录下可见构建的tar文件,可以通过docker load命令加载到本地镜像仓库使用:
  • 编译的 kubernetes 组件 docker 镜像以 tar 包的形式发布在 kubernetes/_output/release-tars/amd64 目录中
  • 生成的核心组件二进制可执行文件以及镜像,在 kubernetes/_output/release-stage/server/linux-amd64/kubernetes/server/bin/ 目录