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工作流程
- 外部請求服務,請求被envoy攔截,envoy根據請求生成屬性,屬性作為參數向mix發起check請求.
- mix進行前置條件檢查和配額檢查,調用相應的adapter處理,並返回結果.
- envoy根據結果,執行請求或拒絕請求.
- 執行請求后向mix服務發起report請求,上報遙測數據.
- mix的adapter基於上報的數據做進一步處理.
參考文檔:
