从源码编译k8s镜像
环境信息
- 操作系统:CentOS Linux release 7.3.1611
- go版本:1.18.9
- Docker:23.0.3
- 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/ 目录