重新编译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来安装一个K8S集群,在Master节点上的/etc/kubernetes/pki目录下,我们查看apiserver.crt证书的有效期,如下,为一百年:

$ openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
notBefore=Mar  1 08:49:42 2022 GMT
notAfter=Feb  5 08:49:42 2122 GMT

参考

你可能感兴趣的:(重新编译kubeadm以解决证书一年过期的问题)