【云原生】Kubernetes----证书过期处理办法

目录

引言

一、证书过期的问题与影响

二、解决方案

(一)查看证书剩余时间

(二)备份重要数据

(三)更新证书

(四)重启相关组件的pod


引言

随着云计算技术的飞速发展,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
相关推荐
暴富的Tdy1 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
魏 无羡1 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0662 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
凌虚3 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
saynaihe3 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
G_whang4 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
ccubee6 小时前
docker 安装 ftp
运维·docker·容器
探索云原生7 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳7 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
TsengOnce8 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器