EKS集群通过域名调用服务时SSL握手平均耗时超9秒求助
针对你遇到的EKS集群中Nginx Ingress搭配cert-manager管理的Let's Encrypt证书时SSL握手平均耗时超9秒、移除TLS后请求正常的问题,给出以下具体排查步骤:
验证Ingress控制器的证书加载状态
进入Nginx Ingress控制器Pod,执行以下命令检查证书配置:kubectl exec -n <ingress-namespace> <nginx-pod-name> -- nginx -T | grep -A 10 -B 5 ssl_certificate确认证书路径正确,同时查看证书文件的更新时间,验证cert-manager是否已将证书同步至对应Secret,且控制器能读取到有效证书内容。另外检查Secret挂载状态:
kubectl exec -n <ingress-namespace> <nginx-pod-name> -- mount | grep secrets排查是否存在挂载延迟或权限不足导致证书无法及时读取的情况。
排查Ingress控制器与etcd的通信延迟
测量控制器到etcd的网络耗时:kubectl exec -n <ingress-namespace> <nginx-pod-name> -- curl -w "%{time_total}\n" -k https://<etcd-cluster-ip>:2379/health替换
<etcd-cluster-ip>为集群内部etcd服务的ClusterIP,确认是否存在高延迟。若有etcd监控,查看etcd_server_grpc_request_duration_seconds指标,分析获取Secret的请求耗时;无监控时可在etcd节点抓包,观察控制器请求的响应时长。定位SSL握手的具体耗时阶段
在客户端执行以下命令,拆分SSL握手各环节的耗时:openssl s_client -connect <your-domain>:443 -timing该命令会输出证书验证、密钥交换等阶段的具体耗时,快速定位卡顿环节。同时开启Nginx的SSL详细日志:修改Ingress控制器的ConfigMap,添加配置:
ssl_verbose_logging: "on"重启控制器Pod后,查看日志中
SSL_do_handshake()相关的耗时记录,明确控制器处理SSL握手时的延迟点。排查AWS负载均衡器的TLS配置影响
确认AWS LB的TLS处理方式:若为NLB,检查是TLS终止在LB还是传递至Ingress控制器。可临时切换为LB托管证书终止TLS,测试握手耗时是否恢复正常,排除LB层面的问题。同时查看CloudWatch中的LB指标TLSHandshakeTime,验证LB自身的握手耗时是否异常。检查cert-manager的证书同步流程
查看cert-manager日志,确认证书颁发与Secret同步的时效性:kubectl logs -n cert-manager <cert-manager-pod-name> | grep <your-certificate-name>排查是否存在证书更新延迟或Secret同步失败的情况。另外查看Ingress资源的事件:
kubectl describe ingress <your-ingress-name>检查是否有TLS相关的警告或错误信息。
内容的提问来源于stack exchange,提问作者Adeola Oladeinde

