修改 Kubeadm 源码中的 Kubernetes 证书过期时间为100年

修改 Kubeadm 源码中的 Kubernetes 证书过期时间为100年

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


相关地址:

系统环境:

  • 操作系统: CentOS 7.9
  • Golang 版本: 1.15.15
  • Docker 版本: 20.10.8
  • Kubeadm 版本: 1.20.9
  • Kubernetes 版本: 1.20.9

一、为什么要修改 kubeadm 证书时间

Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。

不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有一年,需要在证书过期前,使用更新操作更新集群,使证书的有效期再续一年。如果忘记这个操作,那么在使用过程中证书到期将导致集群不可用,应用无法访问,急急忙忙解决也需要半天时间,这个问题是致命的。

不过实际情况下,在现网环境中大部分人追求稳定,一般不会大改 Kubernetes 版本,所以解决 kubeadm 集群证书有效期只有一年的最好办法就是重新编译 kubeadm 源码,将里面的 1 年有效期修改为 10 年或者 100 年,也不会影响使用 kubeadm 后续的升级,所以修改源码能很好的规避这个证书过期风险。

二、如何查看 kubernetes 证书过期时间

在执行修改 Kubeadm 源码且重新编译之前,我们先通观察下使用的官方的 Kubeadm 工具初始化的 Kubernetes 集群,观察在默认情况下证书过期时间,执行的命令如下:

1$ kubeadm alpha certs check-expiration

然后可以看到输出的过期时间如下:

 1
 2CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
 3admin.conf                 Aug 14, 2022 03:15 UTC   364d                                     no
 4apiserver                  Aug 14, 2022 03:15 UTC   364d             ca                      no
 5apiserver-etcd-client      Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
 6apiserver-kubelet-client   Aug 14, 2022 03:15 UTC   364d             ca                      no
 7controller-manager.conf    Aug 14, 2022 03:15 UTC   364d                                     no
 8etcd-healthcheck-client    Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
 9etcd-peer                  Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
10etcd-server                Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
11front-proxy-client         Aug 14, 2022 03:15 UTC   364d             front-proxy-ca          no
12scheduler.conf             Aug 14, 2022 03:15 UTC   364d                                     no
13
14CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
15ca                      Aug 14, 2031 03:15 UTC   9y             no
16etcd-ca                 Aug 14, 2031 03:15 UTC   9y             no
17front-proxy-ca          Aug 14, 2031 03:15 UTC   9y             no

从上面可以了解到,默认情况下 ETCD 证书有效期是 10 年时间,其它证书有效期为 1 年时间,所以如果我们安装集群时没有修改证书过期时间,那么默认 1 年后可能会出现证书过期集群不可用的问题,所以接下来我们进入修改 kubeadm 源码过程。

三、修改 kubeadm 源码并重新编译

3.1 安装 Golang 等编译源码的环境包

由于 Kubeadm 是 Go 语言编写的,所以我们提前安装好编译 Kubeadm 源码的工具,操作过程按下面执行即可:

(1) 安装编译工具

1$ yum install -y gcc make rsync jq

(2) 下载并配置 Golang 环境

 1## 下载 golang 1.15.15
 2$ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz
 3
 4## 解压并放置在一个目录中
 5$ tar zxvf go1.15.15.linux-amd64.tar.gz  -C /usr/local
 6
 7## 编辑 /etc/profile 文件,添加 Go 环境配置内容
 8$ vi /etc/profile
 9
10export GOROOT=/usr/local/go
11export GOPATH=/usr/local/gopath
12export PATH=$PATH:$GOROOT/bin
13
14## 使配置生效
15$ source /etc/profile
16
17## 测试 Go 命令是否配置成功,成功则显示如下
18$ go version
19
20go version go1.15.15 linux/amd64

3.2 下载 kubernetes 源码

下载 Kubernetes 源码,然后切换到指定版本,操作的命令如下:

1## 下的 kubernetes 源码
2$ git clone https://github.com/kubernetes/kubernetes.git
3
4## 进入 Kubernetes 目录
5$ cd kubernetes
6
7## 切换 Kubernetes 版本
8$ git checkout v1.20.9

3.3 修改 kubeadm 源码中证书过期时间

接下来我们修改 Kubernetes 代码中与 kubeadm 证书有效期相关的源码,操作的命令如下:

(1) 修改 constants.go 文件,操作如下:

 1$ vim cmd/kubeadm/app/constants/constants.go
 2
 3
 4########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
 5#const duration365d = time.Hour * 24 * 365
 6const duration365d = time.Hour * 24 * 365 * 100
 7
 8// Config contains the basic fields required for creating a certificate
 9type Config struct {
10        CommonName   string
11        Organization []string
12        AltNames     AltNames
13        Usages       []x509.ExtKeyUsage
14}

(2) 修改 cert.go 文件,操作如下:

 1$ vim staging/src/k8s.io/client-go/util/cert/cert.go
 2
 3
 4########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
 5#NotAfter:             now.Add(duration365d * 10).UTC(),
 6NotAfter:              now.Add(duration365d * 100).UTC(),
 7KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
 8BasicConstraintsValid: true,
 9IsCA:                  true,
10......

3.4 执行 kubeadm 编译

