重新编译kubeadm以解决证书一年过期的问题

本文介绍如何重新构建kubeadm(k8s-v1.23.3)二进制文件,以解决证书只有一年有效期的问题。
环境准备
本文准备了一台虚拟机,配置如下:

  • 硬件配置:2C4G150G
  • 系统内核:CentOS-7.6 + Kernel-4.19.12
  • 用户:root
安装docker及buildx插件、rsync
1、安装docker及buildx插件
根据K8S官方文档的指引,主机需要安装Docker及Docker插件buildx。
根据buildx的文档介绍,buildx插件要求Docker的版本在19.03+。同时,在Linux环境中,如果使用DEB或RPM包安装Docker的话,已经自带了buildx插件。
所以,本文我们使用yum来安装docker,安装的docker版本为20.10,版本信息如下:
$ docker -v Docker version 20.10.12, build e91ed57

可以使用如下的命令验证buildx插件已经安装成功:
$ docker buildx version github.com/docker/buildx v0.7.1-docker 05846896d149da05f3d6fd1e7770da187b52a247

2、安装rsync
另外,还需要安装rsync,构建脚本用它来同步容器里面的构建好的kubeadm二进制文件到主机上:
$ yum -y install rsync

下载源码及修改
本文我们将要构建的版本为kubernetes-v1.23.3,所以我们下载这个版本的k8s源码包,github的下载地址为https://github.com/kubernetes...。
下载完成后,得到一个tar包v1.23.3.tar.gz。我们把它放在主机的/root目录下,然后进行解压:
$ tar xzvf v1.23.3.tar.gz

解压得到一个文件夹kubernetes-1.23.3,我们把它重命名为kubernetes,并进入到源码根目录下
$ mv kubernetes-1.23.3 kubernetes $ cd kubernetes/

修改文件cmd/kubeadm/app/constants/constants.go,找到如下一段,把time.Hour * 24 * 365改成time.Hour * 24 * 365 * 100,那么证书就是百年有效期:
const ( ...// CertificateValidity defines the validity for all the signed certificates generated by kubeadm CertificateValidity = time.Hour * 24 * 365 * 100

构建kubeadm
指引文档的 Key Scripts 章节 对脚本的使用做了介绍

我们可以使用上面红色框内的命令来构建kubeadm,执行以下命令构建kubeadm:
$ build/run.sh make kubeadm KUBE_BUILD_PLATFORMS=linux/amd64

注意:上面的脚本在执行过程中会去下载一个k8s.gcr.io/build-image/kube-cross镜像,镜像版本号为文件build/build-image/cross/VERSION的内容,我们可以先提前下载好这个镜像再执行上面的命令:
$ docker pull k8s.gcr.io/build-image/kube-cross:v1.23.0-go1.17.6-bullseye.0
这个镜像在国内可能下载不下来,我已经把它上传到阿里云,可以先从阿里云下载,然后再重命名:
$ docker pull registry.cn-beijing.aliyuncs.com/pshizh/kube-cross:v1.23.0-go1.17.6-bullseye.0
$ docker tag registry.cn-beijing.aliyuncs.com/pshizh/kube-cross:v1.23.0-go1.17.6-bullseye.0 k8s.gcr.io/build-image/kube-cross:v1.23.0-go1.17.6-bullseye.0
build/run.sh命令执行成功后,在/root/kubernetes目录下会有一个_output文件夹,kubeadm二进制文件就在_output/dockerized/bin/linux/amd64/目录下,执行命令查看它的版本及构建日期:
$ _output/dockerized/bin/linux/amd64/kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"archive", BuildDate:"2022-03-01T08:10:46Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}

验证
【重新编译kubeadm以解决证书一年过期的问题】我们使用上面的kubeadm来安装一个K8S集群,在Master节点上的/etc/kubernetes/pki目录下,我们查看apiserver.crt证书的有效期,如下,为一百年:
$ openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt notBefore=Mar1 08:49:42 2022 GMT notAfter=Feb5 08:49:42 2122 GMT

参考
  • https://github.com/kubernetes...
  • https://github.com/docker/bui...

    推荐阅读