7×24小时守护API网关:Kong健康检查功能深度实践指南
你是否遇到过后端服务突然故障却无法自动恢复?API请求持续失败导致用户投诉?Kong的健康检查功能正是为解决这类问题而生。本文将带你从零开始配置健康检查,实现后端服务状态实时监控与故障节点自动剔除,保障API服务高可用。
为什么需要健康检查?
在分布式系统中,后端服务故障是常态而非例外。传统负载均衡器仅能检测服务器存活状态,而Kong的健康检查系统能:
- 实时监控服务响应状态
- 自动隔离异常节点
- 故障恢复后自动重新上线
- 支持主动/被动两种检查模式
健康检查核心实现原理
Kong的健康检查功能主要通过kong/runloop/balancer/healthcheckers.lua模块实现,采用主动探测与被动观察相结合的方式:
- 主动检查:定期发送请求探测后端服务状态
- 被动检查:分析真实请求响应判断服务健康度
- 状态同步:通过共享内存
kong_healthchecks在Worker间同步状态
关键实现代码:
-- 健康状态回调处理 [kong/runloop/balancer/healthcheckers.lua#L133]
local function hc_callback(tgt, event)
local status = event == hc.events.healthy and true or false
balancer:setAddressStatus(balancer:findAddress(tgt.ip, tgt.port, tgt.hostname), status)
-- 通知订阅者状态变更
for _, subscriber in ipairs(healthcheck_subscribers) do
subscriber(balancer.upstream_id, tgt.ip, tgt.port, tgt.hostname,
status and "healthy" or "unhealthy")
end
end
快速开始:基础配置步骤
1. 配置文件设置
在kong.conf.default中启用健康检查基础配置:
# 启用健康检查功能
health_checks = on
# 共享内存配置 (默认已包含)
mem_cache_size = 128m
2. 通过Admin API配置上游服务
# 创建上游服务
curl -X POST http://localhost:8001/upstreams \
-d "name=backend_service" \
-d "healthchecks.active.healthy.interval=5" \
-d "healthchecks.active.healthy.successes=2" \
-d "healthchecks.active.unhealthy.interval=5" \
-d "healthchecks.active.unhealthy.http_failures=3"
# 添加目标节点
curl -X POST http://localhost:8001/upstreams/backend_service/targets \
-d "target=192.168.1.100:8080" \
-d "weight=100"
curl -X POST http://localhost:8001/upstreams/backend_service/targets \
-d "target=192.168.1.101:8080" \
-d "weight=100"
两种检查模式详细配置
主动健康检查
主动向后端服务发送探测请求,配置参数位于upstream.healthchecks.active:
| 参数 | 说明 | 默认值 |
|---|---|---|
type | 检查类型 (http/tcp) | http |
http_path | 健康检查路径 | / |
host | 检查请求Host头 | upstream名称 |
healthy.interval | 健康节点检查间隔(秒) | 0 (禁用) |
healthy.successes | 健康阈值 | 2 |
unhealthy.interval | 不健康节点检查间隔(秒) | 0 (禁用) |
unhealthy.http_failures | HTTP失败阈值 | 0 |
配置示例:
{
"healthchecks": {
"active": {
"type": "http",
"http_path": "/health",
"host": "health.check.host",
"healthy": {
"interval": 5,
"successes": 2,
"http_statuses": [200, 201, 204]
},
"unhealthy": {
"interval": 3,
"http_failures": 3,
"http_statuses": [429, 500, 502, 503, 504]
}
}
}
}
被动健康检查
监控真实流量中的请求响应,配置参数位于upstream.healthchecks.passive:
| 参数 | 说明 | 默认值 |
|---|---|---|
unhealthy.tcp_failures | TCP失败阈值 | 0 |
unhealthy.timeouts | 超时阈值 | 0 |
unhealthy.http_failures | HTTP失败阈值 | 0 |
unhealthy.http_statuses | 判定失败的状态码 | [429, 500-504] |
状态查询与监控
查看上游服务健康状态
# 获取所有上游健康状态
curl http://localhost:8001/upstreams/backend_service/health
# 单个目标节点健康详情 [kong/runloop/balancer/healthcheckers.lua#L340]
curl http://localhost:8001/upstreams/backend_service/targets/192.168.1.100:8080/health
响应示例:
{
"data": [
{
"target": "192.168.1.100:8080",
"address": "192.168.1.100:8080",
"state": "HEALTHY",
"statistics": {
"active": {
"healthy": 12,
"unhealthy": 0
},
"passive": {
"healthy": 456,
"unhealthy": 0
}
}
}
]
}
日志监控
健康检查事件会记录到Kong日志中,可在kong.conf.default配置日志级别:
# 配置日志级别为warn以捕获健康状态变更
log_level = warn
# 日志路径
proxy_error_log = logs/error.log
最佳实践与注意事项
性能优化建议
-
合理设置检查间隔:避免过于频繁的主动检查消耗后端资源
- 健康节点:5-10秒
- 不健康节点:3-5秒
-
配置适当阈值:
- HTTP服务:建议3次失败判定为不健康
- 数据库等有状态服务:建议5次失败判定
-
使用专用健康检查端点: 后端服务应实现
/health端点,仅返回关键组件状态
常见问题解决
-
健康检查误报:
- 增加
unhealthy.http_failures阈值 - 调整
http_statuses包含应用特有成功状态码
- 增加
-
节点反复上下线:
- 启用
passive检查模式 - 增加主动检查间隔
- 启用
-
内存占用过高:
- 检查
mem_cache_size配置 [kong.conf.default#L149] - 减少不必要的健康检查配置
- 检查
总结与进阶
Kong的健康检查功能通过kong/runloop/balancer/healthcheckers.lua模块实现了完整的服务可用性监控解决方案。结合主动与被动检查模式,能够有效保障API服务的高可用性。
进阶使用可参考:
- 健康检查事件订阅 [kong/runloop/balancer/healthcheckers.lua#L395]
- 自定义健康检查逻辑插件 [spec/02-integration/05-proxy/10-balancer/01-healthchecks_spec.lua]
- 与Prometheus监控集成 [plugins/prometheus/]
通过合理配置健康检查,你的API网关将具备完善的故障自动恢复能力,显著提升系统稳定性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




