Kubernetes 集群证书管理:kubeadm 证书自动续期与手动替换指南

一、证书自动续期配置

kubeadm 从 v1.15 开始支持自动证书续期,通过以下步骤启用:

  1. 验证当前证书状态
kubeadm certs check-expiration

输出示例:

CERTIFICATE                EXPIRES                  RESIDUAL TIME
admin.conf                 May 30, 2025 03:23 UTC   364d
apiserver                  May 30, 2025 03:23 UTC   364d

  1. 启用自动续期
sudo kubeadm init phase kubeconfig all --apiserver-advertise-address <IP> \
  && sudo systemctl restart kubelet

  1. 配置控制器管理器
    编辑 /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
  containers:
  - command:
    - --cluster-signing-duration=87600h  # 10年有效期
    - --experimental-cluster-signing-duration=87600h

  1. 验证续期机制
journalctl -u kubelet | grep "certificate rotation"

二、手动替换过期证书步骤

当证书已过期(状态码 x509: certificate has expired or is not yet valid)时:

  1. 备份现有证书
sudo cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak

  1. 生成新证书
sudo kubeadm certs renew all --config /etc/kubernetes/kubeadm-config.yaml

  1. 更新 kubeconfig
sudo kubeadm init phase kubeconfig all \
  && cp /etc/kubernetes/admin.conf $HOME/.kube/config \
  && chown $(id -u):$(id -g) $HOME/.kube/config

  1. 重启核心组件
sudo docker ps | grep "kube-apiserver\|kube-controller-manager\|kube-scheduler" | awk '{print $1}' | xargs sudo docker restart
sudo systemctl restart kubelet

  1. 验证更新
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
kubectl get nodes  # 检查集群通信

三、关键注意事项
  1. 时间同步要求
    所有节点需保持时间同步:
sudo timedatectl set-ntp true

  1. 证书生命周期
    $$ T_{\text{valid}} = T_{\text{issue}} + 365 \times 24 \times 3600 $$ 其中 $T_{\text{issue}}$ 为签发时间

  2. 故障排查命令

  • 检查 API 服务器证书链:
openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt

  • 检查 kubelet 状态:
journalctl -u kubelet -n 100 --no-pager | grep -i cert

最佳实践建议

  1. 在生产环境中启用自动续期并设置监控告警
  2. 每 6 个月执行 kubeadm certs check-expiration 主动检查
  3. 使用外部 CA 时需同步更新 CA 根证书

更多推荐