04. Kubernetes - Kubeadm 证书问题

证书有效期

通过 kubeadm 安装的 Kubernetes 集群的证书有效期为 1 年,可以使用相关命令查看证书的有效期:

kubeadm certs check-expiration

如图所示:

image

可以看到除了 ca 证书,其他证书的有效期都是一年。如果证书到期,则整个集群都会挂掉。

解决这个问题的办法一般有两种:

  1. 如果还没有安装集群,可以通过修改源码设置证书有效期。
  2. 如果集群已经运行,可以通过重新签发有效期更长的证书。

证书更新

为了更新的安全性,更新之前可以将所有 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

如图所示:

image

可以看到提示让重启 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

如如所示:

image

此时查看证书已经是新的了,也可以通过命令查看:

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 的证书时间。

  1. 主备一台 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

  1. 修改源码:

修改文件: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

  1. 安装 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

  1. 编译 Kubeadm:
cd /opt/kubernetes/

# 指定只编译 Kubeadm
make all WHAT=cmd/kubeadm GOFLAGS=-v

编译完成后会在 _output/local/bin/linux/amd64/kubeadm 目录下生成 kubeadm 的二进制文件。将该二进制文件替换掉 Master 节点的二进制文件即可。


  1. 替换文件:
mv /usr/bin/kubeadm /usr/bin/kubeadm_$(date +%F)
# 将新的 kubeadm 上传到 /usr/bin 下面,然后修改权限
chmod 755 /usr/bin/kubeadm
  1. 此时在使用上面的方法更新证书之后,如图所示:

image

可以发现,组件的证书都变成了 100 年,但是 CA 的证书还是 10 年。如果想要更新 CA 证书,需要重建集群。

posted @ 2022-10-10 21:02  不知名换皮工程师  阅读(407)  评论(0编辑  收藏  举报