1.首先我们查看当前证书有效期,有几种方式可以查询
第一种方式:
kubeadm alpha certs check-expiration
第二种方式:
cd /etc/kubernetes/pki for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done
2.证书有效期修改
首先安装golang,下载地址是https://golang.google.cn/dl/,现在最新的版本是go1.18.2
wget https://studygolang.com/dl/golang/go1.18.2.linux-amd64.tar.gz tar -zxvf go1.18.2.linux-amd64.tar.gz -C /usr/local/
添加环境变量
echo "export PATH=$PATH:/usr/local/go/bin" >>/etc/profile source /etc/profile
查看安装是否成功
go version go version go1.18.2 linux/amd64
下载k8s源码,首先查看自己环境的k8s版本
kubectl get node
查看到本地的是v1.18.15这个版本
去github上拉取源码,地址是https://github.com/kubernetes/kubernetes
选好自己的版本然后下载
wget https://github.com/kubernetes/kubernetes/archive/refs/heads/release-1.18.zip unzip release-1.18.zip #解压
进入K8s源码文件
cd kubernetes-release-1.18
修改有效期主要修改两个文件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年,这里不需要修改
这两个改好了,我们就可以编译源码了。
cd /root/kubernetes-release-1.18
开始编译
make WHAT=cmd/kubeadm GOFLAGS=-v
编译完后查看结果,就可以看到生成的kubeadm二进文件,在_output/bin/目录下
ls -l /root/kubernetes-release-1.18/_output/bin/
接着我们更换master节点的kubeadm
cp /usr/bin/kubeadm /usr/bin/kubeadm_bak /root/kubernetes-release-1.18/_output/bin/kubeadm /usr/bin/kubeadm
kubeadn更换以后再把证书更新下
cd /etc/ cp -R kubernetes kubernetes_bak #备份
接着我们需要把kubeadm配置文件重新生成下
kubeadm config view > /etc/kubernetes/kubeadm.yaml
续订所有证书
kubeadm alpha certs renew all --config=/etc/kubernetes/kubeadm.yaml
重生生成所有配置
kubeadm init phase kubeconfig all
接着需要重启kubelet
systemctl restart kubelet
如果证书已经过期无法使用kubelet命令是可以直接重启对应组件的docker容器
docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler' | awk '{print $1}' | xargs docker restart
更新集群管理配置文件
cp /etc/kubernetes/admin.conf ~/.kube/config
更新完毕以后我们再次验证下证书时间
kubeadm alpha certs check-expiration
我们可以看到已经更新到了2032年5月28日了,这样证书有效期修改就成功了。
针对1.17以下版本的K8s可能会遇到一些问题
kubeadm alpha certs renew命令并不会更新kubelet证书(kubelet.conf 文件里面写的客户端证书),
因为 kubelet 证书是默认开启自动轮回更新的,但是在执行 kubeadm init 的 master 节点的 kubelet.conf 文件里面的证书是以 base64 编码写死的 (类似 controller-manager.conf 里面的证书)
在用 kubeadm 命令更新 master 证书时需要手动将 kubelet.conf 文件的 client-certificate-data 和 client-key-data 改为:
vi /etc/kubernetes/kubelet.conf client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem client-key: /var/lib/kubelet/pki/kubelet-client-current.pem