集群内部证书过期后,kubelet、apiserver、etcd之间的TLS双向认证会瞬间失效,组件断连最典型的表现就是节点NotReady、kubectl命令超时、etcd心跳丢失。
为什么内部证书一过期,集群组件就“互相不认”
Kubernetes控制平面不是靠IP和密码维持信任,而是靠x509证书做双向TLS,证书上写明了有效期,一旦过期,对方会直接拒绝握手,这套机制跟人拿着过期身份证去办事一样:系统不关心你是谁,只关心证件是否在有效期内。
k8s证书过期组件断连原因拆解
集群里常见的内部证书有以下几类:
- apiserver服务端证书:kubectl、kubelet、controller-manager访问apiserver时校验。
- apiserver-kubelet客户端证书:apiserver访问kubelet的/metrics、/logs时校验。
- kubelet服务端证书:kubelet对外提供HTTPS服务时使用。
- etcd peer证书:etcd节点之间同步raft日志时互相校验。
- etcd server证书:apiserver连接etcd时校验。
- front-proxy证书:聚合API服务使用。
kubeadm部署的集群,这些证书默认有效期是1年,CA证书有效期是10年,组件之间没有宽限期,过期当天就可能断连,一旦某个证书过期,TLS握手直接失败,日志里通常会出现x509: certificate has expired or is not yet valid。
etcd证书过期集群异常表现
etcd是最脆弱的一环,etcd peer证书过期后,节点之间TLS握手失败,raft日志无法复制,一个节点可能被踢出集群,多个节点同时过期时,etcd可能失去quorum,整个控制平面只读甚至不可用。
常见表现有:
- etcd容器反复重启,日志出现
x509: certificate has expired。 - apiserver连接etcd超时,kubectl长时间无返回。
- etcdctl member list报TLS错误。
- 节点状态可能仍显示Ready,但资源变更全部卡住。
证书类型与过期影响对比:
| 组件 | 证书类型 | 过期后的直接表现 |
|---|---|---|
| apiserver | 服务端证书 | kubectl报x509错误,无法连接 |
| kubelet | 客户端/服务端证书 | 节点NotReady,日志报expired |
| etcd | peer/server证书 | etcd失去quorum,apiserver超时 |
| controller-manager | 客户端证书 | 无法连接apiserver,Pod调度异常 |
kubernetes集群证书过期怎么排查:从“节点NotReady”到日志定位
集群证书过期后,第一眼往往是节点NotReady,但NotReady原因很多,不能只靠重启,按下面路径走,能快速定位是不是证书问题。
第一步:确认是不是TLS证书问题
- 在master节点执行
journalctl -u kubelet -f --no-pager,看有没有x509: certificate has expired。 - 若kubelet日志没有,再看apiserver容器日志:
crictl logs $(crictl ps | grep kube-apiserver | awk '{print $1}'),找TLS handshake error。 - 如果在节点上执行
kubectl get nodes都超时,基本可以怀疑apiserver证书或etcd证书。
第二步:直接检查证书有效期
- 进入证书目录:
cd /etc/kubernetes/pki - 批量查看:
find . -name ".crt" -exec openssl x509 -in {} -noout -subject -enddate ; - 重点看
apiserver.crt、apiserver-kubelet-client.crt、etcd/peer.crt、etcd/server.crt。 - 如果kubeadm还能运行,优先执行
kubeadm certs check-expiration,输出会列出所有证书剩余时间。
第三步:判断影响范围
- 只有单个节点NotReady,大概率是该节点的kubelet客户端证书过期,或该节点kubelet服务端证书过期。
- 所有节点NotReady且kubectl不可用,大概率是apiserver服务端证书或etcd证书过期。
- 控制平面Pod频繁重启但节点Ready,可能是front-proxy证书或controller-manager客户端证书。
生产环境k8s证书过期处理步骤:续签与重启顺序
证书过期不等于数据丢失,处理顺序非常关键,乱重启可能放大故障。
常规续签路径
- 先备份:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak.$(date +%F) - 执行续签:
kubeadm certs renew all - 更新kubeconfig:
kubeadm init phase kubeconfig all - 重启kubelet:
systemctl restart kubelet - 控制平面静态Pod会自动加载新证书,可观察
crictl ps或kubectl get pods -n kube-system是否恢复正常。
为什么不能只执行kubeadm certs renew all
kubeadm certs renew all只更新/etc/kubernetes/pki下的证书文件,不会自动更新/etc/kubernetes/admin.conf、/etc/kubernetes/kubelet.conf等kubeconfig文件里的客户端证书,如果不执行kubeadm init phase kubeconfig all,kubectl仍然会带着旧证书去连apiserver,照样报错,这是一个高频踩坑点。
etcd证书过期导致apiserver无法启动的特殊处理
当etcd证书过期严重,apiserver无法起来,kubectl和kubeadm可能都用不了,此时不要急着删etcd数据,可以按照下面路径恢复:
- 在etcd节点上停止apiserver和etcd容器,确认数据目录
/var/lib/etcd完整。 - 使用
kubeadm init phase certs etcd-server和kubeadm init phase certs etcd-peer重新生成etcd相关证书。 - 手动重启etcd静态Pod。
- 待etcd恢复后,再执行
kubeadm certs renew all和kubeadm init phase kubeconfig all。
处理后的验证
kubectl get nodes所有节点恢复Ready。kubectl get --raw='/readyz'返回ok。- 再次执行
kubeadm certs check-expiration,证书有效期应该都延长到一年后。 - 检查etcd集群状态:
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key endpoint health。
如何让集群不再被证书过期“突然袭击”
行业共识认为,内部证书过期是Kubernetes生产环境最常见却最容易被忽视的故障之一。
定期巡检
- 每月在master节点执行
kubeadm certs check-expiration。 - 将输出接入监控或巡检脚本。
- 重点记录剩余不足30天的证书。
监控告警
- 用脚本定期执行
openssl x509 -checkend判断剩余天数。 - 通过Prometheus textfile collector或cron+alertmanager实现告警。
- 告警阈值建议设置在证书剩余30天时提醒,剩余7天时升级为严重。
自动化续签
- 在测试环境先验证续签流程。
- 生产环境使用定时任务执行
kubeadm certs renew all && kubeadm init phase kubeconfig all && systemctl restart kubelet。 - 自动化续签需谨慎,建议先灰度执行,因为重启控制平面组件会短暂影响API可用性。
Q&A:集群内部证书过期引发的组件断连常见问题
kubernetes集群证书过期后kubectl命令还能用吗?
如果apiserver服务端证书过期,kubectl每次建立TLS连接都会失败,直接报x509: certificate has expired or is not yet valid,如果只是某个节点的kubelet证书过期,kubectl连接apiserver不受影响,但该节点会显示NotReady。
集群证书过期导致节点notready,重启kubelet能解决吗?
不能,证书过期是文件状态,重启kubelet不会重新生成证书,只会反复加载过期证书并持续报错,正确做法是先通过kubeadm certs renew all续签,再重启kubelet。
etcd证书过期集群数据会丢失吗?
多数情况下不会,etcd数据保存在磁盘的/var/lib/etcd目录,证书过期不影响数据文件本身,按照正确步骤续签并重启etcd后,集群数据可以完整恢复,真正导致数据丢失的通常是误删数据目录或错误执行etcdctl snapshot restore。
集群内部证书过期看似突然,其实有明确的排查路径和处理顺序,只要证书文件还在、数据目录没动,恢复并不复杂,关键在于提前巡检,别让组件因为一张“过期工作证”集体罢工。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/641643.html





