因为我有大量的 https 证书,而且这些证书每天都在变化(具有许多域的大型多租户应用程序),所以我有一个脚本可以在几乎随机的时间重新加载 haproxy。这很好用。
当我向后端服务器部署新版本的应用程序时,我也将后端服务器设置为 MAINT。这也很好用。
问题是,如果发生重新加载,我设置为 MAINT 状态的任何服务器都会被重新加载为 READY。这会让客户看到等待甚至错误消息。
有没有办法在重新加载haproxy时保留后端服务器的当前状态?
答案1
不确定您使用的是哪个版本,需要以下信息HAProxy
>= 1.6~
:
你可能想看看从文件加载服务器状态指令,允许
HAProxy 的无缝重新加载。
此指令将 HAProxy 指向一个文件,该文件保存了之前运行的进程的服务器状态。这样,在启动时,在处理流量之前,新进程可以像未发生重新加载一样将旧状态应用于服务器。[...]
(这只是摘录,更多详细信息请点击链接。)
使用此功能,您的配置可能看起来像(仅显示相关部分):
global
server-state-file /var/lib/haproxy/server-state
stats socket /var/lib/haproxy/stats
defaults
load-server-state-from-file global
您的重新加载命令可能如下所示:
socat /var/lib/haproxy/stats - <<< \"show servers state\" > /var/lib/haproxy/server-state && systemctl reload-or-restart haproxy
那是:
stats
通过连接到套接字socat
,获取服务器和/或后端的状态并写入状态文件。- 此后,如果一切顺利,请重新加载或重新启动
HAProxy
。
答案2
从 HAProxy 2.0 开始,可以启动“sidecar”进程数据平面API公开 REST API haproxy.cfg
,:
global
stats socket /run/haproxy/admin.sock mode 660 level admin
program api
command dataplaneapi -f /etc/haproxy/dataplaneapi.yml
负责dataplaneapi
生成haproxy.cfg
并重新加载自身。主进程和haproxy
之间的通信通过 UNIX 套接字完成。haproxy
dataplaneapi
/run/haproxy/admin.sock
看起来dataplaneapi.yml
像这样:
---
dataplaneapi:
host: 127.0.0.1
port: 5555
transaction:
transaction_dir: "/tmp/haproxy"
user:
- insecure: true
password: verySecretPassword
name: admin
haproxy:
config_file: "/etc/haproxy/haproxy.cfg"
haproxy_bin: "/usr/sbin/haproxy"
reload:
reload_delay: 5
reload_cmd: service haproxy reload
restart_cmd: service haproxy restart
然后您可以使用以下命令获取前端列表:
curl -u admin:$DATAPLANE_PASS http://127.0.0.1:5555/v2/services/haproxy/configuration/frontends
可以使用请求PUT
来更新前端:
PUT /services/haproxy/configuration/frontends/{name}
看更多详细信息的文档. 更新请求需要包装在事务中:
# fetch current config file version
GET /services/haproxy/configuration/version
# start transaction
POST /services/haproxy/transactions?version={version}
# make some changes
PUT /services/haproxy/configuration/frontends/{name}?transaction_id={transaction}
# commit transaction, followed by haproxy reload
PUT /services/haproxy/transactions/{transaction}
另一种选择是直接与 HAProxy 通信,例如通过 Unix 套接字:
echo -e "set ssl cert /etc/harpoxy/certs/mysite.pem <<\n$(cat ./new_certificate.pem)\n" | \
socat stdio unix-connect:/run/haproxy/admin.sock
随后是commit ssl cert ...
命令。也可自 HAProxy 2.0 起。