iT邦幫忙

2025 iThome 鐵人賽

DAY 27
2
DevOps

賢者大叔的容器修煉手札系列 第 27

可觀測性 Log 的組合:OTel → Loki 數據流建構 🏗️📊

  • 分享至 

  • xImage
  •  

賢者大叔的容器修煉手札 第 27 篇

可觀測性 Log 的組合:OTel → Loki 數據流建構 🏗️📊

經過前六天的修煉,我們已經建立了完整的微服務王國和 OpenTelemetry Collector 中央神經系統。今天,我們要為這個神經系統連接「記憶庫」!就像人腦需要長期記憶來完整理解世界一樣,我們的可觀測性系統也需要 Loki(日誌存儲)來完整保存和分析系統行為。今天我們將建構從 Fluent Bit → OTel Collector → Loki 的完整日誌數據流!

🎯 今日學習目標

✅ 理解 OTel Collector 作為日誌數據中繼站的核心價值

✅ 掌握 Loki 作為雲原生日誌存儲的設計理念

✅ 實戰配置 OTel Collector → Loki 的數據管道

✅ 建立結構化日誌的查詢和分析能力

🧠 為什麼需要 OTel Collector 作為中繼?#直接 Fluent Bit → 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 Collector 配置升級:新增 Loki Exporter

📝 更新 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 配置優化:針對 OTel 數據流

📊 更新 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

🎮 DevSpace 統一管理更新

就依序能在 lokigrafana 建立好 deployment, config, service 等 k8s 資源後。再把各自的 devspace.yaml 寫完各自測試。
最後再來更新根目錄的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

完成後,所有服務都成功啟動!
https://ithelp.ithome.com.tw/upload/images/20250911/20104930NUWryTVE1F.png

接著開啟localhost:3000 打開 Grafana WEB UI
就能看見預先設定好的Loki Datasource 接著能輸入 {k8s_cluster_name="ecommerce-cluster"}
選擇我們這演示的 k8s cluster name,就能看見application所產生的log了。
https://ithelp.ithome.com.tw/upload/images/20250911/20104930UevUTExnyp.png

總結

🎉 今日成就解鎖
晉升 ✅ 數據流大師 - 建立了完整的 Fluent Bit → OTel Collector → Loki 數據管道

有興趣能陸續把 Prometheus、Tempo 按照這樣的方式搭建起來。然後一鍵devspace dev 就能完整啟動整個系統包含 o11y 服務。


上一篇
DevSpace 統一指揮:一鍵啟動完整可觀測性微服務平台 🎯🚀
下一篇
OpenTelemetry Collector 的 KinD 測試實戰:從本地開發到 CI/CD Pipeline 🧪🚀
系列文
賢者大叔的容器修煉手札30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言