![HAProxy 健康检查失败,第 7 层状态错误,代码:400,信息:“HTTP 状态检查返回代码 400](https://linux22.com/image/767457/HAProxy%20%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5%E5%A4%B1%E8%B4%A5%EF%BC%8C%E7%AC%AC%207%20%E5%B1%82%E7%8A%B6%E6%80%81%E9%94%99%E8%AF%AF%EF%BC%8C%E4%BB%A3%E7%A0%81%EF%BC%9A400%EF%BC%8C%E4%BF%A1%E6%81%AF%EF%BC%9A%E2%80%9CHTTP%20%E7%8A%B6%E6%80%81%E6%A3%80%E6%9F%A5%E8%BF%94%E5%9B%9E%E4%BB%A3%E7%A0%81%20400.png)
我有一台 HAProxy 服务器,用作我的 k8s 节点的 L7 负载均衡器。我的集群启用了 istio,并且我有一个通过 NodePort 公开的 istio-ingressgateway 服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.11.140.167 <none> 15021:30301/TCP,80:31916/TCP,443:31517/TCP,15012:30768/TCP,15443:32020/TCP 11d
我正在尝试从 HAProxy 服务器对端点执行健康检查/healthz/ready
。我使用的是 HAProxy 1.8,haproxy.cfg
如下所示:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
pidfile /var/run/rh-haproxy18-haproxy.pid
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
spread-checks 21
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 10000
balance roundrobin
frontend http-80
bind *:80
mode http
option httplog
default_backend www-80
backend www-80
balance roundrobin
mode http
option httpchk /healthz/ready HTTP/1.1
http-check expect status 200
server backendnode1 155.13.200.29:31916 check port 30301 fall 3 rise 2 inter 1597
server backendnode2 155.13.200.28:31916 check port 30301 fall 3 rise 2 inter 1597
server backendnode3 155.13.200.27:31916 check port 30301 fall 3 rise 2 inter 1597
frontend health-80
bind *:8080
acl backend_dead nbsrv(www-80) lt 1
monitor-uri /haproxy_status
monitor fail if backend_dead
listen stats # Define a listen section called "stats"
bind :9000 # Listen on localhost:9000
mode http
stats enable # Enable stats page
stats hide-version # Hide HAProxy version
stats realm Haproxy\ Statistics # Title text for popup window
stats uri /haproxy_stats # Stats URI
stats auth haproxy:passwd
我正在使用HTTP/1.1
后端健康检查,因为istio-ingressgateway
它不接受HTTP/1.0
请求,导致错误代码426
。
从 HAProxy 服务器访问后端成功:
curl -I http://155.13.200.29:31916/healthz/ready
HTTP/1.1 200 OK
date: Fri, 11 Jun 2021 07:21:09 GMT
x-envoy-upstream-service-time: 0
server: envoy
transfer-encoding: chunked
但是,HAProxy 健康检查仍然无法通过。我收到以下错误:
Jun 11 07:18:22 hap-server01 haproxy[12348]: Server www-80/backendnode2 is DOWN, reason: Layer7 wrong status, code: 400, info: "HTTP status check returned code <3C>400<3E>", check duration: 2ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jun 11 07:18:22 hap-server01 haproxy[12348]: Server www-80/backendnode2 is DOWN, reason: Layer7 wrong status, code: 400, info: "HTTP status check returned code <3C>400<3E>", check duration: 2ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jun 11 07:18:22 hap-server01 haproxy[11795]: [WARNING] 161/071821 (11795) : Former worker 11798 exited with code 0
Jun 11 07:18:22 hap-server01 haproxy[12348]: Server www-80/backendnode3 is DOWN, reason: Layer7 wrong status, code: 400, info: "HTTP status check returned code <3C>400<3E>", check duration: 3ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jun 11 07:18:22 hap-server01 haproxy[12348]: Server www-80/backendnode3 is DOWN, reason: Layer7 wrong status, code: 400, info: "HTTP status check returned code <3C>400<3E>", check duration: 3ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
我理解,状态代码400
是针对错误请求而出现的。我的配置中是否有错误haproxy.cfg
?我觉得这是我尝试发送HTTP/1.1
健康检查请求的方式。但是,我不确定在配置中还要添加什么或修改什么。
答案1
检查手册,如果不指定方法,则无法指定版本:
option httpchk <method> <uri> <version>
对于你的情况,我会尝试
option httpchk GET /healthz/ready HTTP/1.1
另外:了解 tcpdump,观察系统之间的通信并找出问题所在非常有趣。