# Kubernetes 可观测性完整指南
本指南介绍如何使用已部署的 Prometheus + Grafana + Loki + Tempo 完整可观测性栈。
## 🎯 已部署组件
### Metrics(指标)
- **Prometheus**: http://localhost:30900 - 指标存储和查询
- **Grafana**: http://localhost:30300 - 可视化和仪表盘(默认用户名/密码:admin/admin)
- **Alertmanager**: 告警管理
- **kube-state-metrics**: Kubernetes 对象状态指标
- **node-exporter**: 节点级别系统指标
### Logs(日志)
- **Loki**: 日志存储和查询(在 `logging` namespace)
- **Promtail**: 日志采集(DaemonSet,采集所有 pod 日志)
### Traces(链路追踪)
- **Tempo**: 链路存储和查询(在 `tracing` namespace)
- **OpenTelemetry Collector**: 链路数据采集和转发
## 📊 推荐导入的 Grafana 仪表盘
访问 Grafana (http://localhost:30300),点击左侧菜单 "Dashboards" → "New" → "Import",输入以下 ID:
### 1. 节点监控(Node Exporter)
- **Dashboard ID: 1860** - Node Exporter Full
- 完整的节点级别监控
- CPU、内存、磁盘、网络、文件系统等
### 2. Kubernetes 集群监控
- **Dashboard ID: 15758** - Kubernetes Views Pods
- Pod 级别的资源使用、重启、状态
- 按 namespace 分组查看
- **Dashboard ID: 15757** - Kubernetes Views Namespaces
- Namespace 级别的资源使用
- CPU、内存、网络汇总
- **Dashboard ID: 15759** - Kubernetes Views Nodes
- 节点级别的资源分配和使用
- 容量规划视图
### 3. Kubernetes 详细监控
- **Dashboard ID: 315** - Kubernetes cluster monitoring
- 集群整体健康状况
- Pod、Deployment、StatefulSet 状态
- **Dashboard ID: 13770** - Kubernetes / Views / Global
- 全局视图:所有资源的汇总
### 4. Loki 日志监控
- **Dashboard ID: 13639** - Logs / App
- 应用日志查看和分析
- 支持日志到 trace 的跳转
- **Dashboard ID: 12611** - Loki & Promtail
- Loki 和 Promtail 自身的监控
- 日志采集速率、存储使用
### 5. Tempo 链路追踪监控
- **Dashboard ID: 16110** - Tempo / Operational
- Tempo 自身的运维监控
- Trace 吞吐量、延迟分布
### 6. OpenTelemetry Collector 监控
- **Dashboard ID: 15983** - OpenTelemetry Collector
- OTel Collector 的监控
- 接收器、处理器、导出器指标
## 🔍 使用场景示例
### 场景 1: 查看应用日志
1. 访问 Grafana → Explore
2. 选择数据源:**Loki**
3. 使用查询:
```logql
{namespace="fastapi", pod=~".*"}
```
4. 筛选特定级别日志:
```logql
{namespace="fastapi"} |= "ERROR"
```
### 场景 2: 从日志跳转到 Trace
1. 在 Loki 日志中查找包含 `trace_id` 的日志
2. 点击 trace_id 链接,自动跳转到 Tempo
3. 在 Tempo 中查看完整的调用链路
### 场景 3: 从 Trace 跳转到日志
1. 在 Grafana → Explore 中选择 **Tempo**
2. 搜索 trace(通过 trace ID 或服务名)
3. 在 trace 详情页面,点击 span 上的 "Logs" 按钮
4. 自动跳转到该时间段的相关日志
### 场景 4: 监控 Pod 资源使用
1. 导入 Dashboard ID: 15758
2. 选择 namespace 和 pod
3. 查看 CPU、内存、网络、磁盘 I/O 等指标
4. 发现异常时,点击 "View Logs" 按钮查看日志
### 场景 5: 告警配置
1. 访问 Alertmanager(通过 Prometheus UI)
2. 查看已配置的告警规则
3. 告警触发时会显示在 Grafana 的 Alerting 页面
## 🔧 应用接入指南
### 接入日志(所有应用自动接入)
Promtail 作为 DaemonSet 运行在每个节点,自动采集所有 pod 的日志。
**最佳实践**:
```json
{
"timestamp": "2025-12-16T08:00:00Z",
"level": "INFO",
"message": "Request processed successfully",
"trace_id": "abc123...",
"span_id": "def456...",
"service": "api-service",
"method": "GET",
"path": "/api/users"
}
```
### 接入链路追踪(需要应用代码修改)
#### 方式 1: 使用 OTLP(推荐)
应用发送 traces 到:
```
otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4317 # gRPC
otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4318 # HTTP
```
#### 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
```
#### 方式 2: 使用 Jaeger SDK(向后兼容)
应用发送到:
```
otel-collector-opentelemetry-collector.tracing.svc.cluster.local:14250 # gRPC
otel-collector-opentelemetry-collector.tracing.svc.cluster.local:14268 # HTTP
```
## 📈 告警规则说明
已配置的告警规则(在 `prometheus-alerts.yaml`):
### 节点级别
- **NodeDiskSpaceWarning**: 磁盘空间 < 20%
- **NodeDiskSpaceCritical**: 磁盘空间 < 10%
- **NodeInodeSpaceWarning**: inode < 20%
- **NodeMemoryPressure**: 内存使用 > 85%
- **NodeCPUHigh**: CPU 使用 > 80% 持续 10 分钟
### Pod 级别
- **PodCrashLoopBackOff**: Pod 频繁重启
- **PodPendingTooLong**: Pod Pending > 10 分钟
- **PodMemoryHigh**: 内存使用 > 限制的 90%
- **PodCPUHigh**: CPU 使用 > 限制的 90%
### Workload 级别
- **DeploymentReplicasMismatch**: Deployment 副本数不匹配
- **StatefulSetReplicasMismatch**: StatefulSet 副本数不匹配
- **DaemonSetNotScheduled**: DaemonSet 未完全部署
- **JobFailed**: Job 执行失败
### 可观测性组件
- **PrometheusScrapeFailure**: Prometheus 采集失败
- **LokiLogEntriesDropped**: Loki 日志丢失
## 🚀 应用告警规则
```bash
# 应用告警规则
kubectl apply -f prometheus-alerts.yaml
# 重启 Prometheus 以加载新规则(如果需要)
kubectl rollout restart deployment prometheus -n monitoring
```
## 🔗 关键链接
- **Grafana**: http://localhost:30300 (admin/admin)
- **Prometheus**: http://localhost:30900
- **Grafana 官方仪表盘库**: https://grafana.com/grafana/dashboards/
## 📚 进阶主题
### 1. 配置 Alertmanager 通知
编辑 Alertmanager 配置,添加邮件、Slack、Webhook 等通知渠道。
### 2. 自定义告警规则
在 `prometheus-alerts.yaml` 中添加业务相关的告警规则。
### 3. 优化 Loki 日志查询性能
- 使用 label 过滤而非正则表达式
- 限制查询时间范围
- 使用 `|= "string"` 而非 `|~ "regex"`
### 4. 优化 Tempo 采样率
生产环境建议降低采样率(如 10%)以减少存储开销:
```yaml
# 在应用配置中
sampling:
probability: 0.1 # 10% 采样率
```
### 5. 持久化数据备份
确保定期备份 PVC:
- `loki` namespace 的 `storage-loki-0`
- `tracing` namespace 的 `storage-tempo-0`
## 🐛 故障排查
### Loki 无法查询日志
```bash
# 检查 Promtail 状态
kubectl get pods -n logging
kubectl logs -n logging -l app.kubernetes.io/name=promtail
# 检查 Loki 健康状态
kubectl exec -n logging loki-0 -- wget -q -O- http://localhost:3100/ready
```
### Tempo 无法显示 traces
```bash
# 检查 OTel Collector 状态
kubectl get pods -n tracing
kubectl logs -n tracing -l app.kubernetes.io/name=opentelemetry-collector
# 检查应用是否正确发送 traces
kubectl logs | grep -i trace
```
### Grafana 数据源连接失败
```bash
# 检查网络连通性
kubectl exec -n monitoring -- wget -q -O- http://loki.logging.svc.cluster.local:3100/ready
kubectl exec -n monitoring -- wget -q -O- http://tempo.tracing.svc.cluster.local:3200/ready
```
## 🎓 学习资源
- [Prometheus 查询语言 (PromQL)](https://prometheus.io/docs/prometheus/latest/querying/basics/)
- [LogQL (Loki 查询语言)](https://grafana.com/docs/loki/latest/query/)
- [OpenTelemetry 文档](https://opentelemetry.io/docs/)
- [Grafana 官方文档](https://grafana.com/docs/grafana/latest/)
---
**部署完成时间**: 2025-12-16
**维护者**: Claude Code
**版本**: v1.0