脚本自动化方式
这个是一个开源的项目:https://gitee.com/ximy/update-kube-cert
该项目可以自动化更新k8s集群的证书,使用也很简单。
该脚本可将 kubeadm 生成的证书有效期更新为 10 年。
git clone https://github.com/yuyicai/update-kube-cert.git cd update-kube-cert chmod 755 update-kubeadm-cert.sh
如果使用 containerd
作为 CRI 运行时:
- 使用
update-kubeadm-cert-crictl.sh
代替update-kubeadm-cert.sh
- 手动重启控制平面 Pods(必须)
执行完此命令之后你需要重启控制面 Pods。因为动态证书重载目前还不被所有组件和证书支持,所有这项操作是必须的。 静态 Pods 是被本地 kubelet 而不是 API Server 管理, 所以 kubectl 不能用来删除或重启他们。 要重启静态 Pod 你可以临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒 (参考 KubeletConfiguration 结构 中的 fileCheckFrequency 值)。 如果 Pod 不在清单目录里,kubelet 将会终止它。 在另一个 fileCheckFrequency 周期之后你可以将文件移回去,为了组件可以完成 kubelet 将重新创建 Pod 和证书更新。
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#manual-certificate-renewal
执行时请使用 ./update-kubeadm-cert.sh all
或者 bash update-kubeadm-cert.sh all
,不要使用 sh update-kubeadm-cert.sh all
,因为某些 Linux 发行版 sh 并不是链接到 bash,可能会不兼容。
如果有多个 master 节点,在每个 master 节点都执行一次
./update-kubeadm-cert.sh all
将更新以下证书和 kubeconfig 配置文件
/etc/kubernetes ├── admin.conf ├── controller-manager.conf ├── scheduler.conf ├── kubelet.conf └── pki ├── apiserver.crt ├── apiserver-etcd-client.crt ├── apiserver-kubelet-client.crt ├── front-proxy-client.crt └── etcd ├── healthcheck-client.crt ├── peer.crt └── server.crt
更多详情请阅读gitee上的内容。
修改kubeadm源码重新编译方式
1. 搭建编译环境
# wget https://studygolang.com/dl/golang/go1.15.5.linux-amd64.tar.gz
# tar -zxvf go1.15.5.linux-amd64.tar.gz -C /usr/local
# vi /etc/profile
# export PATH=$PATH:/usr/local/go/bin
# source /etc/profile
2. 下载源码
# cd /data && git clone https://github.com/kubernetes/kubernetes.git
# git checkout -b remotes/origin/release-1.18 v1.18
3. 修改源码
# 1.14 版本之前
# vim staging/src/k8s.io/client-go/util/cert/cert.go # kubeadm
# kubeadm 1.14之后
# vim cmd/kubeadm/app/util/pkiutil/pki_helpers.go
const effectyear = time.Hour * 24 * 365 * 100 有效期100 年
NotAfter: time.Now().Add(effectyear).UTC()
# make WHAT=cmd/kubeadm GOFLAGS=-v
将更新后的kubeadm拷贝到指定位置
cp -a _output/bin/kubeadm /root/kubeadm-new
4. 更新证书
将 kubeadm 进行替换
cp /usr/bin/kubeadm /usr/bin/kubeadm.old
cp /root/kubeadm-new /usr/bin/kubeadm
chmod a+x /usr/bin/kubeadm
5. 更新证书到各个节点
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old
cd /etc/kubernetes/pki
kubeadm config view > /tmp/cluster.yaml
kubeadm alpha certs renew all --config=/tmp/cluster.yaml
for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A3 'Validity' ; done
上面介绍了两种更新kubeadm方式安装k8s集群的证书。