Crater服务容器健康检查:Docker与Kubernetes配置
容器化部署架构概述
Crater作为开源发票管理系统,其容器化部署涉及多服务协同工作。当前架构基于Docker Compose实现,包含四大核心服务组件:应用服务(app)、数据库服务(db)、Web服务(nginx)和定时任务服务(cron)。各组件通过bridge网络crater实现通信,数据持久化通过命名卷db实现。
服务组件关系图
Docker健康检查实现
应用服务健康检查配置
在Docker Compose配置中为app服务添加健康检查机制,通过PHP内置服务器验证应用可用性:
services:
app:
# 现有配置...
healthcheck:
test: ["CMD", "php", "-S", "localhost:8000", "-t", "public"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
配置解析:
- 测试命令:启动临时PHP开发服务器验证应用入口文件可访问性
- 检测周期:每30秒执行一次健康检查
- 启动等待期:60秒启动缓冲,适应应用初始化过程
数据库服务健康检查配置
为MariaDB添加内置健康检查,验证数据库连接可用性:
services:
db:
# 现有配置...
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$MYSQL_USER", "-p$MYSQL_PASSWORD"]
interval: 15s
timeout: 5s
retries: 5
完整配置文件参考
修改后的docker-compose.yml实现了多服务健康检查联动,确保依赖服务就绪后才标记整体健康。
Kubernetes部署扩展
Deployment健康检查配置
将Docker Compose健康检查迁移至K8s部署清单,实现更精细的容器生命周期管理:
apiVersion: apps/v1
kind: Deployment
metadata:
name: crater-app
spec:
template:
spec:
containers:
- name: app
image: gitcode.com/gh_mirrors/cr/crater:latest
livenessProbe:
httpGet:
path: /api/health
port: 8000
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /api/ready
port: 8000
initialDelaySeconds: 20
periodSeconds: 10
startupProbe:
httpGet:
path: /api/startup
port: 8000
failureThreshold: 30
periodSeconds: 10
健康检查接口实现
创建专用健康检查控制器HealthController.php:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class HealthController extends Controller
{
public function health()
{
return response()->json(['status' => 'ok']);
}
public function ready()
{
try {
DB::connection()->getPdo();
return response()->json(['status' => 'ready']);
} catch (\Exception $e) {
return response()->json(['status' => 'not ready'], 503);
}
}
public function startup()
{
// 检查关键配置是否加载完成
if (config('app.key')) {
return response()->json(['status' => 'started']);
}
return response()->json(['status' => 'starting'], 503);
}
}
添加路由配置至routes/api.php:
Route::get('/health', [HealthController::class, 'health']);
Route::get('/ready', [HealthController::class, 'ready']);
Route::get('/startup', [HealthController::class, 'startup']);
监控与告警集成
Prometheus指标暴露
通过laravel-prometheus扩展暴露健康指标:
// 在HealthController中添加
public function metrics()
{
$health = DB::connection()->getPdo() ? 1 : 0;
return response("crater_health_status $health")->header('Content-Type', 'text/plain');
}
Grafana监控面板
配置关键指标监控面板,包含:
- 容器重启次数
- 健康检查成功率
- 数据库连接延迟
- API响应时间分布
最佳实践与常见问题
健康检查优化策略
-
分层检查设计:
- 存活探针:检查应用进程状态
- 就绪探针:验证依赖服务可用性
- 启动探针:适应长启动时间场景
-
资源限制协同: 确保健康检查超时时间大于资源限制导致的响应延迟,避免误判。
-
检查频率调优:
- 核心服务:15-30秒检查间隔
- 非关键服务:60-120秒检查间隔
常见故障排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 健康检查频繁失败 | 启动时间不足 | 增加start_period配置 |
| 数据库连接超时 | 资源竞争 | 优化数据库连接池配置 |
| 间歇性健康检查失败 | 网络波动 | 增加retries参数值 |
部署验证与维护
手动健康检查命令
# 验证应用服务健康状态
docker exec -it crater_app_1 curl -f http://localhost:8000/api/health
# 检查数据库连接
docker exec -it crater_db_1 mysqladmin ping -ucrater -pcrater
自动化部署验证
集成健康检查状态至CI/CD流程,在.github/workflows/deploy.yml中添加:
jobs:
deploy:
steps:
# 部署步骤...
- name: Verify health status
run: |
curl --retry 10 --retry-delay 5 -f http://localhost/api/health
通过以上配置,Crater服务实现了从Docker到Kubernetes环境的完整健康检查体系,提升了系统部署可靠性与运维效率。建议定期审查健康检查指标,根据实际运行状况优化参数配置。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



