
以下脚本、配置都来自于 kubespary 中 auto_renew 的配置，用于自动更新 k8s 的证书。

k8s-certs-renew.sh

```bash
#!/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
```

1. 检查证书的过期时间
2. 更新所有证书
3. 重启 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`
4. 更新 kubeconfig 文件
5. 等待 apiserver 重启完成，里面的端口`6443`是 apiserver 的端口，如果不是`6443`，需要修改脚本中的端口
6. 检查证书的过期时间

k8s-certs-renew.service

```ini
[Unit]
Description=Renew K8S control plane certificates

[Service]
Type=oneshot
ExecStart=/usr/local/bin/k8s-certs-renew.sh
```

1. Type=oneshot：表示这是一个一次性执行的服务，执行完成后自动停止
2. ExecStart：指定要执行的脚本路径

k8s-certs-renew.timer

```ini
[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
```

1. OnCalendar=Mon *-*-1,2,3,4,5,6,7 03:00:00：每周一凌晨 3 点执行
2. *-*-1,2,3,4,5,6,7 表示每月的 1-7 号（即每周）
3. RandomizedDelaySec=10min：添加 0-10 分钟的随机延迟，避免多个集群同时执行
4. FixedRandomDelay=yes：确保随机延迟是固定的
5. Persistent=yes：如果错过了执行时间，会在下次启动时立即执行
6. WantedBy=multi-user.target：在系统多用户模式下启用

部署步骤

1. chmod +x k8s-certs-renew.sh
2. cp k8s-certs-renew.sh /usr/local/bin/
3. cp k8s-certs-renew.service /etc/systemd/system/
4. cp k8s-certs-renew.timer /etc/systemd/system/
5. systemctl daemon-reload
6. systemctl enable k8s-certs-renew.timer
7. systemctl start k8s-certs-renew.timer
8. 重复 1-7 步，部署到其他 控制平面 节点

