本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
Linux 专栏 | Docker 专栏 | Kubernetes 专栏
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
一、背景介绍
使用 kubeadm 安装的 Kubernetes 集群,运行一段时间后执行 kubectl 命令突然出现以下报错:
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2023-09-22T15:05:09+08:00 is after 2023-09-20T04:04:02Z
报错原因是 Kubernetes 集群证书已经过期(默认有效期 365 天),处理方法是对 Kubernetes 集群证书进行更新以重置有效期,本文将介绍单节点集群环境的具体处理过程。
二、相关概念
Kubernetes 集群证书是用于在 Kubernetes 集群中实现安全通信的关键组件,主要用于在集群的各个组件之间建立信任和进行身份验证。
Kubernetes 集群证书包括:
- CA(证书颁发机构)证书:用于签名其他证书,是信任链的根
- API Server 证书:用于 API Server 的 TLS 认证
- kubelet 证书:用于 kubelet 与 API Server 之间的通信
- kube-proxy 证书:用于 kube-proxy 与 API Server 之间的通信
- etcd 证书:用于 etcd 集群内部节点之间的通信
- 服务账户证书:用于服务账户与 API Server 之间的通信
kubeadm 是 Kubernetes 集群的启动和初始化工具,它在创建集群时生成 Kubernetes 集群证书,并默认设置有效期为一年。
三、处理过程
1、备份证书
cd /etc/kubernetes && mkdir bak && cp -r pki *.conf bak
2、检测证书
- 检测 Master 节点组件证书
# kubeadm 20 之前的版本使用本命令
kubeadm alpha certs check-expiration
# kubeadm 20 之后的版本使用本命令
kubeadm certs check-expiration
- 检测 Node 节点 kubelet 证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
3、更新证书
- 更新 Master 节点组件证书
# kubeadm 20 之前的版本使用本命令
kubeadm alpha certs renew all
# kubeadm 20 之后的版本使用本命令
kubeadm certs renew all
🔔 有效期将被重置为 365 天
- 更新 Node 节点 kubelet 证书
# 生成新的私钥和 CSR
openssl genrsa -out /var/lib/kubelet/pki/kubelet-client.key 2048
openssl req -new \
-key /var/lib/kubelet/pki/kubelet-client.key \
-out /var/lib/kubelet/pki/kubelet-client.csr \
-subj "/CN=system:node:<node-name>/O=system:nodes"
# 使用 CA 签发新证书
openssl x509 -req \
-in /var/lib/kubelet/pki/kubelet-client.csr \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-out /var/lib/kubelet/pki/kubelet-client-$(date +%F).pem \
-days 36500
# 更新证书
ln -sf /var/lib/kubelet/pki/kubelet-client-$(date +%F).pem /var/lib/kubelet/pki/kubelet-client-current.pem
4、更新 Kubeconfig
cd ~/.kube && mv config config-bak
yes | cp /etc/kubernetes/admin.conf config
🔔 若不更新 Kubeconfig,执行 kubectl 命令会出现报错:error: You must be logged in to the server (Unauthorized)
5、重启服务
# 重启 kubelet 服务
systemctl restart kubelet
# 重启 kube-apiserver、kube-controller-manage、kube-scheduler 容器
docker ps | grep kube-apiserver | grep -v pause | awk '{print $1}' | xargs -i docker restart {}
docker ps | grep kube-controller-manage | grep -v pause | awk '{print $1}' | xargs -i docker restart {}
docker ps | grep kube-scheduler | grep -v pause | awk '{print $1}' | xargs -i docker restart {}
🔔 使用 kubeadm 安装的集群,Master 节点的核心组件都是以静态 Pod 的方式运行的,因此重启服务可以采用重启对应容器的方式
6、验证效果
通过执行 kubectl 命令或检测证书,验证集群证书是否更新成功。