企业级HAProxy高可用离线部署实战(附Kubernetes APIServer负载均衡配置)

企业级HAProxy高可用离线部署实战(附Kubernetes APIServer负载均衡配置)

摘要:本文深入讲解在离线环境下部署HAProxy 3.1.1的全流程,涵盖源码编译、系统服务封装、K8S APIServer四层负载配置等核心环节,并提供生产级高可用方案。适用于金融、政务等隔离网络的负载均衡场景。

一、环境规划与架构设计

1.1 节点信息

节点IP 角色 服务组件
192.167.14.119 主负载节点 HAProxy + Keepalived
192.167.14.223 备负载节点 HAProxy + Keepalived
192.167.14.226 备负载节点 HAProxy + Keepalived

1.2 服务端口规划

服务 端口 协议 用途
HAProxy Admin 33305 HTTP 监控接口
K8S APIServer 16443 TCP Kubernetes API入口

二、离线安装HAProxy

2.1 源码编译安装

bash 复制代码
# 在有网环境下载源码包
wget https://www.haproxy.org/download/3.1/src/haproxy-3.1.1.tar.gz

# 传输到离线环境后解压编译
tar -zxvf haproxy-3.1.1.tar.gz -C /usr/local
cd /usr/local/haproxy-3.1.1

# 指定目标系统和安装路径
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

# 创建日志目录
mkdir -p /usr/local/haproxy/logs

关键参数解析

  • TARGET=linux31:指定内核版本兼容性
  • PREFIX:定义安装根目录,便于集中管理

三、系统服务封装

3.1 创建SystemV服务脚本

bash 复制代码
vi /etc/rc.d/init.d/haproxy

#!/bin/bash
# chkconfig: 2345 10 90
# description: HAProxy Service

BASE_DIR="/usr/local/haproxy"
CONFIG_FILE="$BASE_DIR/haproxy.cfg"
PID_FILE="$BASE_DIR/logs/haproxy.pid"

start() {
    echo "Starting HAProxy..."
    $BASE_DIR/sbin/haproxy -f $CONFIG_FILE -p $PID_FILE
    [ $? -eq 0 ] && echo "Success" || echo "Failed"
}

stop() {
    echo "Stopping HAProxy..."
    [ -f $PID_FILE ] && kill -USR1 $(cat $PID_FILE) || pkill haproxy
}

restart() {
    stop
    sleep 2
    start
}

case "$1" in
    start)   start ;;
    stop)    stop ;;
    restart) restart ;;
    *) echo "Usage: $0 {start|stop|restart}" ;;
esac

3.2 配置服务自启动

bash 复制代码
chmod +x /etc/rc.d/init.d/haproxy
chkconfig --add haproxy
chkconfig haproxy on

四、K8S APIServer负载配置

4.1 主配置文件haproxy.cfg

bash 复制代码
cat > /usr/local/haproxy/haproxy.cfg <<EOF
global
  maxconn  4000            # 最大连接数
  log /dev/log local0      # 日志输出
  stats timeout 30s        # 统计接口超时

defaults
  mode tcp                 # 四层代理模式
  timeout connect 5s       # 后端连接超时
  timeout client 30s       # 客户端超时
  timeout server 30s       # 服务端超时

frontend k8s-apiserver
  bind *:16443             # 监听所有IP的16443端口
  default_backend apiserver-nodes

backend apiserver-nodes
  balance roundrobin       # 轮询负载策略
  option tcp-check         # TCP健康检查
  default-server inter 10s fall 2 rise 2

  server master119 192.167.14.119:6443 check
  server master223 192.167.14.223:6443 check
  server master226 192.167.14.226:6443 check

listen stats               # 监控页面配置
  bind *:33305
  mode http
  stats enable
  stats uri /monitor
  stats auth admin:HAProxy@2023
EOF

4.2 配置解析

配置项 说明
balance roundrobin 轮询策略,均匀分配请求
inter 10s 健康检查间隔
fall 2 连续失败2次标记节点不可用
stats uri 监控页面路径,用于实时查看状态

五、服务管理与验证

5.1 服务控制命令

bash 复制代码
# 启动服务
systemctl start haproxy

# 查看状态
systemctl status haproxy

# 检查端口监听
ss -lntp | grep 16443

# 强制终止进程
killall -9 haproxy

5.2 监控页面访问

  • 访问地址http://<节点IP>:33305/monitor
  • 认证信息:admin / HAProxy@2023

六、生产级优化方案

6.1 内核参数调优

bash 复制代码
# 增加文件描述符限制
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
sysctl -p

6.2 日志切割配置

bash 复制代码
# 安装logrotate
cat > /etc/logrotate.d/haproxy <<EOF
/usr/local/haproxy/logs/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/haproxy/logs/haproxy.pid 2>/dev/null) 2>/dev/null || true
    endscript
}
EOF

七、高可用联动Keepalived

7.1 VIP漂移验证

bash 复制代码
# 查看当前VIP绑定
ip addr show | grep 192.167.14.205

# 模拟主节点故障
systemctl stop haproxy
tail -f /var/log/messages  # 观察切换日志

八、故障排查指南

现象 排查命令 解决方案
端口未监听 `netstat -lntp grep haproxy`
健康检查失败 telnet <后端IP> 6443 验证APIServer服务状态
负载不均衡 监控页面查看后端节点状态 调整balance策略为leastconn
内存占用过高 top -p $(pgrep haproxy) 优化maxconn参数,增加系统内存

扩展阅读《HAProxy七层负载实战》

如果本教程帮助您解决了问题,请点赞❤️收藏⭐支持!欢迎在评论区留言交流技术细节!欲了解密码学知识,请订阅《密码学实战》专栏 → 密码学实战

相关推荐
极限实验室3 小时前
INFINI Console 系统集群状态异常修复方案
kubernetes
小诸葛的博客3 小时前
MariaDB MaxScale 的用途与实现细节
云原生·容器·kubernetes
筑梦之路3 小时前
如何对docker镜像存在的gosu安全漏洞进行修复——筑梦之路
运维·docker·容器
小诸葛的博客5 小时前
Docker Overlay 网络的核心工作(以跨节点容器通信为例)
网络·docker·容器
Ares-Wang5 小时前
kubernetes》》k8s》》Service
java·容器·kubernetes
欢喜躲在眉梢里6 小时前
容器docker入门学习
运维·学习·nginx·docker·容器·虚拟化
老友@7 小时前
Docker 安装 Elasticsearch 8.x
elasticsearch·docker·容器
masx2009 小时前
在Docker /Systemd 上rclone的挂载指南,以minio为例
docker·容器
曼岛_9 小时前
企业级Keepalived高可用离线部署实战(附K8S集群VIP配置)
云原生·容器·kubernetes