当从外部 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 tcp
和 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)?
我终于找到了答案。我需要在前端设置中使用 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 获得了正确的循环结果
我在具有 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 tcp
和 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)?
我终于找到了答案。我需要在前端设置中使用 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 获得了正确的循环结果