kubeadm 默认证书为一年,一年过期后,会导致 api service 不可用,使用过程中会出现:x509: certificate has expired or is not yet valid.

可以在初始化群集之前重新编译 kubeadm,证书有效期自动为 100 年;也可如下重新编译修改证书

目录

一、获取源码

二、修改证书有效期

三、编译kubeadm

1 软件包准备

2 GoLang 环境

3 安装 Go 环境:

4 验证:

5 编译:

6 查看编译后的版本信息:

7 保存备用:

四、执行命令更新证书 

1 检查证书到期时间:

2 续订全部证书:

3 再次查看证书有效期,全部都 100 年了:


一、获取源码

访问:Releases · kubernetes/kubernetes · GitHub,下载特定版本源码

1
2
3
4
#wget https://github.com/kubernetes/kubernetes/archive/v1.25.0.tar.gz
#tar -zxvf kubernetes-1.25.0.tar.gz
#mv kubernetes-1.25.0 kubernetes
#cd kubernetes

或者使用 git 获取

1
2
3
4
5
# yum install git
# sudo apt install git
#git clone https://github.com/kubernetes/kubernetes.git
#cd kubernetes
#git checkout -b remotes/origin/release-1.25 v1.25.0

二、修改证书有效期

主要修改两个地方

vim ./staging/src/k8s.io/client-go/util/cert/cert.go在这个文件里找到

NotAfter:              now.Add(duration365d * 10).UTC()

输入 /NotAfter 查找,回车定位,默认是10年,修改为100年

vim ./cmd/kubeadm/app/constants/constants.go在这个文件里找到

CertificateValidity = time.Hour * 24 * 365 

输入 /CertificateValidity 查找,回车定位,后面加上*100,改为100年

验证一下已经正确修改:

1
2
#cat ./staging/src/k8s.io/client-go/util/cert/cert.go | grep NotAfter
#cat ./cmd/kubeadm/app/constants/constants.go | grep CertificateValidity

三、编译kubeadm

1 软件包准备

CentOS:

1
2
#yum groupinstall "Development Tools" -y 
#yum install rsync jq -y

Ubuntu:

1
2
#sudo apt install build-essential #(Following command will install essential #commands like gcc, make etc.)
#sudo apt install rsync jq -y
2 GoLang 环境

查看 kube-cross 的 TAG 版本号

1
2
3

# cat ./build/build-image/cross/VERSION
v1.23.0-go1.17.5-bullseye.0
#注意:之前的版本显示这种数字格式 v1.17.5

3 安装 Go 环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://dl.google.com/go/go1.17.5.linux-amd64.tar.gz
## 或者
# wget https://golang.google.cn/dl/go1.17.5.linux-amd64.tar.gz
tar zxvf go1.17.5.linux-amd64.tar.gz  -C /usr/local

# 编辑 / etc/profile 文件添加如下:
##go setting (sysin)
#export GOROOT=/usr/local/go
#export GOPATH=/usr/local/gopath
#export PATH=$PATH:$GOROOT/bin
#生效
#source /etc/profile

# 这里一次性编译,直接执行如下命令即可
export PATH=$PATH:/usr/local/go/bin
4 验证:
1
2
3
go version
# 输出如下
go version go1.17.5 linux/amd64
5 编译:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编译 kubeadm, 这里主要编译 kubeadm 即可
make all WHAT=cmd/kubeadm GOFLAGS=-v

# 编译 kubelet
# make all WHAT=cmd/kubelet GOFLAGS=-v

# 编译 kubectl
# make all WHAT=cmd/kubectl GOFLAGS=-v

#编译完产物在 _output/bin/kubeadm 目录下,
#其中 bin 是使用了软连接 (sysin)
#真实路径是_output/local/bin/linux/amd64/kubeadm
mv /usr/bin/kubeadm /usr/bin/kubeadm_backup
cp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
chmod +x /usr/bin/kubeadm
6 查看编译后的版本信息:
1
2
3
kubeadm version
# 输出如下
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"archive", BuildDate:"2024-01-04T01:22:09Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
7 保存备用:
1
2
3
4
5
6
# 压缩保存到用户主目录下
tar zcvf ~/kubeadm-1.23.1.tgz -C /usr/bin/kubeadm

# 在其他节点上替换原有版本
mv /usr/bin/kubeadm /usr/bin/kubeadm_bak
tar zxvf ./kubeadm-1.23.1.tgz -C /usr/bin/

四、执行命令更新证书 

如果是使用原版 kubeadm 安装之后,可以手动执行命令更新证书有效期到 100 年。

可以先备份证书,证书在 /etc/kubernetes/pki

1 检查证书到期时间:
1
2
3
kubeadm certs check-expiration
# 早期版本 (1.19 及之前版本) 命令如下
#kubeadm alpha certs check-expiration

kubeadm alpha 命令 1.21 开始彻底废弃。

2 续订全部证书:
1
kubeadm certs renew all
3 再次查看证书有效期,全部都 100 年了:
1
kubeadm certs check-expiration
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