【k8s】kubeadm k8s 证书过期问题处理

2024-08-31  本文已影响0人  Bogon

一、背景

Kubernetes集群中的各个组件(如API服务器、节点、控制器管理器等)之间使用证书进行身份验证和安全传输数据。然而,由于证书具有有效期限,一旦证书过期,集群中的组件将无法正常通信,导致应用程序无法正常运行。

具体来说,当Kubernetes集群证书过期时,可能出现以下情况:

kubeadm 是 Kubernetes 集群的启动和初始化工具,它在创建集群时生成 Kubernetes 集群证书,并默认设置有效期为一年。

二、 k8s 证书介绍

  1. 查看证书剩余时间
#  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

上一篇下一篇

猜你喜欢

热点阅读