当从外部 HAProxy 访问时,metallb 轮循不工作

metallb round robin not working when accessed from external HAProxy

我在具有 3 个副本的 kubernetes 集群中有一个示例应用程序 运行ning。我正在使用 metallb 公开带有 type=LoadBalancer 的应用程序。

对外发出的ip是10.10.10.11

当我 运行 curl 10.10.10.11 时,我得到一个不同的 pod 响应每个请求,正如您对循环法所期望的那样。这就是我想要的行为。

我现在已经设置了后端指向 10.10.10.11 的 HAProxy,但是每次访问 HAProxy 前端时,我都会得到相同的节点来响应每个请求。如果我继续刷新,我会间歇性地得到不同的 pods,有时在 20 次刷新后,有时在 50 次以上刷新后。我试过清除我的浏览器历史记录,但没有效果。

我假设是我的 HAProxy 配置导致了问题,也许是缓存问题?但我没有配置任何缓存。我是 HAProxy 新手,所以我可能会遗漏一些东西。

这是我的 HAProxy 配置。

我已经尝试了 mode tcpmode http,但都给出了相同的结果(同一个 pod 响应每个请求)

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /home/simon/haproxy/haproxy_certs
    crt-base /home/simon/haproxy/haproxy_certs

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log global
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    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

frontend https
    bind *:443 ssl crt /home/simon/haproxy/haproxy_certs
    timeout client 60s
    mode tcp

    #Hello App
    acl ACL_hello_app hdr(host) -i hello.xxxxxxxxxdomain2.com
    use_backend hello_app if ACL_hello_app

    #Nginx App
    acl ACL_nginx_app hdr(host) -i nginx.xxxxxxxxxdomain1.com
    use_backend nginx_app if ACL_nginx_app

backend hello_app
    timeout connect 10s
    timeout server 100s
    mode tcp
    server hello_app    10.10.10.11:80

backend nginx_app
    mode tcp
    server nginx_app    10.10.10.10:80

更新

经进一步测试,问题似乎与 timeout clienttimeout connecttimeout server 有关。我将这些减少到 1 秒,然后我每 1 秒获得一个不同的 POD,但是这些时间太短了,我也会间歇性连接失败。

所以,我也有这个问题。 HAProxy 是否能够在另一个负载均衡器之前充当反向代理,或者我是否需要使用其他技术(例如 Nginx)?

我终于找到了答案。我需要在前端设置中使用 option http-server-close

frontend https
    bind *:443 ssl crt /home/simon/haproxy/haproxy_certs
    http-response set-header Strict-Transport-Security "max-age=16000000; includeSubDomains; preload;"
    timeout client 5000s
    option http-server-close
    mode http

    #Hello App
    acl ACL_hello_app hdr(host) -i hello.soxprox.com
    use_backend hello_app if ACL_hello_app

    #Nginx App
    acl ACL_nginx_app hdr(host) -i nginx.soxprox.com
    use_backend nginx_app if ACL_nginx_app

通过这些设置,我从 metallb 获得了正确的循环结果