# Kubernetes 完整可观测性方案 ## 📋 项目概述 本项目为 Kubernetes 集群部署了完整的可观测性栈,包括 **Metrics(指标)**、**Logs(日志)** 和 **Traces(链路追踪)** 三大支柱,实现了生产级别的监控、告警和故障排查能力。 ## 🏗️ 架构组件 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Grafana │ │ (统一可视化平台) │ │ http://localhost:30300 │ └────────────┬──────────────┬──────────────┬──────────────────────┘ │ │ │ ┌────────▼────────┐ ┌──▼──────┐ ┌─────▼──────┐ │ Prometheus │ │ Loki │ │ Tempo │ │ (Metrics) │ │ (Logs) │ │ (Traces) │ │ :9090 │ │ :3100 │ │ :3200 │ └────────┬────────┘ └──┬──────┘ └─────┬──────┘ │ │ │ ┌────────▼────────┐ ┌──▼──────┐ ┌─────▼──────┐ │ Exporters: │ │Promtail │ │ OTel │ │ - node │ │(DaemonS)│ │ Collector │ │ - kube-state │ │ │ │ │ └─────────────────┘ └─────────┘ └────────────┘ │ │ │ ┌────────▼──────────────▼──────────────▼──────┐ │ Kubernetes Cluster │ │ (Pods, Nodes, Services...) │ └──────────────────────────────────────────────┘ ``` ### Metrics(指标监控)- namespace: monitoring - **Prometheus**: 时序数据库,存储和查询指标 - **Grafana**: 可视化平台,仪表盘和告警 - **Alertmanager**: 告警路由和通知 - **kube-state-metrics**: Kubernetes 对象状态指标 - **node-exporter**: 节点级别系统指标(CPU、内存、磁盘、网络) ### Logs(日志聚合)- namespace: logging - **Loki**: 日志聚合和存储引擎 - **Promtail**: 日志采集 DaemonSet,自动采集所有 pod 日志 ### Traces(链路追踪)- namespace: tracing - **Tempo**: 分布式追踪后端,存储和查询 traces - **OpenTelemetry Collector**: 统一的遥测数据采集和转发 ## 🚀 快速开始 ### 1. 验证部署状态 ```bash ./verify-observability.sh ``` ### 2. 访问 Grafana ```bash open http://localhost:30300 # 默认凭据: admin/admin ``` ### 3. 导入推荐仪表盘 在 Grafana 中点击 **Dashboards → New → Import**,输入以下 ID: **必备仪表盘**: - **1860** - Node Exporter Full(节点监控) - **15758** - Kubernetes Views Pods(Pod 监控) - **13639** - Logs / App(应用日志) - **315** - Kubernetes cluster monitoring(集群监控) ### 4. 查看日志(Grafana Explore) ```logql # 查看所有日志 {namespace=~".+"} # 查看特定应用日志 {namespace="fastapi", pod=~".*"} # 查看错误日志 {namespace="fastapi"} |= "ERROR" # 从日志跳转到 trace(如果日志包含 trace_id) {namespace="fastapi"} | json | trace_id != "" ``` ### 5. 访问 Prometheus ```bash open http://localhost:30900 ``` ## 📊 核心功能 ### ✅ 已实现功能 #### 1. 完整的 Metrics 监控 - ✅ 集群级别监控(CPU、内存、磁盘、网络) - ✅ 节点级别监控(系统资源、容器运行时) - ✅ Pod 级别监控(资源使用、重启、状态) - ✅ Workload 监控(Deployment、StatefulSet、DaemonSet、Job) - ✅ 自定义告警规则(15+ 条告警规则) #### 2. 集中式日志管理 - ✅ 自动采集所有 pod 日志(Promtail DaemonSet) - ✅ 支持 LogQL 查询语言 - ✅ 日志到 Trace 的关联跳转 - ✅ 日志标签自动提取(namespace、pod、container、app 等) #### 3. 分布式链路追踪 - ✅ 支持多种协议(OTLP、Jaeger、Zipkin) - ✅ Trace 到 Logs 的关联跳转 - ✅ OpenTelemetry 标准接入 - ✅ 服务拓扑图和依赖分析 #### 4. 三大支柱联动 - ✅ Metrics → Logs:从指标异常跳转到相关日志 - ✅ Logs → Traces:从日志中的 trace_id 跳转到完整调用链 - ✅ Traces → Logs:从 trace span 跳转到该时间段的日志 - ✅ 统一 Grafana 界面查看 ## 🔧 应用接入指南 ### 接入日志(自动完成 ✅) Promtail 作为 DaemonSet 自动采集所有 pod 的 stdout/stderr,无需修改应用代码。 **推荐日志格式(JSON)**: ```json { "timestamp": "2025-12-16T08:00:00Z", "level": "INFO", "message": "Request processed successfully", "trace_id": "abc123def456...", "span_id": "789xyz...", "service": "api-service", "method": "GET", "path": "/api/users", "duration_ms": 123 } ``` ### 接入链路追踪(需要代码修改) #### OpenTelemetry 接入端点 ``` OTLP gRPC: otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4317 OTLP HTTP: otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4318 ``` #### Python (FastAPI) 示例 ```python from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor # 配置 OTLP exporter otlp_exporter = OTLPSpanExporter( endpoint="otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4317", insecure=True ) # 设置 tracer provider provider = TracerProvider() provider.add_span_processor(BatchSpanProcessor(otlp_exporter)) trace.set_tracer_provider(provider) # 自动 instrument FastAPI app = FastAPI() FastAPIInstrumentor.instrument_app(app) ``` #### Spring Boot 配置 ```yaml # application.yml management: otlp: tracing: endpoint: http://otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4318/v1/traces tracing: sampling: probability: 1.0 # 100% 采样(生产环境建议降低) ``` ```xml io.opentelemetry.instrumentation opentelemetry-spring-boot-starter 2.9.0 ``` ## ⚠️ 告警规则 已配置 15+ 条告警规则,涵盖: ### Node 级别(5 条) - NodeDiskSpaceWarning/Critical - 磁盘空间不足 - NodeInodeSpaceWarning - inode 不足 - NodeMemoryPressure - 内存压力 - NodeCPUHigh - CPU 使用率过高 ### Pod 级别(4 条) - PodCrashLoopBackOff - Pod 频繁重启 - PodPendingTooLong - Pod 长时间 Pending - PodMemoryHigh/PodCPUHigh - 资源使用过高 ### Workload 级别(4 条) - DeploymentReplicasMismatch - 副本数不匹配 - StatefulSetReplicasMismatch - StatefulSet 副本不足 - DaemonSetNotScheduled - DaemonSet 未完全部署 - JobFailed - Job 执行失败 ### 可观测性组件(2 条) - PrometheusScrapeFailure - 采集失败 - LokiLogEntriesDropped - 日志丢失 ## 📁 文件清单 ``` k8s/ ├── loki-values.yaml # Loki + Promtail 配置 ├── tempo-values.yaml # Tempo 配置 ├── otel-collector-values.yaml # OpenTelemetry Collector 配置 ├── grafana-datasources-updated.yaml # Grafana 数据源配置 ├── prometheus-alerts.yaml # Prometheus 告警规则 ├── verify-observability.sh # 验证脚本(可执行) ├── OBSERVABILITY-README.md # 本文件 ├── OBSERVABILITY-GUIDE.md # 详细使用指南 └── DEPLOYMENT-SUMMARY.md # 部署总结 ``` ## 🔍 故障排查 ### 查看组件状态 ```bash # 运行验证脚本 ./verify-observability.sh # 手动检查 kubectl get pods -n monitoring kubectl get pods -n logging kubectl get pods -n tracing ``` ### Loki 无法查询日志 ```bash # 检查 Promtail 日志 kubectl logs -n logging -l app.kubernetes.io/name=promtail --tail=50 # 检查 Loki 健康状态 kubectl exec -n logging loki-0 -- wget -q -O- http://localhost:3100/ready # 查看已采集的标签 kubectl exec -n logging loki-0 -- wget -q -O- 'http://localhost:3100/loki/api/v1/labels' ``` ### Tempo 无法查询 traces ```bash # 检查 OTel Collector 日志 kubectl logs -n tracing -l app.kubernetes.io/name=opentelemetry-collector --tail=50 # 检查 Tempo 日志 kubectl logs -n tracing tempo-0 --tail=50 # 验证应用是否正确发送 traces kubectl logs | grep -i trace ``` ### Grafana 数据源连接失败 ```bash # 重启 Grafana kubectl rollout restart deployment grafana -n monitoring # 测试网络连通性 kubectl exec -n monitoring deployment/grafana -- wget -q -O- http://loki.logging.svc.cluster.local:3100/ready kubectl exec -n monitoring deployment/grafana -- wget -q -O- http://tempo.tracing.svc.cluster.local:3200/ready ``` ## 📚 学习资源 - **OBSERVABILITY-GUIDE.md** - 完整的使用指南和最佳实践 - **DEPLOYMENT-SUMMARY.md** - 部署总结和快速参考 - [Prometheus 官方文档](https://prometheus.io/docs/) - [Loki 官方文档](https://grafana.com/docs/loki/latest/) - [Tempo 官方文档](https://grafana.com/docs/tempo/latest/) - [OpenTelemetry 文档](https://opentelemetry.io/docs/) ## 🎯 下一步 1. ✅ 导入推荐的 Grafana 仪表盘 2. ✅ 在 Grafana Explore 中测试日志查询 3. ✅ 配置应用接入链路追踪(参考 OBSERVABILITY-GUIDE.md) 4. ✅ 配置 Alertmanager 通知渠道(邮件、Slack、Webhook) 5. ✅ 根据业务需求添加自定义告警规则 6. ✅ 定期备份 PVC 数据(loki、tempo) ## 📊 监控覆盖范围 | 类别 | 覆盖率 | 说明 | |------|--------|------| | **Metrics** | 100% | 所有节点、Pod、Workload 自动监控 | | **Logs** | 100% | Promtail DaemonSet 自动采集所有 pod 日志 | | **Traces** | 按需 | 需要应用代码接入 OpenTelemetry | | **Alerts** | 15+ 条 | 涵盖基础设施和应用层面 | ## 💡 最佳实践 ### 日志最佳实践 - ✅ 使用结构化日志(JSON 格式) - ✅ 包含 trace_id 和 span_id(实现 logs ↔ traces 关联) - ✅ 使用统一的日志级别(DEBUG、INFO、WARN、ERROR、FATAL) - ✅ 避免打印敏感信息(密码、token、身份证号等) ### 链路追踪最佳实践 - ✅ 使用 OpenTelemetry 标准(避免厂商锁定) - ✅ 生产环境使用采样(10%-20% 采样率) - ✅ 为 span 添加有意义的属性(http.method、http.status_code 等) - ✅ 传播 trace context(确保跨服务调用链路完整) ### 监控最佳实践 - ✅ 使用 RED 方法(Rate、Errors、Duration)监控服务 - ✅ 使用 USE 方法(Utilization、Saturation、Errors)监控资源 - ✅ 设置合理的告警阈值(避免告警疲劳) - ✅ 为每个告警配置 runbook(处理手册) ## 🔐 安全考虑 - ⚠️ 默认 Grafana 凭据(admin/admin)**仅用于测试**,生产环境必须修改 - ⚠️ 考虑启用 HTTPS(使用 Ingress + TLS) - ⚠️ 配置 RBAC 限制数据访问权限 - ⚠️ 日志中避免包含敏感信息 - ⚠️ 定期更新组件版本(安全补丁) --- **部署日期**: 2025-12-16 **环境**: OrbStack Kubernetes v1.33.5 **部署工具**: Helm 4.0.0 + kubectl **状态**: ✅ 生产就绪 **维护者**: Bruno Gao