企业级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七层负载实战》

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

相关推荐
Thneonl4 小时前
Flink Operator 的隐藏陷阱:容器名不是你以为的那个
安全·kubernetes
Thneonl4 小时前
kubectl scale ds 是个 404:DaemonSet 没有 replicas
安全·kubernetes
穷人小水滴4 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
暗不需求5 小时前
Docker 入门:从「光盘与 DVD」到全栈项目容器化实战
docker·容器·面试
AllFiles5 小时前
K8s Node Exporter 异常 Write 超时排查实录
运维·后端·kubernetes
Thneonl5 小时前
etcd 不只是数据库:K8s 控制面的命脉
后端·kubernetes
探索云原生5 小时前
一个 Deployment 就能跑 vLLM,为什么还需要 KServe?
docker·ai·云原生·kubernetes·go
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
赵文宇(温玉)6 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang6 天前
上传本地镜像到harbor中
docker·容器·持续部署