Skip to content

Kubernetes 集群证书更新

为保证 Kubernetes 各组件之间的通信安全,组件之间的调用会进行 TLS 身份验证,执行验证操作需要配置集群 PKI 证书。

集群证书有效期为1年,为避免证书过期导致业务无法使用,请及时更新证书。

本文介绍如何手动进行证书更新。

检查证书是否过期

您可以执行以下命令查看证书是否过期:

kubeadm certs check-expiration

输出类似于以下内容:

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Dec 14, 2024 07:26 UTC   204d                                    no      
apiserver                  Dec 14, 2024 07:26 UTC   204d            ca                      no      
apiserver-etcd-client      Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
apiserver-kubelet-client   Dec 14, 2024 07:26 UTC   204d            ca                      no      
controller-manager.conf    Dec 14, 2024 07:26 UTC   204d                                    no      
etcd-healthcheck-client    Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
etcd-peer                  Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
etcd-server                Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
front-proxy-client         Dec 14, 2024 07:26 UTC   204d            front-proxy-ca          no      
scheduler.conf             Dec 14, 2024 07:26 UTC   204d                                    no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 12, 2033 07:26 UTC   9y              no      
etcd-ca                 Dec 12, 2033 07:26 UTC   9y              no      
front-proxy-ca          Dec 12, 2033 07:26 UTC   9y              no      

手动更新证书

您可以通过以下命令手动更新证书,只需带上合适的命令行选项。更新证书前请先备份当前证书。

更新指定证书:

kubeadm certs renew

更新全部证书:

kubeadm certs renew all

更新后的证书可以在 /etc/kubernetes/pki 目录下查看,有效期延续 1 年。 以下对应的几个配置文件也会同步更新:

  • /etc/kubernetes/admin.conf
  • /etc/kubernetes/controller-manager.conf
  • /etc/kubernetes/scheduler.conf

Note

  • 如果您部署的是一个高可用集群,这个命令需要在所有控制节点上执行。
  • 此命令用 CA(或者 front-proxy-CA )证书和存储在 /etc/kubernetes/pki 中的密钥执行更新。

重启服务

执行更新操作之后,你需要重启控制面 Pod。因为动态证书重载目前还不被所有组件和证书支持,所有这项操作是必须的。

静态 Pod 是被本地 kubelet 而不是 API 服务器管理,所以 kubectl 不能用来删除或重启他们。

要重启静态 Pod,你可以临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒。 参考 KubeletConfiguration 结构中的 fileCheckFrequency 值。

如果 Pod 不在清单目录里,kubelet 将会终止它。 在另一个 fileCheckFrequency 周期之后你可以将文件移回去,kubelet 可以完成 Pod 的重建,而组件的证书更新操作也得以完成。

mv ./manifests/* ./temp/
mv ./temp/* ./manifests/

Note

如果容器服务使用的是 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

更新 KubeConfig

构建集群时通常会将 admin.conf 证书复制到 $HOME/.kube/config 中,为了在更新 admin.conf 后更新 $HOME/.kube/config 的内容, 必须运行以下命令:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

为 kubelet 配置证书轮换

完成以上操作后,基本完成了集群所有证书的更新,但不包括 kubelet。

因为 kubernetes 包含特性 kubelet 证书轮换, 在当前证书即将过期时, 将自动生成新的秘钥,并从 Kubernetes API 申请新的证书。 一旦新的证书可用,它将被用于与 Kubernetes API 间的连接认证。

Note

此特性适用于 Kubernetes 1.8.0 或更高的版本。

启用客户端证书轮换,配置参数如下:

  • kubelet 进程接收 --rotate-certificates 参数,该参数决定 kubelet 在当前使用的 证书即将到期时,是否会自动申请新的证书。

  • kube-controller-manager 进程接收 --cluster-signing-duration 参数 (在 1.19 版本之前为 --experimental-cluster-signing-duration),用来控制签发证书的有效期限。

更多详情参考为 kubelet 配置证书轮换

自动更新证书

为了更高效便捷处理已过期或者即将过期的 kubernetes 集群证书,可参考 k8s 版本集群证书更新