ᕕ( ᐛ )ᕗ Jimyag's Blog

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
  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

[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

[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 步,部署到其他 控制平面 节点

#K8s