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

12 KiB
Raw Permalink Blame History

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. 验证部署状态

./verify-observability.sh

2. 访问 Grafana

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)

# 查看所有日志
{namespace=~".+"}

# 查看特定应用日志
{namespace="fastapi", pod=~".*"}

# 查看错误日志
{namespace="fastapi"} |= "ERROR"

# 从日志跳转到 trace(如果日志包含 trace_id)
{namespace="fastapi"} | json | trace_id != ""

5. 访问 Prometheus

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):

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

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>

⚠️ 告警规则

已配置 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               # 部署总结

🔍 故障排查

查看组件状态

# 运行验证脚本
./verify-observability.sh

# 手动检查
kubectl get pods -n monitoring
kubectl get pods -n logging
kubectl get pods -n tracing

Loki 无法查询日志

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

# 检查 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 <your-app-pod> | grep -i trace

Grafana 数据源连接失败

# 重启 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

📚 学习资源

🎯 下一步

  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