0

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

发出的外部ip是10.10.10.11

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

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

我认为这是我的 HAProxy 配置导致问题的原因,也许是缓存?但我没有配置任何缓存。我是一个 HAProxy 新手,所以我可能会遗漏一些东西。

这是我的 HAProxy 配置。

我都尝试过mode tcpand mode 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 client, timeout connect, timeout server. 我将这些时间减少到 1 秒,然后我每 1 秒得到一个不同的 POD,但是这些时间太短了,我也会遇到间歇性连接失败。

所以,我也有这个问题。HAProxy 是否能够在另一个负载均衡器前作为反向代理工作,还是我需要使用另一种技术,例如 Nginx?

4

1 回答 1

0

我终于找到了答案。我需要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 获得正确的循环结果

于 2022-01-31T23:19:47.900 回答