04. Kubernetes - Kubeadm 证书问题
证书有效期
通过 kubeadm 安装的 Kubernetes 集群的证书有效期为 1 年,可以使用相关命令查看证书的有效期:
kubeadm certs check-expiration
如图所示:
可以看到除了 ca 证书,其他证书的有效期都是一年。如果证书到期,则整个集群都会挂掉。
解决这个问题的办法一般有两种:
- 如果还没有安装集群,可以通过修改源码设置证书有效期。
- 如果集群已经运行,可以通过重新签发有效期更长的证书。
证书更新
为了更新的安全性,更新之前可以将所有 Master 节点的配置目录做一个备份:
cp -r /etc/kubernetes /etc/kubernetes_$(date +%F)
cp -r /var/lib/etcd /var/lib/etcd_$(date +%F)
通过执行证书更新命令查看:
kubeadm certs renew --help
可以看到证书更新是支持更新指定服务的证书,也可以更新单个服务的证书,但都是集群服务的证书。
# 所有 Master 节点更新所有证书
kubeadm certs renew all
systemctl restart kubelet
如图所示:
可以看到提示让重启 kube-apiserver, kube-controller-manager, kube-scheduler 和 etcd 服务证书才能生效。
# 重启组件
for i in $(kubectl get pods -A | grep -E "etcd|kube-apiserver|kube-controller-manager|kube-scheduler" | awk '{print $2}');do
kubectl delete pod $i -n kube-system
sleep 3
done
如如所示:
此时查看证书已经是新的了,也可以通过命令查看:
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
同时,由于在初始化 Master 集群的时候采用的是设置环境变量 export KUBECONFIG=/etc/kubernetes/admin.conf
的方法,不需要再更新该文件。如果不是该方法,还需要使用新的 admin.conf 替换掉复制的 /root/.kube/config
配置文件。
修改源码
上面的方法更新的证书有效期还是 1 年,生产还不是太建议。可以通过修改源码调整 kubeadm 的证书时间。
- 主备一台 Linux 服务器,用于源码修改:
# 下载 Kubernetes 源码
yum install git
cd /opt
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
# 查看所有分支
git branch -a
# 切换分支
git checkout -b remotes/origin/release-1.25
# 查看当前分支
git branch
- 修改源码:
修改文件:staging/src/k8s.io/client-go/util/cert/cert.go
vim staging/src/k8s.io/client-go/util/cert/cert.go
搜索关键字 NewSelfSignedCACert
找到方法,里面有定义 now.Add(duration365d * 10).UTC(),
10 年,改成 100 年:
# 改成 100 年
NotAfter: now.Add(duration365d * 100).UTC(),
修改文件:cmd/kubeadm/app/constants/constants.go
vim cmd/kubeadm/app/constants/constants.go
搜索关键字 CertificateValidity
,可以找到定义的常量 CertificateValidity = time.Hour * 24 * 365
1 年,改为 100 年。
CertificateValidity = time.Hour * 24 * 365 * 100
- 安装 go 环境:
# 查看所需要的 go 版本
cat build/build-image/cross/VERSION
# 下载 go
wget https://golang.google.cn/dl/go1.19.2.linux-amd64.tar.gz
mv go1.19.2.linux-amd64.tar.gz /opt
cd /opt/
tar -zxf go1.19.2.linux-amd64.tar.gz
mkdir /opt/gopath
# 配置环境变量
cat >> /etc/profile << EOF
# go 配置
export GOROOT=/opt/go
export GOPATH=/opt/gopath
export PATH=\$PATH:\$GOROOT/bin
EOF
#生效
source /etc/profile
- 编译 Kubeadm:
cd /opt/kubernetes/
# 指定只编译 Kubeadm
make all WHAT=cmd/kubeadm GOFLAGS=-v
编译完成后会在 _output/local/bin/linux/amd64/kubeadm
目录下生成 kubeadm 的二进制文件。将该二进制文件替换掉 Master 节点的二进制文件即可。
- 替换文件:
mv /usr/bin/kubeadm /usr/bin/kubeadm_$(date +%F)
# 将新的 kubeadm 上传到 /usr/bin 下面,然后修改权限
chmod 755 /usr/bin/kubeadm
- 此时在使用上面的方法更新证书之后,如图所示:
可以发现,组件的证书都变成了 100 年,但是 CA 的证书还是 10 年。如果想要更新 CA 证书,需要重建集群。