流量鏡像 (Traffic Shadowing) 作為一種進階的流量管理技術,主要用於測試和確保系統的穩定性和性能。

其核心概念為將線上生產環境的真實流量複製一份,並發送到另個獨立運作的平行測試環境中進行相關驗證,而不影響生產環境的運作。
由於測試副本中的服務會獨立處理這些流量,不會影響線上服務的正常運行 (需確保測試副本與生產環境兩者皆為獨立)。

主要實踐步驟包括:

  • 流量捕捉:在生產環境的數據傳輸點(如 API 端點)捕捉出站和入站的流量。
  • 流量複製:複製捕捉到的流量,並將其導向到一個或多個測試副本。
  • 平行處理:測試副本接收和處理這些複製的流量,就如同處理真實流量一樣,但不會對外發送任何實際響應或執行生產級的操作。
  • 分析與比較:分析測試副本的處理結果,並與生產系統的結果進行比較,以檢測差異和潛在的問題。

透過 Syntixi 的流量鏡像功能,使用者可以輕鬆地將生產環境的 HTTP 流量複製到測試環境中來進行相關的驗證和分析。

Syntixi 流量鏡像實現原理

單叢集流量複製

  1. 使用者設定流量鏡像規則後,系統會將 Ingress 原先送往 Function v1 的流量送到 Request Forwarder
  2. Request Forwarder 會將正常流量送到 Function v1
  3. 同時複製一份透過 Traffic Gateway 送到另個叢集的 Function v2 進行平行測試
  4. Prometheus 會從 Request Forwarder 收集相關指標 Metrics 進行分析

多叢集流量複製

  1. 使用者設定流量鏡像規則後,系統會將 Ingress 原先送往 Function v1 的流量送到 Request Forwarder
  2. Request Forwarder 會將正常流量送到 Function v1
  3. 同時複製一份送到 Function v2 進行平行測試
  4. Prometheus 會從 Request Forwarder 收集相關指標 Metrics 進行分析

流量鏡像設定

通過增加 mirror 欄位,使用者可以在 HttpTrigger 資源中設定流量鏡像規則。

  apiVersion: trigger.syntixi.dev/v1
kind: HttpTrigger
metadata:
  name: hello
  namespace: demo
spec:
  host: 'example.com'
  ingressClassName: nginx
  paths:
  - function:
      name: fnv1
      port: 80
    mirror: # enable traffic shadowing 
      to:
      - function:
          name: fnv2 # function name that will receive mirrored traffic
          port: 80 # port number
        # sampling rate. integer between 1~10000. 
        # 1 represent 0.01% (1/10000) traffic and 100 represents 1% (100/10000) of traffic.
        percent: 10000 
    path: /foobar
    pathType: Prefix
  
  • HTTP Trigger 可以設定多個路徑,每個路徑可以設定不同的流量鏡像規則
  • 採樣比例 (spec.paths[*].mirror.to[*].percent) 是一個介於 1~10000 之間的整數,用於控制複製流量的比例

啟用跨叢集流量鏡像功能

如果需要將流量複製到另個叢集,則需要在 Function 添加下面的 LabelsAnnotations 以實現跨叢集流量傳送

  apiVersion: core.syntixi.dev/v1
kind: Function
metadata:
  annotations:
    linkerd.io/inject: enabled
  labels:
    mirror.linkerd.io/exported: "true"
  
Was this page helpful?