「轉接器」模式把異質的容器化系統轉換成一致的統一介面,以標準化、正規化的格式供外部世界使用。它繼承了邊車的所有特性,但單一目的就是提供「經轉接後的存取」。
問題#
容器讓我們能以統一方式封裝並執行「用不同函式庫與語言撰寫」的應用。如今常見的情況是:多個團隊使用不同技術,組成由異質元件構成的分散式系統。
解法#
最好的說明方式是舉例。成功執行與支援分散式系統的一大前提,是提供詳盡的監控與告警。若我們的分散式系統由多個要監控的服務組成,可能會用外部監控工具從每個服務輪詢指標並記錄下來。
問題來了:不同語言撰寫的服務未必有相同能力,也未必以監控工具期待的格式曝露指標。這種多樣性讓「用單一監控方案取得整個系統的統一視圖」變得困難。
有了轉接器模式,就能把各個應用容器的指標匯出成同一種標準格式與協定,藉此提供統一的監控介面。

圖 16-1:轉接器模式——轉接器容器把本地儲存的指標資訊,轉譯成監控伺服器看得懂的外部格式
採用這個做法後,代表每個服務的 Pod 除了主應用容器之外,還會有另一個容器,它知道如何讀取應用特有的自訂指標,並以監控工具看得懂的通用格式曝露出來。我們可以有一個轉接器容器懂得透過 HTTP 匯出 Java 指標,另一個 Pod 中的轉接器容器透過 HTTP 曝露 Python 指標——對監控工具而言,所有指標都以 HTTP、以共通的正規化格式取得。
具體實作:Prometheus 轉接器#
回到隨機數產生器的範例應用。適當設定後,它會寫出一份日誌檔,記錄產生亂數所花的時間。我們想用 Prometheus 監控這個時間,但很不巧:
- 日誌格式與 Prometheus 期待的格式不符。
- 我們還需要透過 HTTP 端點提供這項資訊,Prometheus 伺服器才能抓取數值。
轉接器完美適用於此:一個邊車容器啟動小型 HTTP 伺服器,每次收到請求就讀取自訂日誌檔並轉換成 Prometheus 看得懂的格式。
apiVersion: apps/v1
kind: Deployment
metadata:
name: random-generator
spec:
replicas: 1
selector:
matchLabels:
app: random-generator
template:
metadata:
labels:
app: random-generator
spec:
containers:
# 主應用容器:隨機數產生服務曝露在 8080 埠
- image: k8spatterns/random-generator:1.0
name: random-generator
env:
- name: LOG_FILE
value: /logs/random.log # 記錄亂數產生耗時資訊的日誌檔路徑
ports:
- containerPort: 8080
protocol: TCP
volumeMounts:
- mountPath: /logs # 與 Prometheus 轉接器容器共享的目錄
name: log-volume
# --------------------------------------------
# Prometheus exporter 映像檔,於 9889 埠匯出
- image: k8spatterns/random-generator-exporter
name: prometheus-adapter
env:
- name: LOG_FILE
value: /logs/random.log # 指向主應用寫入的同一份日誌檔
ports:
- containerPort: 9889
protocol: TCP
volumeMounts:
- mountPath: /logs # 共享 volume 也掛載進轉接器容器
name: log-volume
volumes:
- name: log-volume
emptyDir: {} # 檔案透過節點檔案系統上的 emptyDir volume 共享這份組態讓 Prometheus 監控完全解耦——主應用完全不需要知道 Prometheus 的存在。
另一個用途:日誌#
不同容器可能以不同格式與詳細程度記錄資訊。轉接器可以把這些資訊正規化、清理,並用「自我察覺」模式為其補上脈絡資訊,然後交由集中式日誌彙整器取用。
討論#
轉接器是邊車模式的特化。它扮演異質系統的反向代理,把系統複雜度藏在統一介面之後。
使用一個有別於通用「邊車」的專屬名稱,能讓我們更精確地傳達這個模式的目的。
下一個模式「大使」是邊車的另一種變形,它扮演的是通往外部世界的代理。
更多資訊#
- Adapter Example
- The Distributed System Toolkit: Container Patterns for Modular Distributed System Design