12.6.5 Keepalived 与 Kubernetes/LB 集成案例
目标与适用场景#
- 解决 Kubernetes 集群对外入口高可用:API Server、Ingress、NodePort/LB 入口。
- 适合裸金属或无云厂商负载均衡的场景,使用 Keepalived 提供虚拟IP(VIP)漂移。
- 与外部负载均衡(如 HAProxy/NGINX)结合,形成稳定的入口层。
原理草图#
参考架构#
- 两台或多台入口节点部署 Keepalived,提供 VIP。
- VIP 指向负载均衡组件(HAProxy/NGINX/LVS)或直接指向 Kubernetes API Server 端口。
- 后端为 Kubernetes 控制平面或 Ingress Controller 节点池。
Client -> VIP(Keepalived) -> LB(HAProxy/NGINX) -> API Server/Ingress Controller
安装与基础准备(示例)#
以下示例基于两台入口节点:lb01(10.10.10.11)、lb02(10.10.10.12),VIP 为 10.10.10.100。
# 两台入口节点安装 keepalived 与 haproxy
sudo yum install -y keepalived haproxy
# 开启服务自启
sudo systemctl enable keepalived haproxy
# 解释:
# yum install -y:自动确认安装
# systemctl enable:设置开机启动
Kubernetes API Server 高可用入口(示例)#
1) HAProxy 配置(/etc/haproxy/haproxy.cfg)#
global
log /dev/log local0
maxconn 20000
defaults
mode tcp
timeout connect 5s
timeout client 50s
timeout server 50s
frontend k8s_api
bind *:6443
default_backend k8s_api_backend
backend k8s_api_backend
balance roundrobin
server master1 10.10.20.11:6443 check
server master2 10.10.20.12:6443 check
server master3 10.10.20.13:6443 check
# 启动并验证 haproxy
sudo systemctl restart haproxy
sudo systemctl status haproxy
# 解释:
# restart:应用配置并重启
# status:查看运行状态与报错
2) Keepalived 配置(/etc/keepalived/keepalived.conf)#
lb01 主:
global_defs {
router_id LB01
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
vrrp_instance VI_API {
state MASTER
interface eth0
virtual_router_id 51
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100/24 dev eth0 label eth0:1
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh MASTER"
notify_backup "/etc/keepalived/notify.sh BACKUP"
notify_fault "/etc/keepalived/notify.sh FAULT"
}
lb02 备:
global_defs {
router_id LB02
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
vrrp_instance VI_API {
state BACKUP
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100/24 dev eth0 label eth0:1
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh MASTER"
notify_backup "/etc/keepalived/notify.sh BACKUP"
notify_fault "/etc/keepalived/notify.sh FAULT"
}
3) 健康检查脚本(/etc/keepalived/check_haproxy.sh)#
#!/bin/bash
# 检测 HAProxy 进程与 6443 端口
pidof haproxy >/dev/null 2>&1 || exit 1
ss -lntp | grep -q ':6443' || exit 1
exit 0
sudo chmod +x /etc/keepalived/check_haproxy.sh
# 解释:
# pidof haproxy:判断进程是否存在
# ss -lntp:检查端口监听
4) 切换通知脚本(/etc/keepalived/notify.sh)#
#!/bin/bash
ROLE=$1
logger -t keepalived "Role changed to $ROLE on $(hostname)"
# 可扩展:发送ARP、更新路由、触发告警
sudo chmod +x /etc/keepalived/notify.sh
sudo systemctl restart keepalived
5) 验证 VIP 与 API 可用性#
# 在任一入口节点查看 VIP
ip addr show dev eth0 | grep 10.10.10.100
# 在客户端验证 API
curl -k https://10.10.10.100:6443/healthz
# 预期:
# ip addr 输出包含 10.10.10.100
# healthz 返回 ok
Ingress/Service 入口高可用(示例)#
将 VIP 绑定到 Ingress 入口(NodePort 30080/30443 或 HostNetwork 80/443)。
# haproxy 追加 Ingress 前端/后端
frontend ingress_http
bind *:80
default_backend ingress_http_backend
backend ingress_http_backend
balance roundrobin
server ing1 10.10.30.21:30080 check
server ing2 10.10.30.22:30080 check
# 验证对外访问
curl -H "Host: demo.example.com" http://10.10.10.100
Keepalived 与外部 LB 联动实践#
- Keepalived 只负责 VIP 漂移,LB 负责后端健康检查与流量分发。
- 采用 VRRP 多实例,区分 API Server 与 Ingress 入口 VIP。
- 配置抢占与延迟切换,避免频繁抖动。
# 多实例示例(同一台 Keepalived)
vrrp_instance VI_API {
virtual_router_id 51
priority 120
virtual_ipaddress { 10.10.10.100/24 }
}
vrrp_instance VI_ING {
virtual_router_id 52
priority 120
virtual_ipaddress { 10.10.10.101/24 }
}
典型配置思路(关键项)#
- VRRP Instance:priority 决定主备优先级;advert_int 控制通告间隔。
- track_script:检测本机 LB 进程或端口(如 haproxy 6443/80)。
- notify 脚本:切换时执行路由或 ARP 刷新。
# 手动触发 Gratuitous ARP(示例)
sudo arping -c 3 -A -I eth0 10.10.10.100
运维与故障演练(示例步骤)#
1) 主节点宕机演练
# 在 lb01 上停止 keepalived
sudo systemctl stop keepalived
# 观察 lb02 是否接管 VIP
ip addr show dev eth0 | grep 10.10.10.100
2) LB 进程退出演练
# 在 lb01 停止 haproxy,触发 track_script 降权
sudo systemctl stop haproxy
journalctl -u keepalived -n 50
3) 网络抖动演练
# 模拟丢包(需 root,谨慎)
sudo tc qdisc add dev eth0 root netem loss 30%
# 恢复
sudo tc qdisc del dev eth0 root
常见问题与建议(含排错命令)#
- ARP 缓存导致客户端不通:切换时发送 Gratuitous ARP。
bash ip neigh show | grep 10.10.10.100 arping -c 3 -A -I eth0 10.10.10.100 - 抢占导致抖动:配置 nopreempt 或降低优先级差异。
cfg vrrp_instance VI_API { nopreempt } - 健康检查误判:检查脚本需包含端口可用与后端响应。
bash curl -k https://127.0.0.1:6443/healthz
练习#
1) 将 VIP 从 10.10.10.100 切换为 10.10.10.200,并验证 API 可用性。
2) 为 Ingress 增加第二个 VIP(10.10.10.101),验证两个域名分别解析到不同 VIP。
3) 修改 track_script,使其同时检查 haproxy 进程与健康页 /healthz,验证切换行为。
小结#
Keepalived 提供稳定的入口 VIP,与 HAProxy/NGINX 等 LB 组合,可在裸金属或私有云环境为 Kubernetes API Server 与 Ingress 提供高可用能力。通过合理的健康检查、切换策略与监控告警,可确保对外服务连续性。