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

8.7 KiB
Raw Permalink Blame History

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. 使用查询:
    {namespace="fastapi", pod=~".*"}
    
  4. 筛选特定级别日志:
    {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 的日志。

最佳实践:

{
  "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) 示例

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 示例

# application.yml
management:
  otlp:
    tracing:
      endpoint: http://otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4318/v1/traces
  tracing:
    sampling:
      probability: 1.0  # 采样率 100%(生产环境建议降低)
<!-- pom.xml -->
<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
    <version>2.9.0</version>
</dependency>

方式 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 日志丢失

🚀 应用告警规则

# 应用告警规则
kubectl apply -f prometheus-alerts.yaml

# 重启 Prometheus 以加载新规则(如果需要)
kubectl rollout restart deployment prometheus -n monitoring

🔗 关键链接

📚 进阶主题

1. 配置 Alertmanager 通知

编辑 Alertmanager 配置,添加邮件、Slack、Webhook 等通知渠道。

2. 自定义告警规则

在 prometheus-alerts.yaml 中添加业务相关的告警规则。

3. 优化 Loki 日志查询性能

  • 使用 label 过滤而非正则表达式
  • 限制查询时间范围
  • 使用 |= "string" 而非 |~ "regex"

4. 优化 Tempo 采样率

生产环境建议降低采样率(如 10%)以减少存储开销:

# 在应用配置中
sampling:
  probability: 0.1  # 10% 采样率

5. 持久化数据备份

确保定期备份 PVC:

  • loki namespace 的 storage-loki-0
  • tracing namespace 的 storage-tempo-0

🐛 故障排查

Loki 无法查询日志

# 检查 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

# 检查 OTel Collector 状态
kubectl get pods -n tracing
kubectl logs -n tracing -l app.kubernetes.io/name=opentelemetry-collector

# 检查应用是否正确发送 traces
kubectl logs <your-app-pod> | grep -i trace

Grafana 数据源连接失败

# 检查网络连通性
kubectl exec -n monitoring <grafana-pod> -- wget -q -O- http://loki.logging.svc.cluster.local:3100/ready
kubectl exec -n monitoring <grafana-pod> -- wget -q -O- http://tempo.tracing.svc.cluster.local:3200/ready

🎓 学习资源


部署完成时间: 2025-12-16 维护者: Claude Code 版本: v1.0