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 提供高可用能力。通过合理的健康检查、切换策略与监控告警,可确保对外服务连续性。