目录
引言
随着云计算技术的飞速发展,Kubernetes已成为企业构建、扩展和管理容器化应用程序的首选平台。然而,随着集群的持续运行,在企业中经常会遇到一个问题------Kubernetes集群的证书过期。这个问题不仅影响集群的稳定性,还可能带来安全风险。本文将深入探讨Kubernetes证书过期的问题、影响以及解决方案
一、证书过期的问题与影响
Kubernetes集群中的各个组件(如API服务器、节点、控制器管理器等)之间使用证书进行身份验证和安全传输数据。然而,由于证书具有有效期限,一旦证书过期,集群中的组件将无法正常通信,导致应用程序无法正常运行。
具体来说,当Kubernetes集群证书过期时,可能出现以下情况:
1.kubectl命令无法连接到集群,报错"Unable to connect to the server: x509: certificate has expired or is not yet valid"。
2.集群中的Pod可能无法启动或运行异常,因为Kubelet组件无法与API服务器进行通信。
3.集群的监控和日志收集等功能可能受到影响,因为相关组件无法正常工作。
二、解决方案
(一)查看证书剩余时间
使用:kubeadm certs check-expiration命令查询,这种方式仅限于使用kubeadm安装的k8s集群,如果使用二进制安装的,需要使用创建证书的工具去查询
[root@master01 ~]#kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf May 16, 2025 07:16 UTC 330d no
apiserver May 16, 2025 07:16 UTC 330d ca no
apiserver-etcd-client May 16, 2025 07:16 UTC 330d etcd-ca no
apiserver-kubelet-client May 16, 2025 07:16 UTC 330d ca no
controller-manager.conf May 16, 2025 07:16 UTC 330d no
etcd-healthcheck-client May 16, 2025 07:16 UTC 330d etcd-ca no
etcd-peer May 16, 2025 07:16 UTC 330d etcd-ca no
etcd-server May 16, 2025 07:16 UTC 330d etcd-ca no
front-proxy-client May 16, 2025 07:16 UTC 330d front-proxy-ca no
scheduler.conf May 16, 2025 07:16 UTC 330d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca May 14, 2034 07:16 UTC 9y no
etcd-ca May 14, 2034 07:16 UTC 9y no
front-proxy-ca May 14, 2034 07:16 UTC 9y no
标题含义
**CERTIFICATE:**这是指具体的证书名称
**EXPIRES:**这表示证书的到期日期和时间
**RESIDUAL TIME:**这是证书剩余的有效期。例如,330d表示还有 330 天到期
**CERTIFICATE AUTHORITY:**签发该证书的证书颁发机构(CA)的名称。例如,apiserver 证书的签发者是 ca
**EXTERNALLY MANAGED:**这表示证书是否由外部管理。如果标记为 no,则表明 kubeadm 管理这些证书。如果标记为 yes,则表明证书可能由其他工具或方法管理
证书作用
admin.conf
作用:用于管理员与Kubernetes API服务器进行交互的身份验证。这个配置文件包含了访问API服务器所需的证书和密钥。
apiserver
作用:安全通信:API服务器使用此证书与其他集群组件(如kubelet、控制器管理器等)进行TLS加密通信。
身份验证:确保只有授权的客户端可以访问API服务器。
apiserver-etcd-client
作用:API服务器用于与etcd集群通信的客户端证书,确保API服务器与etcd之间的通信是加密和安全的。
apiserver-kubelet-client
作用:API服务器用于与kubelet通信的客户端证书,确保API服务器可以安全地与集群中的节点进行通信。
controller-manager.conf
作用:控制器管理器用于与API服务器交互的身份验证证书,确保控制器管理器可以访问和操作集群资源。
etcd-healthcheck-client
作用:用于etcd健康检查的客户端证书,确保可以安全地检查etcd集群的健康状态。
etcd-peer
作用:etcd集群中节点之间通信的证书,确保etcd集群内部的通信是加密和安全的。
etcd-server
作用:etcd服务器用于与客户端通信的证书,确保etcd服务器可以安全地与集群中的其他组件进行通信。
front-proxy-client
作用:前端代理客户端证书,用于与API服务器进行身份验证,通常与某些代理或负载均衡器相关。
scheduler.conf
作用:调度器用于与API服务器交互的身份验证证书,确保调度器可以访问和操作集群资源。
根证书
ca(Certificate Authority)
作用:根证书颁发机构,用于签发和验证集群中其他所有证书的有效性。这是整个证书信任链的起点。
etcd-ca
作用:etcd集群的根证书颁发机构,专门用于签发和验证etcd相关的证书。
front-proxy-ca
作用:前端代理的根证书颁发机构,用于签发和验证与前端代理相关的证书。
(二)备份重要数据
数据对运维人员来说是非常重要的东西,为防止证书更新失败,需要将之前的证书进行备份,万一证书更新失败后,K8S集群还能再有效期内正常运行,而后重新更新证书
需要进行备份的文件有两个
cs
[root@master01 ~]#ll /etc/kubernetes/pki/
总用量 68
-rw-r--r-- 1 root root 1265 5月 16 15:16 apiserver.crt
-rw-r--r-- 1 root root 1135 5月 16 15:16 apiserver-etcd-client.crt
-rw------- 1 root root 1675 5月 16 15:16 apiserver-etcd-client.key
-rw------- 1 root root 1675 5月 16 15:16 apiserver.key
-rw-r--r-- 1 root root 1143 5月 16 15:16 apiserver-kubelet-client.crt
-rw------- 1 root root 1675 5月 16 15:16 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1066 5月 16 15:16 ca.crt
-rw------- 1 root root 1675 5月 16 15:16 ca.key
drwxr-xr-x 2 root root 162 5月 16 15:16 etcd
-rw-r--r-- 1 root root 1078 5月 16 15:16 front-proxy-ca.crt
-rw------- 1 root root 1675 5月 16 15:16 front-proxy-ca.key
-rw-r--r-- 1 root root 1103 5月 16 15:16 front-proxy-client.crt
-rw------- 1 root root 1679 5月 16 15:16 front-proxy-client.key
-rw------- 1 root root 1679 5月 16 15:16 sa.key
-rw------- 1 root root 451 5月 16 15:16 sa.pub
[root@master01 ~]#ll /var/lib/etcd/
总用量 0
drwx------ 4 root root 29 6月 13 14:44 member
'------------------------------------------------------------------------------------'
/etc/kubernetes/pki/:此目录存放的是旧的证书文件
/var/lib/etcd/:存放etcd数据,整个集群的业务以及组件通信都在其中
备份数据
cs
[root@master01 ~]#mkdir -p /k8s/bak/
#备份证书
[root@master01 ~]#cp -ar /etc/kubernetes/pki/ /k8s/bak/
#备份数据库
[root@master01 ~]#cp -ar /var/lib/etcd/ /k8s/bak/
[root@master01 ~]#ll /k8s/bak/
总用量 4
drwx------ 3 root root 20 6月 13 14:44 etcd
drwxr-xr-x 3 root root 4096 6月 6 08:51 pki
(三)更新证书
根证书默认都是十年,所以需要升级客户端证书
使用:kubeadm certs renew all命令。升级所有证书
也可以升级单独的证书,例如:kubeadm certs renew apiserver 仅重新生成 API 服务器的证书
cs
[root@master01 ~]#kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
升级后查看证书有效期时限
(四)重启相关组件的pod
更新完证书之后,相关pod还是以之前的证书为凭证,所以需要重启相关组件,使新的证书生效
在更新证书时,同样会有提示信息
直接删除之前的组件pod,它们不是由pod控制器管理,而是由集群管理工具集群管理工具kubeadm直接重新拉取
kubectl delete pods -n kube-system kube-apiserver-master01 kube-controller-manager-master01 kube-scheduler-master01 etcd-master01
cs
[root@master01 ~]#kubectl delete pods -n kube-system kube-apiserver-master01 kube-controller-manager-master01 kube-scheduler-master01 etcd-master01
pod "kube-apiserver-master01" deleted
pod "kube-controller-manager-master01" deleted
pod "kube-scheduler-master01" deleted
pod "etcd-master01" deleted
[root@master01 ~]#kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-74ff55c5b-dwzdp 1/1 Running 10 34d
coredns-74ff55c5b-ws8c8 1/1 Running 10 34d
etcd-master01 1/1 Running 10 9s
kube-apiserver-master01 1/1 Running 5 9s
kube-controller-manager-master01 1/1 Running 45 9s
kube-proxy-58zbl 1/1 Running 0 3d6h
kube-proxy-9v7jw 1/1 Running 0 3d6h
kube-proxy-xdgb4 1/1 Running 0 3d6h
kube-scheduler-master01 1/1 Running 48 9s