dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2190
  • 铜币13747枚
  • 威望5993点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:107回复:0

如何自定义 rancher负载均衡 haproxy规则?

楼主#
更多 发布于:2019-04-16 16:24
环境
web 项目基于容器环境,版本 Docker 17.12 与 Rancher v1.6 。

问题描述
Post 请求失败,Haproxy 提示 504 超时错误。
haproxy(全局反向代理) 日志
Mar 28 10:38:04 localhost haproxy[27450]: 106.37.2xx.2x:38802 [28/Mar/2019:10:37:14.903] bind~ loan/ssl-env-loan-x 9/0/0/50005/50019 504 195 - - ---- 0/0/0/0/0 0/0 "POST /analysis/report HTTP/1.1"

分析过程
0. 拓扑结构
client -> haproxy(全局反向代理) -> [ rancher-lb -> app-server ] rancher容器平台。

1. app-server 日志,状态为 200, 表明不是 app-server 造成的问题。2019-03-28 10:38:52 _internal.py [line:88] INFO 10.42.157.242 - - [28/Mar/2019 10:38:52] "POST /analysis/report HTTP/1.1" 200

2. TCP 抓包分析
反复几次tcp 抓包发现: 每次 TCP建立链接持续 50秒的时候,haproxy 就会主动断开链接。
tcpdump -vvn host 58.83.2x.xx
tcpdump: listening on enp0s25, link-type EN10MB (Ethernet), capture size 262144 bytes
10:37:15.814029 IP (tos 0x0, ttl 64, id 58961, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1xx.1xx.38802 > 58.83.2x.xx.443: Flags [S], cksum 0x7d1a (incorrect -> 0x1971), seq 2581608794, win 29200, options [mss 1460,sackOK,TS val 997431191 ecr 0,nop,wscale 7], length 0
10:37:15.818484 IP (tos 0x0, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    58.83.2x.xx.443 > 192.168.1xx.1xx.38802: Flags [S.], cksum 0x11d1 (correct), seq 1648309929, ack 2581608795, win 28960, options [mss 1460,sackOK,TS val 1750271811 ecr 997431191,nop,wscale 7], length 0
10:37:15.818526 IP (tos 0x0, ttl 64, id 58962, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1xx.1xx.38802 > 58.83.2x.xx.443: Flags [.], cksum 0x7d12 (incorrect -> 0xb0d3), seq 1, ack 1, win 229, options [nop,nop,TS val 997431196 ecr 1750271811], length 0
...省略
10:38:05.837551 IP (tos 0x0, ttl 49, id 12788, offset 0, flags [DF], proto TCP (6), length 83)
    58.83.2x.xx.443 > 192.168.1xx.1xx.38802: Flags [FP.], cksum 0x0ba7 (correct), seq 343:374, ack 1385, win 248, options [nop,nop,TS val 1750321829 ecr 997431202], length 31
10:38:05.837766 IP (tos 0x0, ttl 64, id 58971, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1xx.1xx.38802 > 58.83.2x.xx.443: Flags [.], cksum 0x7d12 (incorrect -> 0x231f), seq 1385, ack 375, win 245, options [nop,nop,TS val 997481215 ecr 1750321829], length 0
10:38:05.837993 IP (tos 0x0, ttl 64, id 58972, offset 0, flags [DF], proto TCP (6), length 83)
    192.168.1xx.1xx.38802 > 58.83.2x.xx.443: Flags [P.], cksum 0x7d31 (incorrect -> 0xe406), seq 1385:1416, ack 375, win 245, options [nop,nop,TS val 997481216 ecr 1750321829], length 31
10:38:05.838020 IP (tos 0x0, ttl 64, id 58973, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1xx.1xx.38802 > 58.83.2x.xx.443: Flags [F.], cksum 0x7d12 (incorrect -> 0x22fe), seq 1416, ack 375, win 245, options [nop,nop,TS val 997481216 ecr 1750321829], length 0
10:38:05.842021 IP (tos 0x0, ttl 49, id 12789, offset 0, flags [DF], proto TCP (6), length 52)
    58.83.2x.xx.443 > 192.168.1xx.1xx.38802: Flags [.], cksum 0x22f6 (correct), seq 375, ack 1417, win 248, options [nop,nop,TS val 1750321834 ecr 997481216], length 0

3. 检查 haproxy 超时参数
grep -i 'timeout' /etc/haproxy/haproxy.cfg
   stats timeout 2m
    timeout http-request    10s
    timeout queue           1m
    timeout connect         1m
    timeout client          1m
    timeout server          2m
    timeout http-keep-alive 2m
    timeout check           10s
全局反向代理 haproxy 超时参数,覆盖 tcpdump 抓包的 50秒时间,不是全局反向代理 造成的问题。

4. 错误原因
排除以上节点,那么最后的一个环节就是 rancher 平台上的 "负载均衡服务" rancher-lb (同样是 haproxy)。
rancher 环境中的 负载均衡器(lb-service), 默认超时时间刚好为 50秒。

图片:rancher-lb-haproxy-custom-rule1.png



解决方法
解决方法就是,标题中所示,自定义 rancher负载均衡 haproxy规则:

图片:rancher-lb-haproxy-custom-rule2.png


defaults
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http
    maxconn 4096
    mode tcp
    option forwardfor
    option http-server-close
    option redispatch
    retries 3
    timeout client 100s
    timeout connect 10s
    timeout server 150s

验证
haproxy(全局反向代理) 日志,返回 200 状态。
Mar 28 13:00:47 localhost haproxy[27908]: 106.37.2xx.2x:39786 [28/Mar/2019:12:59:04.796] bind~ loan/ssl-env-loan-x 3428/0/1/99108/102537 200 169 - - ---- 1/1/0/0/0 0/0 "POST /analysis/report HTTP/1.1"
#
游客

返回顶部