在 Kubernetes v1.24.16 中更新证书的详细步骤如下:
# 查看所有证书的过期时间
kubeadm certs check-expiration
# 或者使用 openssl 查看特定证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A 2 "Validity"
# 备份整个 kubernetes 目录
cp -r /etc/kubernetes /etc/kubernetes.backup.$(date +%Y%m%d)
# 备份 etcd 证书(如果使用外部etcd可以跳过)
cp -r /etc/kubernetes/pki/etcd /etc/kubernetes/pki/etcd.backup.$(date +%Y%m%d)
# 更新所有证书
kubeadm certs renew all
# 或者单独更新某个证书
kubeadm certs renew apiserver
kubeadm certs renew apiserver-kubelet-client
kubeadm certs renew front-proxy-client
# ... 其他证书
# 更新 admin.conf
kubeadm certs renew admin.conf
# 更新 controller-manager.conf
kubeadm certs renew controller-manager.conf
# 更新 scheduler.conf
kubeadm certs renew scheduler.conf
# 更新管理员配置
cp /etc/kubernetes/admin.conf ~/.kube/config
# 或者使用 kubeadm 更新
kubeadm init phase kubeconfig all
# 重启 kubelet
systemctl restart kubelet
# 如果是静态 Pod,需要重启相关容器
# 方法1:移动并恢复 manifest 文件
cd /etc/kubernetes/manifests/
mv kube-apiserver.yaml ..
mv kube-controller-manager.yaml ..
mv kube-scheduler.yaml ..
sleep 20
mv ../kube-apiserver.yaml .
mv ../kube-controller-manager.yaml .
mv ../kube-scheduler.yaml .
# 方法2:使用 crictl 或 docker 重启容器
crictl ps | grep kube-apiserver
crictl stop <container-id>
# kubelet 会自动重启容器
# 再次检查证书过期时间
kubeadm certs check-expiration
# 验证集群状态
kubectl get nodes
kubectl get pods -n kube-system
# 检查组件状态
kubectl get cs # 注意:此命令在新版本中已废弃
# 或使用
kubectl get pods -n kube-system
# 在其他 master 节点上执行
kubeadm certs renew all
systemctl restart kubelet
可以设置定时任务自动更新证书:
# 创建更新脚本
cat > /usr/local/bin/renew-k8s-certs.sh << 'EOF'
#!/bin/bash
kubeadm certs renew all
systemctl restart kubelet
EOF
chmod +x /usr/local/bin/renew-k8s-certs.sh
# 添加 crontab(每月1号凌晨2点执行)
echo "0 2 1 * * /usr/local/bin/renew-k8s-certs.sh >> /var/log/k8s-cert-renew.log 2>&1" | crontab -
如果遇到问题,可以查看日志:
journalctl -u kubelet -f
kubectl logs -n kube-system <pod-name>