kubernetes证书续签到100年
一、确认使用的K8S版本
kubectl version
kubeadm version
kubectl get nodes
2
3
4
二、查询集群的证书时效
2.1、标准路径证书
kubeadm certs check-expiration
2.2、检查 K8s 主 PKI 目录证书
for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`;do
echo ======================$item===============;
openssl x509 -in $item -text -noout| grep Not;
done
2
3
4
2.3、检查 etcd 证书
for item in `find /etc/kubernetes/pki/etcd -maxdepth 2 -name "*.crt"`;do
echo ======================$item===============;
openssl x509 -in $item -text -noout| grep Not;
done
2
3
4
三、根据查询到的版本去获取对应版本的源码
https://github.com/kubernetes/kubernetes/tree/v1.32.13
2
3.1、确认需要go的版本并安装对应的版本
https://github.com/kubernetes/kubernetes/blob/release-1.32/.go-version
执行:https://go.dev/dl/go1.24.13.linux-amd64.tar.gz
解压并安装
tar -zxvf go1.24.13.linux-amd64.tar.gz -C /usr/local/
ll -l /usr/local/
2
配置环境变量:
tee -a /etc/profile <<-'EOF'
#go setting
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin
EOF
2
3
4
5
6
7
变量立即生效:
source /etc/profile
验证是否安装成功
go env
echo $GOROOT
echo $GOPATH
go version
2
3
4
3.2、克隆下载源码仓库并切换到对应的版本
我直接克隆整个仓库,是方便后面制作任意版本的证书。随时可以更新和切换任意版本,进行证书续签。
# 下载主版本
git clone https://github.com/kubernetes/kubernetes.git
# 拉取所有远程标签
git fetch --tags
# 切换到 v1.35.1 版本
git checkout v1.35.1
2
3
4
5
6
7
3.3、 验证是否切换成功
# 验证是否切换成功
git status
git describe --tags
2
3
4
四、证书有效期修改
4.1、找到证书底层工具类
staging/src/k8s.io/client-go/util/cert/cert.go
输入 /NotAfter 查找,默认是10年,修改为100年。(CA 根证书)
vim staging/src/k8s.io/client-go/util/cert/cert.go
NotAfter: now.Add(duration365d * 100).UTC(),
2
3
4.2、找到常量定义文件
cmd/kubeadm/app/constants/constants.go
在全局配置类****找到:普通证书默认1年(apiserver、etcd 等)
CertificateValidityPeriod = time.Hour * 24 * 365
输入 CertificateValidityPeriod 查找,后面加上*100,改为100年。
在全局配置类****找到:CA 根证书 默认10年
CACertificateValidityPeriod = time.Hour * 24 * 365 * 10
2
输入 /CACertificateValidityPeriod 查找,后面修改*100,改为100年
vim cmd/kubeadm/app/constants/constants.go
最终修改结果:
// CertificateValidityPeriod defines the validity period for all the signed certificates generated by kubeadm
CertificateValidityPeriod = time.Hour * 24 * 365 * 100
// CACertificateValidityPeriod defines the validity period for all the signed CA certificates generated by kubeadm
CACertificateValidityPeriod = time.Hour * 24 * 365 * 100
2
3
4
**4.3、**验证已经正确修改
cat staging/src/k8s.io/client-go/util/cert/cert.go | grep NotAfter
cat cmd/kubeadm/app/constants/constants.go | grep CertificateValidity
2
3
五、编译生成新证书
5.1、再次确认构建的go的版本号和环境版本是否一致
[root@master1 kubernetes]# cat build/build-image/cross/VERSION
v1.35.0-go1.25.6-bullseye.0[root@master1 kubernetes]#
[root@master1 kubernetes]#
[root@master1 kubernetes]# go version
go version go1.25.6 linux/amd64
[root@master1 kubernetes]#
2
3
4
5
6
7
5.2、确认二进制文件位置
[root@master1 kubernetes]# whereis kubeadm
kubeadm: /usr/bin/kubeadm
[root@master1 kubernetes]# ll -l /usr/bin/ |grep kube
-rwxr-xr-x 1 root root 72372408 Feb 10 21:18 kubeadm
-rwxr-xr-x 1 root root 58597560 Feb 10 21:19 kubectl
-rwxr-xr-x 1 root root 58110244 Feb 10 21:19 kubelet
[root@master1 kubernetes]#
2
3
4
5
6
7
8
9
5.3、编译二进制文件
备注:GOFLAGS=-v 显示详细信息,go build -v cmd/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
2
3
4
5
6
7
8
9
**5.4、**编译完后,查看编译结果
ll l _output/
备注:更新已经存在的集群只会用到 kubeadm,新二进制部署集群的话会用到kubeadm、kubectl、kubelet
#真实路径
ll -l _output/local/bin/linux/amd64
2
3
5.5、把编译好的文件拷贝到指定目录
mkdir -p /home/k8s-100
cp -r _output/local/bin/linux/amd64/* /home/k8s-100/
ll -l /home/k8s-100/
2
3
4
六、更新集群刷新100年证书
在开始之前导出集群完整的 kubeadm 配置(关键!)
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-config.yaml
2
做好备份很重要!!!
6.1、先对老的二进制文件好环境文件进行备份(每台都执行)
ll -l /usr/bin/ |grep kube
mkdir -p /usr/bin/k8s_backup
mv /usr/bin/kubeadm /usr/bin/k8s_backup/
ll -l /usr/bin/k8s_backup
cp -r /var/lib/etcd /var/lib/etcd_backup
cp -r /etc/kubernetes /etc/kubernetes_backup
ll /etc/kubernetes_backup
2
3
4
5
6
7
8
9
10
6.2、把新制作的二进制文件放到程序位置
# master1 执行
cd /home/k8s-100/
cp /home/k8s-100/kubeadm /usr/bin/
2
3
4
# master1执行
scp -r /home/k8s-100/kubeadm master2:/usr/bin/
scp -r /home/k8s-100/kubeadm master3:/usr/bin/
scp -r /home/k8s-100/kubeadm node:/usr/bin/
2
3
4
5
6.3、备份并删除旧证书 (master节点执行)
# 备份旧证书(以防万一)
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
# 删除所有旧证书(除了 CA 证书!)
rm -f /etc/kubernetes/pki/apiserver.crt
rm -f /etc/kubernetes/pki/apiserver.key
rm -f /etc/kubernetes/pki/apiserver-etcd-client.crt
rm -f /etc/kubernetes/pki/apiserver-etcd-client.key
rm -f /etc/kubernetes/pki/apiserver-kubelet-client.crt
rm -f /etc/kubernetes/pki/apiserver-kubelet-client.key
rm -f /etc/kubernetes/pki/front-proxy-client.crt
rm -f /etc/kubernetes/pki/front-proxy-client.key
rm -f /etc/kubernetes/pki/etcd/server.crt
rm -f /etc/kubernetes/pki/etcd/server.key
rm -f /etc/kubernetes/pki/etcd/peer.crt
rm -f /etc/kubernetes/pki/etcd/peer.key
rm -f /etc/kubernetes/pki/etcd/healthcheck-client.crt
rm -f /etc/kubernetes/pki/etcd/healthcheck-client.key
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
6.4、用新 kubeadm 重新生成所有证书 (master节点执行)
kubeadm certs renew all
2
6.5、重启,这一步必须做,不做后面会出问题
kubectl delete -n kube-system pod `kubectl get pod -n kube-system |awk '{print $1}'`
2
并等待全部启动正常:
kubectl get pod -n kube-system -o wide -w
2
6.6、重新生成 kubeconfig 文件 (master节点执行)
# 删除旧的 kubeconfig 文件(里面也嵌了证书)
rm -f /etc/kubernetes/admin.conf
rm -f /etc/kubernetes/controller-manager.conf
rm -f /etc/kubernetes/scheduler.conf
rm -f /etc/kubernetes/super-admin.conf
kubeadm init phase kubeconfig all
或者
kubeadm init phase kubeconfig all --config kubeadm-config.yaml
2
3
4
5
6
7
8
9
6.7、查看证书年限
kubeadm certs check-expiration
2
6.8、用 phase certs all 生成所有缺失的证书**(master节点执行)**
kubeadm init phase certs all
或者
kubeadm init phase certs all --config kubeadm-config.yaml
2
3
4

|