082ad20913
- Add /health endpoint for liveness probe (fast, no dependencies) - Add /ready endpoint for readiness probe (checks database + redis) - Add /startup endpoint for startup probe (checks migrations) - Return 503 when not ready/started - Detailed check results in response - Include Kubernetes/Docker/Nginx configuration examples - Add comprehensive health check documentation - Include monitoring and alerting setup Phase 4 Task 45/68 completed
372 lines
6.7 KiB
Markdown
372 lines
6.7 KiB
Markdown
# 健康检查和探针指南
|
||
|
||
## 📋 概述
|
||
|
||
小虾 SaaS 提供三种健康检查端点,用于不同的监控场景。
|
||
|
||
---
|
||
|
||
## 🔍 健康检查端点
|
||
|
||
### 1. /health - 存活检查(Liveness)
|
||
|
||
**用途:** 检查应用是否存活
|
||
|
||
**特点:**
|
||
- 快速响应(<10ms)
|
||
- 不检查依赖服务
|
||
- 始终返回 200(除非崩溃)
|
||
|
||
**请求:**
|
||
```bash
|
||
curl http://localhost:8000/health
|
||
```
|
||
|
||
**响应:**
|
||
```json
|
||
{
|
||
"status": "healthy",
|
||
"timestamp": "2026-06-17T08:41:00Z",
|
||
"version": "1.0.0"
|
||
}
|
||
```
|
||
|
||
**使用场景:**
|
||
- Kubernetes liveness probe
|
||
- Docker health check
|
||
- 负载均衡器健康检查
|
||
|
||
---
|
||
|
||
### 2. /ready - 就绪检查(Readiness)
|
||
|
||
**用途:** 检查应用是否就绪接收流量
|
||
|
||
**特点:**
|
||
- 检查所有依赖服务
|
||
- 数据库连接
|
||
- Redis 连接
|
||
- 失败返回 503
|
||
|
||
**请求:**
|
||
```bash
|
||
curl http://localhost:8000/ready
|
||
```
|
||
|
||
**成功响应(200):**
|
||
```json
|
||
{
|
||
"status": "ready",
|
||
"timestamp": "2026-06-17T08:41:00Z",
|
||
"checks": {
|
||
"database": {
|
||
"status": "healthy",
|
||
"type": "postgresql",
|
||
"message": "Database connection successful"
|
||
},
|
||
"redis": {
|
||
"status": "healthy",
|
||
"type": "redis",
|
||
"message": "Redis connection successful"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**失败响应(503):**
|
||
```json
|
||
{
|
||
"status": "not_ready",
|
||
"timestamp": "2026-06-17T08:41:00Z",
|
||
"checks": {
|
||
"database": {
|
||
"status": "unhealthy",
|
||
"type": "postgresql",
|
||
"message": "Database connection failed: timeout"
|
||
},
|
||
"redis": {
|
||
"status": "healthy",
|
||
"type": "redis",
|
||
"message": "Redis connection successful"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**使用场景:**
|
||
- Kubernetes readiness probe
|
||
- 负载均衡器流量切换
|
||
- 灰度发布健康检查
|
||
|
||
---
|
||
|
||
### 3. /startup - 启动检查(Startup)
|
||
|
||
**用途:** 检查应用是否完成启动
|
||
|
||
**特点:**
|
||
- 检查数据库迁移
|
||
- 检查初始化状态
|
||
- 失败返回 503
|
||
|
||
**请求:**
|
||
```bash
|
||
curl http://localhost:8000/startup
|
||
```
|
||
|
||
**响应:**
|
||
```json
|
||
{
|
||
"status": "started",
|
||
"timestamp": "2026-06-17T08:41:00Z",
|
||
"checks": {
|
||
"database": {
|
||
"status": "healthy",
|
||
"type": "postgresql",
|
||
"message": "Database connection successful"
|
||
},
|
||
"migrations": {
|
||
"status": "healthy",
|
||
"message": "Database migrations applied"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**使用场景:**
|
||
- Kubernetes startup probe
|
||
- 应用启动验证
|
||
- 部署后检查
|
||
|
||
---
|
||
|
||
## 🐳 Docker 配置
|
||
|
||
### Dockerfile
|
||
|
||
```dockerfile
|
||
# 健康检查
|
||
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
|
||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1
|
||
```
|
||
|
||
### docker-compose.yml
|
||
|
||
```yaml
|
||
services:
|
||
api:
|
||
image: xiaoxia-saas:latest
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
||
interval: 30s
|
||
timeout: 3s
|
||
retries: 3
|
||
start_period: 40s
|
||
```
|
||
|
||
---
|
||
|
||
## ☸️ Kubernetes 配置
|
||
|
||
### Deployment
|
||
|
||
```yaml
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: xiaoxia-api
|
||
spec:
|
||
replicas: 3
|
||
template:
|
||
spec:
|
||
containers:
|
||
- name: api
|
||
image: xiaoxia-saas:latest
|
||
ports:
|
||
- containerPort: 8000
|
||
|
||
# 存活探针(应用崩溃时重启)
|
||
livenessProbe:
|
||
httpGet:
|
||
path: /health
|
||
port: 8000
|
||
initialDelaySeconds: 15
|
||
periodSeconds: 10
|
||
timeoutSeconds: 3
|
||
failureThreshold: 3
|
||
|
||
# 就绪探针(依赖服务未就绪时不接收流量)
|
||
readinessProbe:
|
||
httpGet:
|
||
path: /ready
|
||
port: 8000
|
||
initialDelaySeconds: 5
|
||
periodSeconds: 5
|
||
timeoutSeconds: 3
|
||
failureThreshold: 2
|
||
|
||
# 启动探针(启动慢的应用)
|
||
startupProbe:
|
||
httpGet:
|
||
path: /startup
|
||
port: 8000
|
||
initialDelaySeconds: 0
|
||
periodSeconds: 5
|
||
timeoutSeconds: 3
|
||
failureThreshold: 30 # 30 * 5s = 150s 最大启动时间
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 负载均衡器配置
|
||
|
||
### Nginx
|
||
|
||
```nginx
|
||
upstream xiaoxia_api {
|
||
server 10.0.0.1:8000 max_fails=3 fail_timeout=30s;
|
||
server 10.0.0.2:8000 max_fails=3 fail_timeout=30s;
|
||
}
|
||
|
||
server {
|
||
location / {
|
||
proxy_pass http://xiaoxia_api;
|
||
|
||
# 健康检查
|
||
health_check uri=/health interval=10s fails=3 passes=2;
|
||
}
|
||
}
|
||
```
|
||
|
||
### AWS ALB
|
||
|
||
```yaml
|
||
TargetGroup:
|
||
HealthCheckEnabled: true
|
||
HealthCheckPath: /health
|
||
HealthCheckIntervalSeconds: 30
|
||
HealthCheckTimeoutSeconds: 5
|
||
HealthyThresholdCount: 2
|
||
UnhealthyThresholdCount: 3
|
||
Matcher:
|
||
HttpCode: '200'
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 监控告警
|
||
|
||
### Prometheus 配置
|
||
|
||
```yaml
|
||
scrape_configs:
|
||
- job_name: 'xiaoxia-health'
|
||
metrics_path: '/health'
|
||
scrape_interval: 30s
|
||
static_configs:
|
||
- targets: ['api-1:8000', 'api-2:8000']
|
||
```
|
||
|
||
### 告警规则
|
||
|
||
```yaml
|
||
groups:
|
||
- name: xiaoxia_health
|
||
rules:
|
||
- alert: APINotHealthy
|
||
expr: up{job="xiaoxia-health"} == 0
|
||
for: 1m
|
||
annotations:
|
||
summary: "小虾 API 不健康"
|
||
description: "{{ $labels.instance }} 连续 1 分钟不健康"
|
||
|
||
- alert: APINotReady
|
||
expr: probe_success{job="xiaoxia-ready"} == 0
|
||
for: 2m
|
||
annotations:
|
||
summary: "小虾 API 未就绪"
|
||
description: "{{ $labels.instance }} 连续 2 分钟未就绪"
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 最佳实践
|
||
|
||
### 1. 探针超时配置
|
||
|
||
```
|
||
liveness: 较长超时(10s),避免误杀
|
||
readiness: 较短超时(5s),快速摘除异常实例
|
||
startup: 最长超时(150s),给足启动时间
|
||
```
|
||
|
||
### 2. 失败阈值
|
||
|
||
```
|
||
liveness: 较高阈值(3次),避免频繁重启
|
||
readiness: 较低阈值(2次),快速摘除
|
||
startup: 很高阈值(30次),容忍启动慢
|
||
```
|
||
|
||
### 3. 检查间隔
|
||
|
||
```
|
||
liveness: 10-30s
|
||
readiness: 5-10s
|
||
startup: 5s
|
||
```
|
||
|
||
### 4. 依赖检查
|
||
|
||
- **liveness:** 不检查依赖(避免雪崩)
|
||
- **readiness:** 检查所有依赖
|
||
- **startup:** 只检查必需依赖
|
||
|
||
---
|
||
|
||
## 🐛 故障排查
|
||
|
||
### 健康检查失败
|
||
|
||
```bash
|
||
# 1. 手动测试端点
|
||
curl -v http://localhost:8000/health
|
||
curl -v http://localhost:8000/ready
|
||
curl -v http://localhost:8000/startup
|
||
|
||
# 2. 查看日志
|
||
docker logs xiaoxia-api
|
||
|
||
# 3. 检查数据库连接
|
||
docker exec xiaoxia-api psql $DATABASE_URL -c "SELECT 1"
|
||
|
||
# 4. 检查 Redis 连接
|
||
docker exec xiaoxia-api redis-cli -u $REDIS_URL ping
|
||
```
|
||
|
||
### Pod 频繁重启
|
||
|
||
```bash
|
||
# 查看 Pod 事件
|
||
kubectl describe pod xiaoxia-api-xxx
|
||
|
||
# 查看探针配置
|
||
kubectl get pod xiaoxia-api-xxx -o yaml | grep -A 10 livenessProbe
|
||
|
||
# 调整探针参数
|
||
kubectl patch deployment xiaoxia-api -p '
|
||
spec:
|
||
template:
|
||
spec:
|
||
containers:
|
||
- name: api
|
||
livenessProbe:
|
||
failureThreshold: 5
|
||
timeoutSeconds: 5
|
||
'
|
||
```
|
||
|
||
---
|
||
|
||
**最后更新:** 2026-06-17
|