针对长连接业务,ELB Ingress通过会话保持、连接超时精细调优以及后端直接通信模式,能够有效解决高并发下的连接中断和延迟问题,是实现稳定长连接负载均衡的推荐方案。
长连接业务对负载均衡器的特殊要求
长连接业务(如WebSocket、游戏服、消息推送)与传统HTTP短连接不同,其连接建立后需要长时间保持,对负载均衡器的会话保持能力、连接超时控制和健康检查策略提出了更高要求。
- 连接状态保持:负载均衡器必须确保同一客户端的请求始终转发到同一后端Pod,否则会话状态会丢失。
- 超时参数匹配:长连接业务通常需要较长的空闲超时时间(如60秒以上),以防止连接被中间设备中断。
- 健康检查策略:需要避免因健康检查频率过高导致后端连接数过多,或检查方式不匹配导致误判。
- 后端直连能力:部分场景下,负载均衡器需要支持直接透传源IP或协议,减少代理层开销。
ELB Ingress核心特性如何匹配长连接场景
ELB Ingress是华为云基于Kubernetes Ingress标准的负载均衡实现,天然支持长连接业务所需的关键特性。
会话保持与Sticky Session配置
ELB Ingress通过会话保持(Session Sticky) 功能,确保同一用户的请求始终路由到相同的后端Pod,配置方式有两种:
- 基于Cookie插入:ELB自动在响应中添加Cookie,后端无感知。
- 基于源IP:简单但可能受NAT影响,需结合业务场景选择。
操作路径:在ELB Ingress的annotation中添加kubernetes.io/elb.session-affinity: source_ip或cookie,并设置会话保持时间(建议长连接业务设置为300-600秒,具体根据业务心跳间隔调整)。
连接超时参数调优
长连接业务最怕连接被无故中断,ELB Ingress提供三个关键超时参数:
- 空闲超时(Idle Timeout):默认60秒,对于心跳间隔较长的长连接(如WebSocket无操作时),需调大至300-1200秒。
- 请求超时(Request Timeout)
:控制单个请求最长时间,对于需要长时间响应的业务,应适当增大。
- Keepalive超时:ELB与后端之间的连接空闲超时,建议设置为60-120秒,避免频繁重建连接。
配置示例:在Service的annotation中设置kubernetes.io/elb.idle-timeout: 300。
健康检查策略优化
对长连接业务,健康检查应使用HTTP/HTTPS或TCP方式,检查间隔不宜过短(建议15-30秒),超时时间5-10秒,并设置合理的健康阈值(如3次成功视为健康,3次失败视为不健康),避免频繁连接导致后端Pod连接数爆满。
华为云ELB Ingress长连接配置步骤详解
以下以华为云CCE集群为例,演示配置一个支持WebSocket长连接业务的ELB Ingress。
创建ELB Ingress并关联后端服务
使用YAML定义Ingress资源,指定ELB的规格(如共享型或独享型)和IP版本。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ws-ingress
annotations:
kubernetes.io/elb.class: union
kubernetes.io/elb.id: <your-elb-id>
spec:
ingressClassName: elb
rules:
- host: ws.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ws-service
port:
number: 8080
设置后端服务会话保持
在Service的metadata中增加annotation,开启会话保持并指定类型。
apiVersion: v1
kind: Service
metadata:
name: ws-service
annotations:
kubernetes.io/elb.session-affinity: source_ip
kubernetes.io/elb.session-affinity-option: '{"duration": 600}'
spec:
ports:
- port: 8080
targetPort: 8080
selector:
app: ws-app
调整连接超时时间
根据业务心跳间隔,设置空闲超时时间,例如业务每30秒发送一次心跳,可将空闲超时设为120秒,避免被误断。
metadata:
annotations:
kubernetes.io/elb.idle-timeout: 120
验证配置与监控
- 使用
kubectl get ingress查看Ingress状态。
- 通过ELB控制台监控连接数、并发数等指标。
- 用客户端工具(如
websocat)测试WebSocket连接,确认连接保持和转发正常。
ELB Ingress与Nginx Ingress长连接对比
在长连接业务场景下,ELB Ingress和Nginx Ingress各有优劣,行业共识认为ELB Ingress在性能稳定性和运维成本上更具优势,但灵活性稍逊。
| 对比维度 | ELB Ingress | Nginx Ingress |
|---|---|---|
| 会话保持 | 原生支持,基于Cookie或源IP,无需额外配置 | 需通过nginx.ingress.kubernetes.io/affinity注解开启,支持Cookie和源IP |
| 连接超时控制 | 支持空闲超时、请求超时、Keepalive超时,可调范围大 | 支持proxy-read-timeout、proxy-send-timeout,但需注意Nginx自身默认值 |
| 长连接效率 | 硬件加速,四层转发延迟低,适合高并发 | 七层代理,CPU密集,大幅提升并发时资源消耗明显 |
| 运维复杂度 | 全托管,无需维护Ingress Controller | 需自行管理Controller Pod,升级、调优工作量大 |
| 扩展性 | 支持自动弹性,结合CCE自动扩容 | 需要手动配置HPA,并注意Nginx配置热加载限制 |
| 价格 | 按使用量计费,独享型实例价格较高,但性能稳定 | 免费开源,但需额外支付服务器资源成本 |
如果业务追求低延迟、高并发、运维简单,ELB Ingress是更优选择;如果团队对Nginx调优非常熟悉,且需要自定义Lua插件或复杂路由规则,Nginx Ingress则更灵活。
长连接业务选型:ELB Ingress价格与区域部署建议
价格因素:实例规格与带宽
ELB Ingress按实例规格和带宽/流量计费,共享型实例适合低并发场景,独享型实例适合长连接高并发(如万人同时在线的游戏),独享型实例提供1ms级延迟和千万级并发能力,适合大流量业务。
- 按需计费:按小时计费,适合短期测试。
- 包年包月:长期业务建议包年,节省30%左右成本。
- 带宽:按共享带宽包或按流量计费,长连接业务通常流量稳定,建议按带宽计费。
区域选择:就近部署与跨AZ容灾
长连接业务对网络延迟敏感,应选择离用户最近的区域,国内用户可选华东-上海或华南-广州,海外业务可选新加坡或法兰克福,建议在区域内多可用区(AZ) 部署,利用ELB的跨AZ负载均衡,实现单AZ故障自动切换,确保长连接不中断。
常见问题解答
问题:ELB Ingress长连接如何配置会话保持才能保证WebSocket不中断?
在Ingress对应的Service注解中设置kubernetes.io/elb.session-affinity: source_ip,并确保会话保持时间大于业务心跳间隔,ELB Ingress的七层模式支持WebSocket协议,无需额外配置,如果使用四层模式(TCP/UDP),需通过ELB控制台直接创建监听器,并开启会话保持。
问题:长连接业务下ELB Ingress与Nginx Ingress哪个更稳定?
业内专家指出,在持续高并发长连接场景下,ELB Ingress的硬件转发机制使其连接中断率更低,且无需担心Controller实例资源耗尽,Nginx Ingress在大规模长连接时,由于Worker进程模型限制,可能因文件描述符耗尽或CPU负载过高导致连接超时。稳定性优先推荐ELB Ingress。
问题:连接超时如何设置才能避免长连接被误杀?
空闲超时建议设置为业务心跳最长时间加30秒缓冲,业务每60秒心跳一次,则空闲超时设为90秒,请求超时建议放大到业务最长请求响应时间,如文件上传场景可设为600秒,Keepalive超时与后端服务配合,通常设为60秒即可,设置完成后,需通过业务日志和ELB监控确认无连接被提前关闭。
长连接业务的负载均衡选型,核心在于平衡性能、成本与运维复杂度;ELB Ingress以其全托管、低延迟和原生会话保持能力,成为多数场景下的稳妥选择。 配置时重点调整超时参数和健康检查策略,即可实现稳定高效的连接管理。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/533466.html


