Kubernetes CA根证书、etcd-ca 和 kubelet 证书更新

半兽人 发表于: 2025-01-07   最后更新时间: 2025-01-07 17:47:45  
{{totalSubscript}} 订阅, 130 游览

由于 CA 根证书的有效期通常为 10 年,本篇文章将详细介绍如何处理 CA 根证书过期问题,并提供替换过程的完整教程。

一、检查证书状态

使用 kubeadm certs check-expiration 检查证书状态。

kubeadm certs check-expiration

输出中会列出所有证书的过期时间。

二、更新前的备份

在进行任何证书更新操作之前,备份现有证书文件,以防止出现问题时可以恢复。

  1. 备份证书目录

    tar -czvf /root/kubernetes-pki-backup.tar.gz /etc/kubernetes/pki
    
  2. 备份kubelet

     tar -czvf /root/kubernetes-kubelet-pki-backup.tar.gz /var/lib/kubelet/pki
     cp /etc/kubernetes/kubelet.conf /root/kubelet.conf.bak
    
  3. 删除需要替换的证书

    rm -rf /etc/kubernetes/pki/ca.*
    rm -rf /etc/kubernetes/pki/etcd/ca.*
    rm -rf /etc/kubernetes/pki/front-proxy-ca.*
    

三、更新 CA 证书

  1. 生成新的 CA 证书

    kubeadm init phase certs ca
    

    这会在 /etc/kubernetes/pki 中生成新的 CA 证书:

    • ca.crt
    • ca.key
  2. 分发 CA 证书到其他节点

    • 如果是多节点集群,需要将生成的新 CA 文件手动复制到所有节点的 /etc/kubernetes/pki 目录。
      scp /etc/kubernetes/pki/ca.* <node-ip>:/etc/kubernetes/pki/
      

四、更新 etcd-ca 证书

  1. 生成新的 etcd-ca 证书

    kubeadm init phase certs etcd-ca
    

    生成的文件位于:

    • /etc/kubernetes/pki/etcd/ca.crt
    • /etc/kubernetes/pki/etcd/ca.key
  2. 分发 etcd-ca 文件到其他节点

    如果是多节点集群,将 etcd-ca 文件分发:

    scp /etc/kubernetes/pki/etcd/ca.* <node-ip>:/etc/kubernetes/pki/etcd/
    

五、更新 front-proxy-ca 证书

  1. 生成新的 etcd-ca 证书

    kubeadm init phase certs front-proxy-ca
    
  2. 分发 etcd-ca 文件到其他节点

    如果是多节点集群,将 etcd-ca 文件分发:

    scp /etc/kubernetes/pki/front-proxy-ca.* <node-ip>:/etc/kubernetes/pki/
    

六、kubelet证书替换

移除权限信息:

rm -rf /etc/kubernetes/kubelet.conf
rm -rf /var/lib/kubelet/pki/kubelet*

重新生产

注意,kubelet是对应的node用户,一般是当前机器的名字,如:node01
也可以查看之前的kubelet用的是哪个用户权限:
cat /root/kubelet.conf.bak

kubeadm kubeconfig user --org system:nodes --client-name system:node:$NodeName > /etc/kubernetes/kubelet.conf

七、下发证书

下发组件更新

kubeadm certs renew all

重启kubelet,让证书生效

systemctl restart kubelet

重新生成 kubectl 访问集群权限:

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

八、重启组件

docker:

docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart

containerd则执行:

crictl ps |grep -E 'kube-apiserver|kube-controller-manager|kube-scheduler|etcd' | awk -F ' ' '{print $1}' |xargs crictl stop

最后、验证证书更新结果

  1. 检查更新后的证书状态

    再次运行:

    kubeadm certs check-expiration
    

    确认所有证书的过期时间已正确更新。

  2. 检查集群健康状态

    确认节点和服务状态正常:

    kubectl get nodes
    kubectl get pods -A
    

注意事项

  • 在更新证书前,确保有当前 /etc/kubernetes/pki 目录的备份。
  • 如果更新过程中出现问题,可以参考日志定位错误,例如:
    journalctl -u kubelet -f
    

参考

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#kubelet-client-cert

更新于 2025-01-07

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章