从Kubernetes源代码构建Kind集群
我在 排查X86移动云Kind创建失败 需要解决当前kind release版本镜像尚未加入支持 ZFS ,但是 GitHub: kind 的最新git仓库代码已经修复。
警告
我最初以为本文方式是能够解决 排查X86移动云Kind创建失败 ,也就是将 kind "base" image 中增加上 zfs
工具。但是实践下来发现,这个过程是自己编译 Kubernetes 版本,基础镜像不变。也就是说,本文方法可以用来定制kind,指定 Kubernetes 版本(根据clone出来Kubernetes可以切换tag版本),但是不解决基础镜像中添加``zfs``
工具(没有从kind源代码编译基础镜像)
不过,本文实践还是有意义的,了解了kind如何编译Kubernetes,后续可以用这个方法来自己测试不同版本Kubernetes
备注
编译Kubernetes node镜像需要上游Kubernetes编译的所有工具,kind社区已经包装了上游build工具,也包括了Docker with buildx
Kubernetes编译的所有工具可以参考 Building Kubernetes with Docker
备注
编译Kubernetes需要8GB内存和50GB磁盘空间,我通过 ZFS快速起步 步骤将整个 /home
目录迁移到ZFS存储中来准备好足够的编译空间
备注
我在2023年1月19日构建,此时Kubernetes刚刚发布了 v1.26.1
通过以下方式安装
buildx
插件(必须,否则build报错,见下文异常排查部分):
mkdir -p ~/.docker/cli-plugins
cd ~/.docker/cli-plugins
wget -O docker-buildx https://github.com/docker/buildx/releases/download/v0.10.0/buildx-v0.10.0.linux-amd64
chmod 755 docker-buildx
下载Kubernetes源代码
$(go env GOPATH)/src/k8s.io/kubernetes
,然后构建镜像:
mkdir -p $(go env GOPATH)/src/k8s.io
cd $(go env GOPATH)/src/k8s.io
git clone https://github.com/kubernetes/kubernetes
# 使用当前发布版本 v1.26.1 ,这是一个 Tag(不可修改)
git checkout v1.26.1
# 执行编译
kind build node-image
kind build node-image
异常排查
buildx插件问题
报错,显示 docker
不能识别参数 --load
To retry manually, run:
DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build --load -t kube-build:build-718ad5336b-5-v1.25.0-go1.19.5-bullseye.0 --pull=false --build-arg=KUBE_CROSS_IMAGE=registry.k8s.io/build-image/kube-cross --build-arg=KUBE_CROSS_VERSION=v1.25.0-go1.19.5-bullseye.0 /home/huatai/go/src/k8s.io/kubernetes/_output/images/kube-build:build-718ad5336b-5-v1.25.0-go1.19.5-bullseye.0
!!! [0119 19:51:00] Call tree:
!!! [0119 19:51:00] 1: build/release-images.sh:39 kube::build::build_image(...)
make: *** [Makefile:450: quick-release-images] Error 1
Failed to build Kubernetes: failed to build images: command "make quick-release-images 'KUBE_EXTRA_WHAT=cmd/kubeadm cmd/kubectl cmd/kubelet' KUBE_VERBOSE=0 KUBE_BUILD_HYPERKUBE=n KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_PLATFORMS=linux/amd64" failed with error: exit status 2
ERROR: error building node image: failed to build kubernetes: failed to build images: command "make quick-release-images 'KUBE_EXTRA_WHAT=cmd/kubeadm cmd/kubectl cmd/kubelet' KUBE_VERBOSE=0 KUBE_BUILD_HYPERKUBE=n KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_PLATFORMS=linux/amd64" failed with error: exit status 2
Command Output: +++ [0119 19:51:00] Verifying Prerequisites....
+++ [0119 19:51:00] Building Docker image kube-build:build-718ad5336b-5-v1.25.0-go1.19.5-bullseye.0
+++ Docker build command failed for kube-build:build-718ad5336b-5-v1.25.0-go1.19.5-bullseye.0
unknown flag: --load
See 'docker --help'.
参考 Fails to build 1.21.0 node image - docker buildx now required #2188 和 `` :
buildx isn't actually part of moby, but Docker Inc. ships it as part of their Docker packages in their PPA. It's a separate tool with a separate code repo.
通过以下方式安装 buildx
插件:
mkdir -p ~/.docker/cli-plugins
cd ~/.docker/cli-plugins
wget -O docker-buildx https://github.com/docker/buildx/releases/download/v0.10.0/buildx-v0.10.0.linux-amd64
chmod 755 docker-buildx
现在能够识别 --load
,开始build
备注
build过程需要下载的网址很多已经被GFW屏蔽,我采用 配置Docker使用代理 但是没有解决docker服务器https代理需要证书的问题,所以改为采用 ocserv VPN 解决下载问题