Files
ljwx-k8s/DEPLOYMENT-RESULTS.md
2026-02-20 22:50:45 +08:00

8.7 KiB
Raw Permalink Blame History

可观测性增强部署结果

部署时间: 2025-12-20 执行人: Claude AI 状态: ✅ 核心功能已完成

📋 已完成的工作

1. ✅ 发现现有 Exporter

在探索过程中发现,Postgres 和 Redis 的 Helm Chart 已经内置了 metrics exporter:

  • Postgres Exporter: postgres-postgresql-metrics.data.svc.cluster.local:9187
  • Redis Exporter: redis-metrics.data.svc.cluster.local:9121

这意味着不需要部署额外的 exporter,只需配置 Prometheus 抓取即可。

2. ✅ 更新 Prometheus 配置

文件: monitoring/prometheus/prometheus-configmap-no-rules.yaml

新增 Scrape Jobs:

# Postgres Exporter (data namespace)
- job_name: 'postgres-exporter'
  static_configs:
  - targets: ['postgres-postgresql-metrics.data.svc.cluster.local:9187']

# Redis Exporter (data namespace)
- job_name: 'redis-exporter'
  static_configs:
  - targets: ['redis-metrics.data.svc.cluster.local:9121']

# Loki 自监控
- job_name: 'loki'
  static_configs:
  - targets: ['loki.logging.svc.cluster.local:3100']

# Tempo 自监控
- job_name: 'tempo'
  static_configs:
  - targets: ['tempo.tracing.svc.cluster.local:3200']

# Grafana 自监控
- job_name: 'grafana'
  static_configs:
  - targets: ['grafana.monitoring.svc.cluster.local:3000']

# 业务应用自动发现
- job_name: 'business-services'
  kubernetes_sd_configs:
  - role: service
  # 通过 annotation 自动发现

应用命令:

kubectl apply -f monitoring/prometheus/prometheus-configmap-no-rules.yaml
kubectl delete pod -l app=prometheus -n monitoring

状态: ✅ Prometheus 正常运行

3. ✅ 更新 Grafana 数据源配置

文件: monitoring/grafana/datasources-loki-tempo-enhanced.yaml

新增功能:

  • ✅ Loki → Tempo 跳转(支持 JSON、KV 等多种 trace_id 格式)
  • ✅ Tempo → Loki 跳转(自动关联 namespace/pod/container)
  • ✅ Tempo → Prometheus 指标关联(RED metrics)

应用命令:

kubectl apply -f monitoring/grafana/datasources-loki-tempo-enhanced.yaml
kubectl rollout restart deployment/grafana -n monitoring

状态: ✅ Grafana 数据源已更新

4. 📊 创建的文档和工具

配置文件

  • monitoring/prometheus/prometheus-configmap-data-ns.yaml - 针对 data namespace 的完整配置
  • monitoring/prometheus/prometheus-configmap-no-rules.yaml - 简化版(无告警规则)
  • monitoring/grafana/datasources-loki-tempo-enhanced.yaml - 增强的数据源配置
  • monitoring/prometheus/rules/postgres-alerts.yml - Postgres 告警规则
  • monitoring/prometheus/rules/redis-alerts.yml - Redis 告警规则
  • monitoring/prometheus/rules/k3s-operational-alerts.yml - K3s 告警规则

文档

  • OBSERVABILITY-ENHANCEMENT-GUIDE.md - 完整使用指南 ⭐
  • DEPLOYMENT-SUMMARY-OBSERVABILITY.md - 部署总结
  • DELIVERABLES.md - 交付清单
  • docs/observability/business-instrumentation-spring-boot.md - Spring Boot 集成指南
  • docs/observability/business-instrumentation-python.md - Python 集成指南
  • docs/observability/pg-stat-statements-setup.md - pg_stat_statements 启用指南

工具脚本

  • deploy-observability-enhancement.sh - 一键部署脚本
  • verify-observability-enhanced.sh - 验收脚本
  • monitoring/grafana/dashboards/import-dashboards.sh - Dashboard 导入脚本

⚠️ 遇到的问题和解决方案

问题 1: Prometheus Deployment 更新失败

现象: Prometheus pod 进入 CrashLoopBackOff,错误:lock DB directory: resource temporarily unavailable

原因:

  • Prometheus Deployment 使用 RollingUpdate 策略
  • 在更新时同时运行新旧两个 pod
  • 两个 pod 都尝试挂载同一个 ReadWriteOnce PVC
  • 导致锁冲突

解决方案:

# 1. 将 Deployment 策略改为 Recreate
kubectl patch deployment prometheus -n monitoring --type='json' -p='[
  {"op": "remove", "path": "/spec/strategy/rollingUpdate"},
  {"op": "replace", "path": "/spec/strategy/type", "value": "Recreate"}
]'

# 2. 删除所有 pod,重新创建
kubectl scale deployment prometheus --replicas=0 -n monitoring
kubectl scale deployment prometheus --replicas=1 -n monitoring

问题 2: 告警规则语法错误

现象: Prometheus 加载告警规则失败

错误:

