ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 本文介绍如何重新构建kubeadm(k8s-v1.23.3)二进制文件,以解决证书只有一年有效期的问题。 ### **环境准备** 本文准备了一台虚拟机,配置如下: * 硬件配置:2C4G150G * 系统内核:CentOS-7.6 + Kernel-4.19.12 * 用户:root * 注意:无须安装go,因为使用镜像构建 ### **安装docker及buildx插件、rsync** 1、安装docker及buildx插件 根据[K8S官方文档的指引](https://github.com/kubernetes/kubernetes/blob/v1.23.3/build/README.md#requirements),主机需要安装Docker及Docker插件buildx。 根据[buildx的文档](https://github.com/docker/buildx/blob/master/README.md#installing)介绍,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/kubernetes/archive/refs/tags/v1.23.3.tar.gz。 下载完成后,得到一个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/ ``` 编辑`staging/src/k8s.io/client-go/util/cert/cert.go`,修改如下一行,把CA证书的有效期从10年改成100年 ``` // NewSelfSignedCACert creates a CA certificate func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) { now := time.Now() tmpl := x509.Certificate{ SerialNumber: new(big.Int).SetInt64(0), Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: cfg.Organization, }, DNSNames: []string{cfg.CommonName}, NotBefore: now.UTC(), NotAfter: now.Add(duration365d * 100).UTC(), // 修改这一行 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, IsCA: true, } certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) } ``` 修改文件`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 章节](https://github.com/kubernetes/kubernetes/blob/v1.23.3/build/README.md#key-scripts) 对脚本的使用做了介绍 ![](https://img.kancloud.cn/3e/2c/3e2c3c7ba680465a594248ae333c0a2b_1121x498.png) 我们可以使用上面红色框内的命令来构建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 ``` ### **参考** * https://github.com/kubernetes/kubernetes/blob/v1.23.3/build/README.md * https://github.com/docker/buildx/blob/master/README.md