一次 Kubernetes API Server TLS 握手超时的排查记录

线上集群某天开始,kubectl 请求 API Server 时反复报 net/http: TLS handshake timeout。开始以为网络抖一下就好了,结果持续了十几分钟,只能按链路一层层查。

先确认网络连通性。

直接 ping API server 的 IP,比如 10.45.136.3。如果 ping 都不通,先处理网络问题,后面不用看了。ping 通但 TLS 握手超时,继续查 API Server 本身。

看 API Server Pod 状态:

kubectl get pods --namespace=kube-system -l component=kube-apiserver

如果不是 Running,或者重启次数异常,控制面可能已经出问题。接着拉日志:

kubectl logs <api-server-pod-name> --namespace=kube-system

日志里常见的报错包括 etcd 连接失败、证书过期、或者请求被拒绝。这一层通常能定位到大部分问题。

如果 Pod 正常,再检查 kubectl 配置。kubectl config view 看当前 context 的 server 地址和证书信息。有时候 kubeconfig 切换集群后 server 地址没改过来,或者 certificate-authority-data 被截断,TLS 握手直接失败。

证书本身也得验证。用下面命令看 CA 证书有效期:

kubectl config view --raw | grep certificate-authority-data | awk '{print $2}' | base64 --decode | openssl x509 -text

自签证书过期一眼就能看出来,尤其是测试环境,证书过期很常见。

网络、Pod、配置、证书都正常,但高延迟网络下客户端默认超时可能不够。

可以在客户端代码里把 http.Client 的 Timeout 或 Transport 的 TLSHandshakeTimeout 调大。跨地域访问 API Server 时偶尔会碰到。

如果这些都不行,找集群管理员或云厂商支持。底层网络策略、安全组、负载均衡器的问题,应用层排查不到。

lcjmSSL,让SSL证书申请变得像注册账号一样简单。无论你是个人站长还是企业运维,无需复杂配置,即可免费申请支持多域名、通配符、IP地址的SSL证书。单张证书最多可绑定100个域名,完美覆盖中大型网站集群的需求,真正实现“一证多用”。

证书管理这块手动检查续期很容易漏。后来部分集群换成了自动申请续期,用的 lcjmSSL,免费平台,支持多域名、泛域名和 IP 证书,走 ACME 协议自动验证部署,提供 API 可以集成到发布流程里。至少证书过期导致的 TLS 问题少了很多。

posted @ 2026-09-29 19:54  枫唐  阅读(14)  评论(0)    收藏  举报