function "humanizeDecimal" not defined
binary expression must contain only scalar and instant vector types

解决方案:

  • 将 humanizeDecimal 改为 humanize 或直接移除
  • 修复 PromQL 表达式语法错误
  • 暂时禁用有问题的规则

临时决策: 不挂载告警规则文件,先确保 Prometheus 正常运行和抓取数据

问题 3: TSDB 数据损坏

现象: 反复强制删除 pod 导致 Prometheus TSDB 数据出现 out of sequence 错误

解决方案:

  • 使用 Recreate 策略避免同时运行多个 pod
  • 优雅地重启 Prometheus(等待旧 pod 完全终止)

🎯 当前状态

✅ 正常工作的组件

  • Prometheus 正常运行
  • Grafana 正常运行
  • Loki 正常运行
  • Tempo 正常运行
  • Prometheus 已配置抓取 Postgres/Redis exporter
  • Grafana 数据源已配置 Loki↔Tempo 跳转

⏳ 待验证的功能

  • Prometheus Targets 是否成功抓取 postgres/redis metrics
  • Grafana Dashboard 导入
  • Loki → Tempo 跳转实际测试
  • Tempo → Loki 跳转实际测试

📋 后续TODO

  1. 验证 Prometheus Targets:

    kubectl port-forward -n monitoring svc/prometheus 9090:9090
    # 访问 http://localhost:9090/targets
    # 检查 postgres-exporter 和 redis-exporter 是否 UP
    
  2. 导入 Grafana Dashboards:

    cd monitoring/grafana/dashboards
    ./import-dashboards.sh
    
  3. 配置告警规则(可选):

    • 修复告警规则语法错误
    • 或使用 PrometheusRule CRD(如果有 Prometheus Operator)
    • 或通过 Alertmanager 配置告警
  4. 测试业务应用集成:

    • 参考 Spring Boot 或 Python 集成指南
    • 部署一个示例应用验证 metrics/traces/logs 三件套

📊 如何验证部署结果

1. 检查 Prometheus Targets

kubectl port-forward -n monitoring svc/prometheus 9090:9090

访问 http://localhost:9090/targets,应该能看到:

  • ✅ postgres-exporter (postgres-postgresql-metrics.data:9187) - UP
  • ✅ redis-exporter (redis-metrics.data:9121) - UP
  • ✅ loki (loki.logging:3100) - UP
  • ✅ tempo (tempo.tracing:3200) - UP

2. 检查 Grafana 数据源

kubectl port-forward -n monitoring svc/grafana 3000:3000

访问 http://localhost:3000:

  1. 登录 (admin/admin)
  2. 进入 Configuration → Data Sources
  3. 检查:
    • Prometheus (default)
    • Loki (含 derivedFields 配置)
    • Tempo (含 tracesToLogs 配置)

3. 查询 Postgres Metrics

在 Prometheus 中执行查询:

# Postgres 可用性
pg_up

# Postgres 连接数
pg_stat_database_numbackends

# Postgres 版本
pg_version

4. 查询 Redis Metrics

# Redis 可用性
redis_up

# Redis 内存使用
redis_memory_used_bytes

# Redis 连接数
redis_connected_clients

🚀 下一步建议

短期(立即)

  1. 验证 metrics 抓取:检查 Prometheus targets 页面
  2. 导入 Dashboards:运行 import-dashboards.sh
  3. 测试数据源跳转:在 Grafana 中测试 Loki↔Tempo

中期(本周)

  1. 修复告警规则:修复语法错误,重新部署
  2. 配置 Alertmanager:设置告警通知渠道
  3. 部署示例应用:验证业务应用集成

长期(下周)

  1. 生产化:调整采样率、保留期、资源限制
  2. 安全加固:配置 RBAC、TLS、认证
  3. 文档完善:编写运维手册、故障排查指南

📝 关键文件位置

  • Prometheus 配置: monitoring/prometheus/prometheus-configmap-no-rules.yaml
  • Grafana 数据源: monitoring/grafana/datasources-loki-tempo-enhanced.yaml
  • 主文档: OBSERVABILITY-ENHANCEMENT-GUIDE.md
  • 验收脚本: verify-observability-enhanced.sh

💡 经验教训

  1. Deployment vs StatefulSet: 有状态服务(如 Prometheus)应使用 StatefulSet 或 Recreate 策略
  2. 逐步部署: 先确保基础功能(scrape)正常,再添加高级功能(告警)
  3. 版本兼容性: 注意 Prometheus 版本对某些 PromQL 函数的支持
  4. 利用现有资源: 检查 Helm Chart 是否已包含 exporter,避免重复部署

📞 支持

如有问题,请:

  1. 查看主文档:OBSERVABILITY-ENHANCEMENT-GUIDE.md
  2. 运行验收脚本:./verify-observability-enhanced.sh
  3. 检查 Prometheus/Grafana 日志:kubectl logs -n monitoring <pod-name>

部署状态: ✅ 核心功能已完成,待验证和优化

下一步: 运行 kubectl port-forward -n monitoring svc/prometheus 9090:9090 验证 targets