之前我们做过k8s证书续期的笔记,但是1.19以上版本就有些不一样了,所以重新记录一篇,感兴趣的可以查看我之前的笔记:https://sulao.cn/post/846.html
k8s大体上续订证书基本还是一致的,也是下载k8s对应版本源码,然后编译kubeadm,使用新的kubeadm进行证书续期
此方式使用范围是1.17-1.23版本。
我们首先下载golang,编译的时候需要使用到
wget https://golang.google.cn/dl/go1.21.5.linux-amd64.tar.gz tar -zxvf go1.21.5.linux-amd64.tar.gz -C /usr/local/
添加环境变量使其生效
echo "export PATH=$PATH:/usr/local/go/bin" >>/etc/profile source /etc/profile
验证golang环境变量和版本
go version go version go1.21.5 linux/amd64
接着我们查看k8s版本和到期时间
kubectl get node -o wide kubeadm certs check-expiration #注意1.19之前的版本是kubeadm alpha certs check-expiration,到1.21版本以后这个命令测底废弃
我们使用的k8s版本是1.23.0,证书到期时间是2024年,接下来我们延长到2033年,也就是10年。
下载对应的k8s源码
wget https://github.com/kubernetes/kubernetes/archive/refs/heads/release-1.23.zip unzip release-1.23.zip cd kubernetes-release-1.23
修改有效期主要修改两个文件constants.go和cert.go
修改constants.go文件
vi cmd/kubeadm/app/constants/constants.go
找到关键字CertificateValidity,大概在49行
CertificateValidity = time.Hour * 24 * 365#修改为CertificateValidity = time.Hour * 24 * 365 * 10
这样就加了10年,接着我们修改cert.go文件
vi staging/src/k8s.io/client-go/util/cert/cert.go
找到关键字NotAfter:,大概在66行
NotAfter: now.Add(duration365d * 10).UTC(),
默认就是10年,我们本来只需要10年,这里不需要修改
这两个改好了,我们就可以编译源码了,编译前还需要安装依赖包
yum install gcc make rsync jq -y #如果是ubuntu命令是 sudo apt install build-essential rsync jq -y
接着我们就可以开始编译了
# 编译 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
编译完成以后文件均在kubernetes-release-1.23/_output/bin/目录下,实际我们只需要kubeadm文件即可进行证书续期
替换原来的kuadm文件
mv /usr/bin/kubeadm /usr/bin/kubeadm_bak mv kubernetes-release-1.23/_output/bin/kubeadm /usr/bin/kubeadm chmod +x /usr/bin/kubeadm
然后执行kubeadm version命令如果能够正确反馈版本信息,说明就已经OK了。
kubeadm version
接着我们续订所有证书,续订前先备份下当前的所有证书
cd /etc/kubernetes/ cp -r pki pki_bak kubeadm certs renew all
然后我们再使用命令查询证书状态
需要重启下对应的组件
kubectl get pod -A -o wide | egrep -iE "kube-apiserver|kube-controller-manager|kube-scheduler|etcd-" | awk '{print $2}' | xargs kubectl delete pod -n kube-system
如果证书已经到期不能使用kubelet命令,直接去节点操作以下命令
docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler' | awk '{print $1}' | xargs docker restart