K8s高可用之Keepalived节点健康检测
Kubernetes高可用实战:Keepalived节点健康检测深度解析
在生产环境中,Keepalived是保障Kubernetes控制面高可用的重要组件。本文将揭秘其核心健康检测机制,并分享经过千节点集群验证的最佳实践方案。
一、Keepalived双保险检测机制
1. VRRP心跳检测(基础层)
核心参数解析:
vrrp_instance VI_1 {
advert_int 1 # 心跳间隔(秒)
priority 100 # 初始优先级
authentication { # 安全认证
auth_type PASS
auth_pass 62f7f8e5
}
}
故障转移时序:
- Master节点每1秒发送广播包
- Backup节点3秒未收到心跳触发选举
- 优先级最高的节点升主(默认20秒完成切换)
2. 自定义探针(业务层)
vrrp_script chk_k8s_node {
script "/etc/keepalived/check_apiserver.sh"
interval 3 # 检查间隔
timeout 2 # 脚本超时时间
rise 2 # 成功2次标记健康
fall 3 # 失败3次标记异常
weight -30 # 失败时优先级降低值
}
二、生产级健康检测方案
场景1:控制面APIServer检测
检测脚本示例:
#!/bin/bash
curl -sk https://localhost:6443/healthz | grep -q ok || exit 1
场景2:ETCD集群健康检查
#!/bin/bash
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health | grep -q 'healthy'
场景3:节点资源健康检查
#!/bin/bash
# 检查内存压力
memory=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
[ $memory -lt 90 ] || exit 1
# 检查磁盘空间
df -h /var/lib/kubelet | awk 'NR==2{print $5}' | grep -qvE '(90%|100%)'
三、高阶配置技巧
1. 多VRRP组负载均衡
vrrp_instance VI_1 {
virtual_router_id 51
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
}
vrrp_instance VI_2 {
virtual_router_id 52
virtual_ipaddress {
192.168.1.101/24 dev eth0
}
}
2. 权重动态调整
vrrp_script chk_load {
script "/etc/keepalived/check_load.sh"
weight 50 # 健康时增加优先级
}
track_script {
chk_load
chk_k8s_node weight -30
}
3. 网络分区防护
vrrp_instance VI_1 {
unicast_peer { # 指定单播对端IP
192.168.1.201
192.168.1.202
}
nopreempt # 禁止抢占
preempt_delay 300 # 抢占延迟(秒)
}
四、监控告警体系
1. Prometheus指标采集
# keepalived-exporter配置
scrape_configs:
- job_name: 'keepalived'
static_configs:
- targets: ['192.168.1.100:9650']
2. 关键监控指标
指标名称 | 告警阈值 | 说明 |
---|---|---|
keepalived_vrrp_state | != 2 | 主节点状态异常 |
keepalived_check_script_exit_code | > 0 | 健康检查失败 |
keepalived_advert_interval | > 1.5 | 心跳延迟过高 |
3. Grafana监控看板
五、故障排查工具箱
1. 实时状态查看
# 查看VIP绑定状态
ip addr show eth0 | grep '192.168.1.100'
# 查看VRRP日志
journalctl -u keepalived -f
2. 流量抓包分析
# 捕获VRRP协议包
tcpdump -i eth0 vrrp -nn -vv
3. 模拟故障演练
# 主动触发故障转移
systemctl stop kube-apiserver
watch -n1 'curl -s http://localhost:9650/metrics | grep state'
六、避坑指南
-
脑裂防护
- 启用iptables防火墙规则:仅允许指定对端IP的VRRP通信
- 配置至少3个节点形成多数派
-
性能调优
vrrp_garp_master_refresh 60 # 降低ARP广播频率 vrrp_garp_master_repeat 2
-
版本选择
- Kubernetes 1.20+ 建议使用Keepalived v2.2+
- 禁用SELinux:
setenforce 0
-
容器化部署
# DaemonSet示例 securityContext: capabilities: add: ["NET_ADMIN", "NET_RAW"]
通过本文方案,某头部电商平台成功实现Kubernetes控制面故障切换时间从分钟级降至秒级。建议将核心配置版本化存储,并定期进行故障演练,以构建真正的高可用架构。记住:Keepalived不是银弹,必须与Kubernetes原生健康检查机制协同工作,才能达到最佳效果。
分类:
Kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)