一、背景
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 是 Kubernetes 集群的启动和初始化工具,它在创建集群时生成 Kubernetes 集群证书,并默认设置有效期为一年。
二、 k8s 证书介绍
- 查看证书剩余时间
# ll -R /etc/kubernetes/pki/
/etc/kubernetes/pki/:
total 60
-rw-r--r--. 1 root root 1233 Mar 3 2022 apiserver.crt
-rw-r--r--. 1 root root 1090 Mar 3 2022 apiserver-etcd-client.crt
-rw-------. 1 root root 1675 Mar 3 2022 apiserver-etcd-client.key
-rw-------. 1 root root 1679 Mar 3 2022 apiserver.key
-rw-r--r--. 1 root root 1099 Mar 3 2022 apiserver-kubelet-client.crt
-rw-------. 1 root root 1679 Mar 3 2022 apiserver-kubelet-client.key
-rw-r--r--. 1 root root 1025 Mar 3 2022 ca.crt
-rw-------. 1 root root 1679 Mar 3 2022 ca.key
drwxr-xr-x. 2 root root 4096 Mar 3 2022 etcd
-rw-r--r--. 1 root root 1038 Mar 3 2022 front-proxy-ca.crt
-rw-------. 1 root root 1675 Mar 3 2022 front-proxy-ca.key
-rw-r--r--. 1 root root 1058 Mar 3 2022 front-proxy-client.crt
-rw-------. 1 root root 1675 Mar 3 2022 front-proxy-client.key
-rw-------. 1 root root 1675 Mar 3 2022 sa.key
-rw-------. 1 root root 451 Mar 3 2022 sa.pub
/etc/kubernetes/pki/etcd:
total 32
-rw-r--r--. 1 root root 1017 Mar 3 2022 ca.crt
-rw-------. 1 root root 1679 Mar 3 2022 ca.key
-rw-r--r--. 1 root root 1094 Mar 3 2022 healthcheck-client.crt
-rw-------. 1 root root 1675 Mar 3 2022 healthcheck-client.key
-rw-r--r--. 1 root root 1139 Mar 3 2022 peer.crt
-rw-------. 1 root root 1675 Mar 3 2022 peer.key
-rw-r--r--. 1 root root 1139 Mar 3 2022 server.crt
-rw-------. 1 root root 1679 Mar 3 2022 server.key
image.png
image.png
# for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`; do openssl x509 -in $item -text -noout| grep Not; echo ======$item======; done
image.png
使用kubeadm certs check-expiration命令查询,这种方式仅限于使用kubeadm安装的k8s集群。
如果使用二进制安装的,需要使用创建证书的工具去查。
# kubeadm certs check-expiration
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Feb 29, 2032 09:13 UTC 7y no
apiserver Feb 29, 2032 09:13 UTC 7y ca no
apiserver-etcd-client Feb 29, 2032 09:13 UTC 7y etcd-ca no
apiserver-kubelet-client Feb 29, 2032 09:13 UTC 7y ca no
controller-manager.conf Feb 29, 2032 09:13 UTC 7y no
etcd-healthcheck-client Feb 29, 2032 09:13 UTC 7y etcd-ca no
etcd-peer Feb 29, 2032 09:13 UTC 7y etcd-ca no
etcd-server Feb 29, 2032 09:13 UTC 7y etcd-ca no
front-proxy-client Feb 29, 2032 09:13 UTC 7y front-proxy-ca no
scheduler.conf Feb 29, 2032 09:13 UTC 7y no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 29, 2032 09:13 UTC 7y no
etcd-ca Feb 29, 2032 09:13 UTC 7y no
front-proxy-ca Feb 29, 2032 09:13 UTC 7y no
title栏含义:
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
作用:前端代理的根证书颁发机构,用于签发和验证与前端代理相关的证书。
三、 更新证书前备份
操作对象: 所有 master节点
# cp -pr /var/lib/kubelet/ /var/lib/kubelet.20240831001
# cp -pr /var/lib/etcd/ /var/lib/etcd.20240831001
# cp -pr /etc/kubernetes/ /etc/kubernetes.20240831001
四 、更新证书操作
如果证书过期的话,就会出现以下情况:
# kubectl get pod -n kube-system
Unable to connect to the server: x509: certificate has expired or is not yet valid
此类情况,你需要先将所有master节点的的时间修改为证书过期前
,临时骗过k8s集群:
# timedatectl set-time "2024-08-11 21:47:00"
在 master01:
# kubectl -n kube-system get cm kubeadm-config -o yaml > kubeadm-config.yaml
# kubeadm config view > kubeadm-cluster.yaml
# kubeadm certs renew all --config=kubeadm-cluster.yaml
# rm -f /etc/kubernetes/*.conf
# kubeadm init phase kubeconfig all --config kubeadm-cluster.yaml
# docker ps |egrep "k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd" | awk '{print $1}' | xargs docker restart
# echo yes | cp -i /etc/kubernetes/admin.conf ~/.kube/config
# chown $(id -u):$(id -g) ~/.kube/config
# kubectl get nodes -o wide
查看master01 节点证书是否更新ok:
# kubeadm certs check-expiration
# for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`; do openssl x509 -in $item -text -noout| grep Not; echo ======$item======; done
将master01 上的 kubeadm-cluster.yaml
文件拷贝分发到其他master,然后在其他maser节点逐个操作:
# kubeadm certs renew all --config=kubeadm-cluster.yaml
# rm -f /etc/kubernetes/*.conf
# kubeadm init phase kubeconfig all --config kubeadm-cluster.yaml
# docker ps |egrep "k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd" | awk '{print $1}' | xargs docker restart
# echo yes | cp -i /etc/kubernetes/admin.conf ~/.kube/config
# chown $(id -u):$(id -g) ~/.kube/config
# kubeadm certs check-expiration
# for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`; do openssl x509 -in $item -text -noout| grep Not; echo ======$item======; done
所有master节点都证书都更新完成后,将所有master节点的服务器时间修改正确。
# timedatectl set-time "2024-08-31 21:47:00"
# hwclock -w
所有master节点都证书都更新完成后,可以考虑逐个将master节点上 docker kubelet 重启一下:
# systemctl restart docker
# systemctl restart kubelet
# systemctl status docker
# systemctl status kubelet
五、 参考
kubeadm安装k8s集群证书过期更新
https://mp.weixin.qq.com/s/cMAIqmg0z_6kgYpUcWMAkw
kubesphere 证书 过期 和 kubernets 证书 kubeadm证书续期
https://blog.51cto.com/u_16213606/10794928
kubeadm 初始化 k8s 证书过期解决方案
https://developer.aliyun.com/article/1478412
用kubeadmin安装的k8s集群,基于静态pod运行的etcd
https://www.jianshu.com/p/c481543002c8
Kubernetes 集群证书过期处理方法
https://mp.weixin.qq.com/s/jw1XDyEbzOZ0xzVYsGDG7Q
Kubernetes集群证书过期或延期操作处理实践指南
https://mp.weixin.qq.com/s/BCXTk_pMmTLLxlB5JqLM1w
基础设施之用脚本处理k8s证书
https://mp.weixin.qq.com/s/4Xvlfbj-K98eR_sx7mN2_Q
网友评论