使用 make 命令编译 kubeadm, 执行的命令如下:

1$ make all WHAT=cmd/kubeadm GOFLAGS=-v

编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。

 1## 进入
 2$ cd ./_output/local/bin/linux/amd64/
 3
 4## 查看文件列表
 5$ ls -l
 6
 7-rwxr-xr-x 10:03 conversion-gen
 8-rwxr-xr-x 10:03 deepcopy-gen
 9-rwxr-xr-x 10:03 defaulter-gen
10-rwxr-xr-x 10:03 go2make
11-rwxr-xr-x 10:04 go-bindata
12-rwxr-xr-x 10:04 kubeadm
13-rwxr-xr-x 10:47 kubectl
14-rwxr-xr-x 10:34 kubelet
15-rwxr-xr-x 10:04 openapi-gen
16-rwxr-xr-x 10:03 prerelease-lifecycle-gen

四、使用编译后的 kubeadm 初始化 kubernetes 集群

4.1 安装 kubeadm 工具

在使用我们自己编译的 kubeadm 之前,有一个需要注意的点,那就是我们一定要先提前安装好官方 kubeadm,并且版本和我们编译的 kubeadm 版本要一致,否则使用 kubeadm 初始化集群会报错,这里安装 kubeadm 执行的命令如下:

(1) 配置可用的 Kubernetes 国内 yum

 1$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
 2
 3[kubernetes]
 4name=Kubernetes
 5baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
 6enabled=1
 7gpgcheck=0
 8repo_gpgcheck=0
 9gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
10
11EOF

(2) 使用 yum 命令安装 kubeadm1.20.9 版本

1$ yum install -y kubeadm-1.20.9

4.2 替换安装的 kubeadm 工具

接下来我们使用自定义编译的 kubeadm 工具,将已经安装的 kubeadm 给替换掉,执行的操作命令如下:

1## 备份已有的 kubeadm 工具
2$ mv /usr/bin/kubeadm  /usr/bin/kubeadm_backup
3
4## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
5$ cp ./_output/local/bin/linux/amd64/kubeadm  /usr/bin/kubeadm
6
7## 修改文件的执行权限
8$ chmod +x /usr/bin/kubeadm

4.3 执行集群初始化

当将我们自己编译的 kubeadm 替换原来的 kubeadm 工具后,我们就可以使用 kubeadm init 命令初始化 Kubernetes 集群进行测试,命令如下:

  • --service-cidr: 集群内部虚拟网络,Pod统一访问入口。
  • --pod-network-cidr: Pod网络,与部署CNI网络组件yaml文件中需保持一致。
  • --image-repository: 设置下载 Kubernetes 相关镜像的镜像仓库地址。
  • --kubernetes-version: 指定 Kubernetes 版本,需要和安装的版本保持一致。
  • --apiserver-advertise-address: 配置 kube-apiserver 的服务器地址。
1$ kubeadm init \
2--image-repository registry.aliyuncs.com/google_containers  \
3--apiserver-advertise-address=192.168.2.31  \
4--service-cidr=10.96.0.0/12   \
5--pod-network-cidr=10.96.0.0/12  \
6--kubernetes-version=1.20.9

4.4 查看证书过期时间

等待集群初始化一段时间,然后我们执行 kubeadm 查看证书过期时间命令查看新装的 Kubernetes 集群过期时间,操作如下:

1$ kubeadm alpha certs check-expiration

命令执行后,输出的结果如下:

 1CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
 2admin.conf                 Aug 14, 2121 05:15 UTC   99y                                     no
 3apiserver                  Aug 14, 2121 05:15 UTC   99y             ca                      no
 4apiserver-etcd-client      Aug 14, 2121 05:15 UTC   99y             etcd-ca                 no
 5apiserver-kubelet-client   Aug 14, 2121 05:15 UTC   99y             ca                      no
 6controller-manager.conf    Aug 14, 2121 05:15 UTC   99y                                     no
 7etcd-healthcheck-client    Aug 14, 2121 05:15 UTC   99y             etcd-ca                 no
 8etcd-peer                  Aug 14, 2121 05:15 UTC   99y             etcd-ca                 no
 9etcd-server                Aug 14, 2121 05:15 UTC   99y             etcd-ca                 no
10front-proxy-client         Aug 14, 2121 05:15 UTC   99y             front-proxy-ca          no
11scheduler.conf             Aug 14, 2121 05:15 UTC   99y                                     no
12
13CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
14ca                      Aug 14, 2121 05:15 UTC   99y             no
15etcd-ca                 Aug 14, 2121 05:15 UTC   99y             no
16front-proxy-ca          Aug 14, 2121 05:15 UTC   99y             no

可以看到证书过期时间已经变更,有效期为 100 年。

本人已经将修改后的 kubeadm-1.20.9 工具放到本人的 Github,可以访问本人 Github 进行下载。

注意: 如果使用编译后的 kubeadm 执行 upgrade 命令,更新原有的证书有效期为 1 年的 Kubernetes 集群,证书更新也是有效果的,不过 kubeadm 更新操作并不会更新 ETCD 证书,所以 ETCD 证书有效期还是默认的 10 年,需要手动更新

---END---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。