二进制文件部署k8s方式(5)
Haproxy+KeepAlived负载均衡部署
HAProxy + Keepalived 是一对经典的高可用负载均衡解决方案:HAProxy 负责智能分发流量和健康检查,Keepalived 则通过 VIP(虚拟IP)机制实现故障转移,两者结合能为关键服务(如Kubernetes API Server)提供稳定可靠的外部访问入口,确保业务在单点故障时无缝切换。
安装Haproxy与KeepAlived
所有master节点执行
bash
dnf -y install haproxy keepalived
HAProxy配置
bash
cat > /etc/haproxy/haproxy.cfg << EOF
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
listen stats
mode http
bind *:8888
stats auth admin:password
stats refresh 5s
stats realm HAProxy\ Statistics
stats uri /stats
log 127.0.0.1 local3 err
frontend kube-apiserver
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend kube-apiservers
backend kube-apiservers
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server master1 192.168.153.161:6443 check
server master2 192.168.153.162:6443 check
server master3 192.168.153.163:6443 check
EOF
配置解析
bash
==================== 全局配置 ====================
global
maxconn 2000 # 最大并发连接数限制
ulimit-n 16384 # 系统文件描述符限制
log 127.0.0.1 local0 err # 错误日志发送到本地syslog的local0设施
stats timeout 30s # 统计页面连接超时时间
==================== 默认配置 ====================
defaults
log global # 继承全局日志设置
mode http # 默认使用HTTP模式(七层代理)
option httplog # 启用HTTP请求日志记录
timeout connect 5000 # 后端服务器连接超时5秒
timeout client 50000 # 客户端空闲超时50秒
timeout server 50000 # 服务器响应超时50秒
timeout http-request 15s # HTTP请求处理超时
timeout http-keep-alive 15s # HTTP长连接保持时间
==================== 健康检查端点 ====================
frontend monitor-in
bind *:33305 # 监听33305端口用于健康检查
mode http # HTTP模式
option httplog # 记录HTTP日志
monitor-uri /monitor # 定义健康检查URI路径
==================== 统计监控页面 ====================
listen stats
mode http # 使用HTTP模式
bind *:8888 # 监控页面监听8888端口
stats auth admin:password # 访问监控页面的账号密码
stats refresh 5s # 页面自动刷新间隔5秒
stats realm HAProxy\ Statistics # 认证领域名称
stats uri /stats # 统计页面访问路径
log 127.0.0.1 local3 err # 统计相关日志输出
==================== Kubernetes API Server 前端配置 ====================
frontend kube-apiserver
bind 0.0.0.0:16443 # 对外监听所有IP的16443端口
bind 127.0.0.1:16443 # 同时监听本地回环地址(本地访问)
mode tcp # 使用TCP模式(四层代理,不解析HTTP)
option tcplog # 启用TCP连接日志
tcp-request inspect-delay 5s # TCP请求检查延迟时间
default_backend kube-apiservers # 默认转发到后端kube-apiservers
==================== Kubernetes API Server 后端配置 ====================
backend kube-apiservers
mode tcp # TCP模式(四层代理)
option tcplog # 记录TCP连接日志
option tcp-check # 启用TCP健康检查(检查端口连通性)
balance roundrobin # 使用轮询负载均衡算法
# 后端服务器通用配置
default-server inter 10s # 健康检查间隔10秒
downinter 5s # 服务器宕机时的检查间隔5秒
rise 2 # 连续2次健康检查成功标记为可用
fall 2 # 连续2次健康检查失败标记为不可用
slowstart 60s # 新服务器或恢复服务器的慢启动时间
maxconn 250 # 每台服务器最大连接数
maxqueue 256 # 最大等待队列长度
weight 100 # 服务器权重(100表示100%)
# 实际Kubernetes Master节点配置
server master1 192.168.153.161:6443 check # Master1节点,启用健康检查
server master2 192.168.153.162:6443 check # Master2节点,启用健康检查
server master3 192.168.153.163:6443 check # Master3节点,启用健康检查
KeepAlived配置
各master节点配置,部分地方不同
bash
cat >/etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script checkhaproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens32
mcast_src_ip 192.168.153.161 # 当前节点ip
virtual_router_id 51
priority 100 #当前节点作为虚拟路由器优先级,这里设置master1优先级100,其余master依次递减
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.153.200
}
track_script {
checkhaproxy
}
}
EOF
配置解释
bash
==================== 全局定义部分 ====================
global_defs {
router_id LVS_DEVEL # 当前节点的路由器标识符,用于识别节点
script_user root # 执行脚本的用户身份
enable_script_security # 启用脚本安全机制(防止恶意脚本执行)
}
==================== VRRP 健康检查脚本定义 ====================
vrrp_script checkhaproxy { # 定义一个名为 checkhaproxy 的监控脚本
script "/etc/keepalived/check_haproxy.sh" # 要执行的脚本路径,检查HAProxy服务状态
interval 5 # 脚本执行间隔:每5秒执行一次
weight -5 # 如果脚本执行失败(HAProxy异常),优先级减少5
fall 2 # 连续2次检测失败才认为真正失败
rise 1 # 1次检测成功就认为恢复
}
==================== VRRP 实例配置 ====================
vrrp_instance VI_1 { # 定义一个VRRP实例,名称VI_1
state MASTER # 初始状态:MASTER(主节点),其他节点可设为BACKUP
interface ens32 # 绑定的网络接口名称(网卡)
mcast_src_ip 192.168.153.161 # 组播源IP地址(当前节点的实际IP)
virtual_router_id 51 # 虚拟路由器ID,同一组VRRP实例必须相同(范围1-255)
priority 100 # 初始优先级(范围1-254),值越高越优先成为MASTER
advert_int 2 # 组播通告发送间隔:2秒
==================== 认证配置 ====================
authentication {
auth_type PASS # 认证类型:密码认证(简单密码)
auth_pass K8SHA_KA_AUTH # 认证密码,同一VRRP组所有节点必须相同
}
==================== 虚拟IP地址配置 ====================
virtual_ipaddress {
192.168.153.200 # 要管理的虚拟IP(VIP),即浮动IP地址
# 可以配置多个VIP,每行一个
# 格式:IP地址/子网掩码 [dev 接口] [scope 作用域] [label 标签]
}
==================== 跟踪脚本配置 ====================
track_script {
checkhaproxy # 引用前面定义的checkhaproxy脚本
# 如果HAProxy异常,会降低优先级触发主备切换
}
}
健康检测脚本配置
各master节点执行
bash
cat > /etc/keepalived/check_haproxy.sh << "EOF"
#!/bin/bash
count=`netstat -apn | grep 16443 | wc -l`
if [ $count -gt 0 ]; then
exit 0
else
exit 1
fi
EOF
sh
chmod +x /etc/keepalived/check_haproxy.sh
启动服务
bash
systemctl daemon-reload
systemctl enable --now haproxy
systemctl enable --now keepalived
验证
bash
ip address show

访问vip:8888
账号密码为前面设置的admin/password
