k8s 自动更新证书配置
以下脚本、配置都来自于 kubespary 中 auto_renew 的配置,用于自动更新 k8s 的证书。
k8s-certs-renew.sh
#!/bin/bash
echo "## Expiration before renewal ##"
/usr/local/bin/kubeadm certs check-expiration
echo "## Renewing certificates managed by kubeadm ##"
/usr/local/bin/kubeadm certs renew all
echo "## Restarting control plane pods managed by kubeadm ##"
/usr/local/bin/crictl pods --namespace kube-system --name 'kube-scheduler-*|kube-controller-manager-*|kube-apiserver-*|etcd-*' -q | /usr/bin/xargs /usr/local/bin/crictl rmp -f
echo "## Updating /root/.kube/config ##"
cp /etc/kubernetes/admin.conf /root/.kube/config
echo "## Waiting for apiserver to be up again ##"
until printf "" 2>>/dev/null >>/dev/tcp/127.0.0.1/6443; do sleep 1; done
echo "## Expiration after renewal ##"
/usr/local/bin/kubeadm certs check-expiration
- 检查证书的过期时间
- 更新所有证书
- 重启 k8s 的控制平面的所有 pod。如果不是 containerd 的,需要修改脚本中的命令 docker 的为
docker ps -af 'name=k8s_POD_(kube-apiserver|kube-controller-manager|kube-scheduler|etcd)-*' -q | /usr/bin/xargs docker rm -f
- 更新 kubeconfig 文件
- 等待 apiserver 重启完成,里面的端口
6443
是 apiserver 的端口,如果不是6443
,需要修改脚本中的端口 - 检查证书的过期时间
k8s-certs-renew.service
[Unit]
Description=Renew K8S control plane certificates
[Service]
Type=oneshot
ExecStart=/usr/local/bin/k8s-certs-renew.sh
- Type=oneshot:表示这是一个一次性执行的服务,执行完成后自动停止
- ExecStart:指定要执行的脚本路径
k8s-certs-renew.timer
[Unit]
Description=Timer to renew K8S control plane certificates
[Timer]
OnCalendar=Mon *-*-1,2,3,4,5,6,7 03:00:00
RandomizedDelaySec=10min
FixedRandomDelay=yes
Persistent=yes
[Install]
WantedBy=multi-user.target
- OnCalendar=Mon --1,2,3,4,5,6,7 03:00:00:每周一凌晨 3 点执行
- --1,2,3,4,5,6,7 表示每月的 1-7 号(即每周)
- RandomizedDelaySec=10min:添加 0-10 分钟的随机延迟,避免多个集群同时执行
- FixedRandomDelay=yes:确保随机延迟是固定的
- Persistent=yes:如果错过了执行时间,会在下次启动时立即执行
- WantedBy=multi-user.target:在系统多用户模式下启用
部署步骤
- chmod +x k8s-certs-renew.sh
- cp k8s-certs-renew.sh /usr/local/bin/
- cp k8s-certs-renew.service /etc/systemd/system/
- cp k8s-certs-renew.timer /etc/systemd/system/
- systemctl daemon-reload
- systemctl enable k8s-certs-renew.timer
- systemctl start k8s-certs-renew.timer
- 重复 1-7 步,部署到其他 控制平面 节点