AWS EKS中NLB流量异常问题排查求助
问题描述
在AWS EKS环境中已配置aws-load-balancer-controller,Ingress对应的ALB运行正常。现需暴露一个监听TCP 5555端口的Pod,通过Service注解创建了NLB,但向应用发送特定数据时出现以下DICOM协议错误:
13:12:24.855 INFO - STORESCU->COINSDCMRCV(1) >>
A-ASSOCIATE-RJ[result: 2 - rejected-transient, source: 3 - service-provider (Presentation related function), reason: 2 - local-limit-exceeded]
异常点:仅在重新部署服务、目标组中旧Pod目标删除且新Pod目标创建的过渡阶段能成功发送数据,新目标状态变为健康后又会报错。
排查方案
1. 检查NLB会话保持配置
- 查看Service的
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes注解,确认是否开启了会话保持(stickiness.enabled=true)。若开启,NLB会将同一客户端的请求固定到某个Pod,当该Pod的DICOM关联连接数达到上限时,就会返回local-limit-exceeded;而过渡阶段新Pod无历史连接,因此能正常处理请求。 - 临时关闭会话保持:修改注解为
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes=stickiness.enabled=false,重新部署Service后测试。
2. 验证Pod的连接数与资源限制
- 检查Pod的
resources配置,确认limits.cpu、limits.memory是否设置过低,导致健康状态下Pod资源耗尽,无法处理新连接。 - 执行
kubectl top pods <pod-name>查看Pod的CPU/内存使用率;进入Pod内部执行ss -tulpn | grep :5555统计当前TCP连接数,确认是否达到应用或系统的连接上限。
3. 排查DICOM应用本身的连接限制
- 检查应用配置文件,确认是否存在最大并发DICOM关联数、最大TCP连接数的限制。这类限制在Pod刚启动时未触发,当NLB持续转发请求后达到阈值,就会返回本地限制超出的错误。
- 查看应用的详细日志,确认是否有连接数达到上限的告警或日志输出。
4. 调整NLB目标组的空闲超时配置
- NLB目标组默认空闲超时为360秒,过长的超时会导致大量空闲连接占用Pod的连接资源。
- 通过Service注解修改超时时间:添加
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes=idle_timeout.timeout_seconds=60(可根据业务调整),减少空闲连接的留存时间。
5. 检查Service的外部流量策略
- 查看Service的
externalTrafficPolicy字段:- 若设置为
Local,流量会直接转发到节点上的Pod,可能导致部分Pod连接数过载; - 尝试切换为
Cluster模式,让kube-proxy负责流量分发,均衡Pod的连接负载,测试是否解决问题。
- 若设置为
6. 验证NLB健康检查配置
- 确认Service的健康检查注解是否合理:
- TCP协议下,检查
service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol=TCP、service.beta.kubernetes.io/aws-load-balancer-healthcheck-port=5555是否正确配置; - 若健康检查过于宽松(比如仅检查端口监听),可能导致Pod被标记为健康时,应用的连接限制模块还未完全初始化,但此场景下过渡阶段能成功,该可能性较低,可作为兜底排查项。
- TCP协议下,检查
内容的提问来源于stack exchange,提问作者prosto.vint
相关产品推荐
相关产品推荐

