如何为HAProxy配置针对Kubernetes API的认证式HTTP健康检查
HAProxy 配置优化方案(针对K3s集群API健康检查)
先修正配置中的端口冲突问题
你当前配置里k3s-frontend-api和k3s-frontend-http都绑定了*:6443,这会导致端口占用冲突,直接无法启动HAProxy。先把k3s-frontend-http的绑定端口改为*:80,和后端的80端口对应。
核心优化:为K3s API添加带认证的健康检查
针对6443端口的Kubernetes API后端,替换原有的TCP端口检查为带Bearer Token认证的HTTPS健康检查,直接校验/readyz端点的响应,确保只有真正Ready的节点才会被流量转发。
修改后的完整配置
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private defaults log global mode tcp option tcplog option logasap 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 # K3s API Server 6443端口 frontend k3s-frontend-api bind *:6443 mode tcp option tcplog default_backend k3s-backend-api backend k3s-backend-api mode tcp # 启用带认证的HTTPS健康检查 option tcp-check tcp-check connect ssl verify required ca-file /usr/local/share/ca-certificates/ca.crt # 发送GET请求到/readyz,携带Bearer Token tcp-check send "GET /readyz HTTP/1.1\r\nHost: 192.168.1.201\r\nAuthorization: Bearer YOUR_LONG_LIVED_TOKEN\r\nConnection: close\r\n\r\n" # 期望返回200 OK状态码 tcp-check expect string "HTTP/1.1 200 OK" balance leastconn default-server downinter 5s rise 2 fall 3 server server-1 192.168.1.201:6443 check server server-2 192.168.1.202:6443 check server server-3 192.168.1.203:6443 check # NodePort/Ingress HTTP 80端口 frontend k3s-frontend-http bind *:80 mode tcp option tcplog default_backend k3s-backend-http backend k3s-backend-http mode tcp option tcp-check # 可选:如果需要更准确的检查,也可以改为HTTP检查(针对Ingress Controller的健康端点) # tcp-check send "GET /healthz HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" # tcp-check expect string "HTTP/1.1 200 OK" balance leastconn default-server downinter 5s server server-1 192.168.1.201:80 check server server-2 192.168.1.202:80 check server server-3 192.168.1.203:80 check # NodePort/Ingress HTTPS 443端口 frontend k3s-frontend-https bind *:443 mode tcp option tcplog default_backend k3s-backend-https backend k3s-backend-https mode tcp option tcp-check # 可选:针对HTTPS的Ingress Controller健康检查 # tcp-check connect ssl verify none # tcp-check send "GET /healthz HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" # tcp-check expect string "HTTP/1.1 200 OK" balance leastconn default-server downinter 5s server server-1 192.168.1.201:443 check server server-2 192.168.1.202:443 check server server-3 192.168.1.203:443 check # HAProxy 监控统计页 frontend stats mode http bind *:8404 stats enable stats uri /stats stats refresh 10s stats auth user:pass
关键配置说明
- 端口冲突修正:将
k3s-frontend-http绑定端口改为*:80,和后端节点的80端口对应,避免和6443的API端口冲突。 - API健康检查增强:
tcp-check connect ssl verify required ca-file:指定使用集群CA证书验证API Server的SSL证书,确保检查请求的安全性。tcp-check send:构造完整的HTTP请求,携带你的长期Bearer Token,请求/readyz端点(这个端点比/healthz更能反映节点是否Ready接受请求)。tcp-check expect string:校验响应是否包含HTTP/1.1 200 OK,只有符合条件的节点才会被标记为可用。
- 节点状态切换阈值:添加
rise 2 fall 3,表示节点连续2次检查通过才标记为上线,连续3次失败标记为下线,避免网络抖动导致的误判。
注意事项
- 替换
YOUR_LONG_LIVED_TOKEN为你实际创建的服务账户令牌。 - 确保HAProxy进程有权限读取
/usr/local/share/ca-certificates/ca.crt文件,可调整文件权限或路径。 - 对于80/443端口的后端,如果你使用的是Ingress Controller(如Traefik),可以参考API的配置方式,添加针对Ingress Controller健康端点的检查,进一步提升可靠性。
内容的提问来源于stack exchange,提问作者Ruben Hensen
相关产品推荐
相关产品推荐

