istio-mix介紹


mixer

概念

Mixer 是負責提供策略控制和遙測收集的 Istio 組件:

在每次請求執行先決條件檢查之前以及在每次報告遙測請求之后,Envoy sidecar 在邏輯上調用 Mixer.

主要提供三個核心功能:

  • 前置條件檢查(Precondition Checking): 某一服務響應外部請求前,通過Envoy向Mixer發送Check請求,檢查該請求是否滿足一定的前提條件,包括白名單檢查、ACL檢查等.
  • 配額管理: 當多個請求發生資源競爭時,通過配額管理機制可以實現對資源的有效管理.
  • 遙測報告上報:該服務處理完請求后,通過Envoy向Mixer上報日志、監控等數據.

可靠性和延遲

該 sidecar 具有本地緩存​,從而可以在緩存中執行相對較大比例的前提條件檢查。此外,sidecar 緩沖出站遙測,使其實際上不需要經常調用 Mixer。

Mixer 是一種高度可用的組件,其設計有助於提高整體可用性並減少網格中服務的平均延遲。其設計的關鍵方面帶來以下好處:

  • 無狀態。Mixer 是無狀態的,因為它不管理任何自己的持久化存儲。
  • 硬化。Mixer 本身被設計成高度可靠的組件。設計目標是為任何單獨的 Mixer 實例實現 > 99.999% 的正常運行時間。
  • 緩存和緩沖。Mixer 被設計為累積大量瞬態短暫狀態。

位於網格中每個服務實例旁邊的sidecar代理必須在內存消耗方面節約,這限制了本地緩存和緩沖的可能數量。然而,Mixer獨立運行,可以使用相當大的緩存和輸出緩沖區。因此,Mixer可用作Sidecar的高度擴展且高度可用的二級緩存。

屬性

屬性主要由envoy產生,mix和服務也會產生屬性.istio通過屬性來控制service mesh中的運行行為.

屬性表達式

mix通過一種表達式語言(CEXL)去指定遙測策略配置的匹配表達式.CEXL表達式支持一部分go語言表達式,並以之作為CXEL語法.具體看expression language.

適配器

mix適配器能夠讓istio連接基礎設施后端來完成指標和日志等基礎功能.

下面只是列出個人認為比較常用的適合器,詳細的看adapters.

  • circonus:微服務監控平台.
  • flunted:開源日志收集工具.
  • list:黑白名單檢測.
  • promethous:開源時序數據庫.
  • stdio: stdio適配器使Istio能將日志和metrics輸出到本地,結合內置的ES、Grafana就可以查看相應的日志或指標了.

模板

Mixer 模板用於將數據發送到各個適配器。看上圖對於一個請求,service mesh會調用兩個rpc: check和report.不同的適配器需要不同的屬性,模板定義了屬性到適配器需要數據的映射.

一個metric的模板如下:

apiVersion: "config.istio.io/v1alpha2"
kind: metric
metadata:
  name: requestsize
  namespace: istio-system
spec:
  value: request.size | 0
  dimensions:
    source_service: source.service | "unknown"
    source_version: source.labels["version"] | "unknown"
    destination_service: destination.service | "unknown"
    destination_version: destination.labels["version"] | "unknown"
    response_code: response.code | 200
  monitored_resource_type: '"UNSPECIFIED"'

規則

mix的配置可以抽象成三種模型: handler,instance,rule這三種模型主要通過kind字段做區分.

如下:

  • adapter kind: 表示此配置為handler.
  • temlate kind: 表示此配置為template.
  • rule: 表示此配置為rule

handler

一個handler是配置好的adapter的實例.

以下是一個promethous的adapter

apiVersion: "config.istio.io/v1alpha2"
kind: prometheus
metadata:
  name: handler
  namespace: istio-system
spec:
  param:
    metrics:
    - name: request_count
      instance_name: requestcount.metric.istio-system
      kind: COUNTER
      label_names:
      - source_service
      - source_version
      - destination_service
      - destination_version
  connection:
    address: localhost:8090

instance

Instance定義了屬性到適配器輸入的映射.

一個處理requestduration metric數據的Instance配置如下:

apiVersion: config.istio.io/v1alpha2
kind: metric
metadata:
  name: requestduration
  namespace: istio-system
spec:
  value: response.duration | "0ms"
  dimensions:
    destination_service: destination.service | "unknown"
    destination_version: destination.labels["version"] | "unknown"
    response_code: response.code | 200
  monitored_resource_type: '"UNSPECIFIED"'

rule

rule定義了一個特定的instance何時調用一個特定的handler.

一個典型的Rule配置如下:

apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: promhttp
  namespace: istio-system
spec:
  match: destination.service == "service1.ns.svc.cluster.local" && request.headers["x-user"] == "user1"
  actions:
  - handler: handler.prometheus
    instances:
    - requestduration.metric.istio-system

mix工作流程

  1. 外部請求服務,請求被envoy攔截,envoy根據請求生成屬性,屬性作為參數向mix發起check請求.
  2. mix進行前置條件檢查和配額檢查,調用相應的adapter處理,並返回結果.
  3. envoy根據結果,執行請求或拒絕請求.
  4. 執行請求后向mix服務發起report請求,上報遙測數據.
  5. mix的adapter基於上報的數據做進一步處理.

參考文檔:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM