Haproxy集群计划内停机时如何实现连接排空与平滑切换?附K8s迁移疑问
好的,咱们一步步来拆解你的问题,给出实用的解决方案:
一、HAProxy计划内停机的连接排空方案
HAProxy本身就支持**优雅停止(软停止)**的能力,配合Keepalived的手动切换,可以实现计划内停机时排空现有连接,同时让从节点接管新连接,具体操作流程如下:
先切换VIP到从节点
在主HAProxy节点上,停止Keepalived服务(或者通过Keepalived命令将其设置为备份状态):systemctl stop keepalived此时Keepalived会触发VRRP切换,VIP自动绑定到从节点,新的SSH连接会直接路由到从HAProxy,不会再进入主节点。
优雅排空主节点的连接
对主HAProxy执行软停止命令,它会停止接受新连接,同时等待所有活跃的SSH连接自然断开后再退出:haproxy -sf $(cat /var/run/haproxy.pid)注意:SSH属于长连接,你可以根据业务需求调整HAProxy配置中的
timeout client参数,或者给软停止足够的等待时间,避免强制断开正在使用的连接。完成维护后恢复
主节点维护完成后,先启动HAProxy,再启动Keepalived:systemctl start haproxy systemctl start keepalived由于主节点的Keepalived优先级高于从节点,VIP会自动切回主节点,恢复正常集群状态。
二、具备连接排空能力的其他替代工具
如果HAProxy的方案满足不了你的需求,这些工具也支持优雅排空+集群高可用:
- Traefik(开源):自带优雅关闭机制,配置中可设置
graceTimeOut参数控制连接等待时间。部署集群时,配合VRRP工具(如Keepalived)即可实现VIP漂移,新连接自动切换,旧连接优雅排空。 - Nginx Plus(商业):提供主动健康检查与连接排空功能,支持优雅停止,配合VRRP集群可以实现无缝的流量切换,适合对稳定性要求极高的企业场景。
- F5 BIG-IP(商业):企业级负载均衡器,自带连接迁移与优雅排空功能,能在主节点停机时不仅接管新连接,还可以迁移部分活跃连接到从节点(需特定配置),但成本较高。
三、迁移到Kubernetes集群后的实现方式
完全可以实现!Kubernetes原生就支持Pod优雅终止的能力,配合HAProxy的软停止逻辑,能自动完成单个Pod的连接排空,同时让其他Pod接管流量:
K8s的优雅终止流程
当你删除HAProxy Pod、触发滚动更新或缩容时,K8s会自动执行以下步骤:- 将该Pod从Service的端点列表中移除,新的SSH连接不会再转发到这个Pod。
- 向Pod发送
SIGTERM信号,通知HAProxy进程准备停止。 - 等待你设置的
terminationGracePeriodSeconds时长,让HAProxy排空现有连接;如果超时后连接仍未结束,K8s会发送SIGKILL强制终止进程。
关键配置要点
- 在HAProxy的Deployment中,配置容器的
lifecycle钩子,捕获SIGTERM并执行软停止命令:lifecycle: preStop: exec: command: ["haproxy", "-sf", "$(cat /var/run/haproxy.pid)"] - 设置合理的
terminationGracePeriodSeconds,比如根据SSH连接的最长持续时间设置为3600秒(1小时):terminationGracePeriodSeconds: 3600 - 使用K8s Service作为流量入口(NodePort/LoadBalancer/ClusterIP),Service会自动负责将新连接转发到正常运行的HAProxy Pod,无需额外配置Keepalived。
- 在HAProxy的Deployment中,配置容器的
额外优势
K8s的滚动更新功能可以自动逐个排空Pod,无需手动操作VIP切换,运维流程更自动化、更可靠。
内容的提问来源于stack exchange,提问作者Dipu H

