經過前六天的修煉,我們已經建立了完整的微服務王國和 OpenTelemetry Collector 中央神經系統。今天,我們要為這個神經系統連接「記憶庫」!就像人腦需要長期記憶來完整理解世界一樣,我們的可觀測性系統也需要 Loki(日誌存儲)來完整保存和分析系統行為。今天我們將建構從 Fluent Bit → OTel Collector → Loki 的完整日誌數據流!
✅ 理解 OTel Collector 作為日誌數據中繼站的核心價值
✅ 掌握 Loki 作為雲原生日誌存儲的設計理念
✅ 實戰配置 OTel Collector → Loki 的數據管道
✅ 建立結構化日誌的查詢和分析能力
🔴 直接連接的痛點
# 傳統做法:各自為政
Fluent Bit → Loki (Service A)
Fluent Bit → Loki (Service B)
Fluent Bit → Loki (Service C)
# 😵 問題:
# 1. 配置重複:每個 Fluent Bit 都要配置 Loki 連接
# 2. 格式不統一:不同服務的日誌格式可能不一致
# 3. 難以擴展:要改 Loki 配置需要重啟所有 Fluent Bit
# 4. 缺乏智能路由:無法根據內容動態分發
🟢 OTel Collector 中繼的優勢
# 現代做法:統一指揮
Fluent Bit → OTel Collector → Loki
↓
統一處理中心
- 統一格式化
- 統一配置的路由規則
- 批次優化
- 錯誤重試
📱 Application Logs
↓ (JSON format)
🔄 Fluent Bit Sidecar
↓ (Fluent Forward Protocol)
🧠 OpenTelemetry Collector
↓ (OTLP/HTTP + 統一處理)
🗄️ Loki Storage
↓ (LogQL queries)
📊 Grafana Visualization
資料夾結構
└── observability
├── grafana
│ ├── devspace.yaml
│ ├── grafana-config.yaml
│ └── grafana-deployment.yaml
├── loki
│ ├── devspace.yaml
│ ├── loki-config.yaml
│ └── loki-deployment.yaml
└── otel-collector
├── devspace.yaml
├── otel-collector-deployment.yaml
└── otel-config.yaml
📝 更新 otel-config.yaml
# observability/otel-collector/otel-config.yaml
# 🎯 輸出器配置 - 新增 Loki 支持
exporters:
# 🗄️ Loki 日誌輸出 - 新增核心功能
otlphttp/logs:
endpoint: "http://loki:3100/otlp"
tls:
insecure: true
# 🎭 服務管道配置
service:
# 📊 指標管道 - OTLP 數據
pipelines:
# 📝 日誌管道 - Fluent Bit → Loki
logs:
receivers: [fluentforward, otlp]
processors: [memory_limiter, resource, attributes, batch]
exporters: [debug, otlphttp/logs]
📊 更新 loki-config.yaml
# Day24/observability/loki/loki-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: loki-config
namespace: ecommerce
data:
loki.yaml: |
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-05-15
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
limits_config:
discover_log_levels: true
allow_structured_metadata: true
max_label_names_per_series: 30
volume_enabled: true
metric_aggregation_enabled: true
就依序能在 loki
和 grafana
建立好 deployment, config, service 等 k8s 資源後。再把各自的 devspace.yaml
寫完各自測試。
最後再來更新根目錄的devspace.yaml
# day24/devspace.yaml
# 依賴關係配置
dependencies:
database:
path: ./database
user-service:
path: ./user-service
order-service:
path: ./order-service
# 🔍 可觀測性基礎設施層
loki:
path: ./observability/loki
otel-collector:
path: ./observability/otel-collector
grafana:
path: ./observability/grafana
dev:
loki:
labelSelector:
app: loki
ports:
- port: "3100:3100" # OTLP gRPC
logs:
enabled: true
grafana:
labelSelector:
app: grafana
ports:
- port: "3000:3000" # Grafana Web UI
logs:
enabled: true
commands:
# 🎨 可觀測性相關命令
open-o11y:
command: |
echo "🎨 開啟可觀測性界面..."
echo "📊 Grafana: http://localhost:3000 (admin/admin123)"
echo "🔍 Loki: http://localhost:3100"
echo "🌐 OTel Collector: http://localhost:4318"
open http://localhost:3000 2>/dev/null || echo "請手動開啟 Grafana: http://localhost:3000"
🎯 啟動完整系統
# 啟動系統
devspace dev --debug
# 啟動 devspace Web UI
devspace ui
完成後,所有服務都成功啟動!
接著開啟localhost:3000
打開 Grafana WEB UI
就能看見預先設定好的Loki Datasource
接著能輸入 {k8s_cluster_name="ecommerce-cluster"}
選擇我們這演示的 k8s cluster name,就能看見application所產生的log了。
🎉 今日成就解鎖
晉升 ✅ 數據流大師 - 建立了完整的 Fluent Bit → OTel Collector → Loki 數據管道
有興趣能陸續把 Prometheus、Tempo 按照這樣的方式搭建起來。然後一鍵devspace dev
就能完整啟動整個系統包含 o11y 服務。