[TOC]
Istio Proxy【Envoy擴充套件】詳解
原始碼工程和基本介紹
istio proxy工程概要
istio官方原始碼中有說明,istio專案的倉庫除了istio本身外,還有istio proxy這個倉庫,istio proxy官方原始碼和Envoy一樣,採用C++編寫,注意,這裡的編譯方式,不再是Makefile,也不是CMake,是Google出品的bazel。bazel可以直接在編譯中引入第三方庫,載入第三方原始碼,而不是和以前一樣採用載入動態庫、靜態庫或者乾脆直接引入第三方原始碼到專案中的方式;這個方式有點類似golang的import和包管理機制,只需要引用並且制定第三方庫的位置和版本即可。更多關於Bazel的介紹可以參考Bazel官網。
istio proxy和Envoy的關係
istio proxy這個專案工程既包含引用了Envoy的原始碼,還在此基礎上自己做了擴充套件,這個擴充套件是通過Envoy filter(過濾器)的形式來提供,這樣的話就可以使得proxy代理將策略執行決策委託給Mixer,這樣就解釋了為什麼Mixer可以被設計為提供策略和遙測的元件,Mixer->istio proxy->Envoy這種形式來控制。這樣通過這個方式就能:
- 使用到Envoy的全部功能
- 基於Envoy做擴充套件,結合istio本身做處理
核心原理和功能說明
在istio-proxy專案中的Envoy BUILD中可以知道,這裡會編譯出name = "Envoy"
的二進位制程式,然後start_Envoy會啟動Envoy,同時會根據一些預設引數和配置檔案模板生成一個全新的配置檔案,然後執行。一些關鍵引數如Envoy二進位制的路徑和配置路徑、監聽的埠、mixer的地址如下:
-a ... backend address
-c ... Envoy config file path
-e ... Envoy binary path
-l ... debug level
-m ... mixer server address
-p ... listening port
-t ... Envoy config template file path
複製程式碼
也即是istio proxy 提供兩大塊:
-
Envoy
- Envoy 流量相關
-
mixer client
- 測量和遙測相關,正因為整合了mixer client,所以才能在Envoy流量請求的時候可以進行前置檢查和後置上報
Envoy 相關
istio-proxy原始碼中提供了envoy.conf.template 通用配置模板,這個模板檔案最終會生成一個envoy的配置檔案,然後envoy啟動的時候指定執行。模板配置檔案中已經配置好了Mixer相關的引數如mixer_server,這個Mixer對於Envoy來說就是一個cluster,因此是在cluster_manager裡面進行管理配置。
然後Envoy的官方文件Listener discovery service (LDS)一文中有說明靜態的Listener檔案配置是無法通過LDS API進行修改或刪除的,因此靜態配置會一直生效,istio-proxy原始碼中則提供了Envoy的靜態配置檔案envoy_lds.conf 靜態listeners配置
Envoy Filters
根據Envoy的官方文件中的網路過濾器Network (L3/L4) filters的介紹,有三種 network filters,而在istio-proxy原始碼中剛好有實現Network::ReadFilter 和 Network::WriteFilter 過濾器,這樣就可以通過filter API 繫結到Listener,然後當有資料讀or寫的時候呼叫到對應的filter了,這樣資料流就從Envoy本身轉到了filter中。
然後network filter再轉到Envoy 的 http filter,根據官方文件HTTP filters的介紹也有兩種Filters,為Decoder和Encoder,然後在istio-proxy原始碼中實現了 Http::StreamDecoderFilter和Http::StreamEncoderFilter這兩個Filter,這樣的話整個流程就串起來了。
在具體實現中, Filter還對應有Controller進行管理,這個只是程式碼設計上的優雅風格,和流程無關,但是這個設計風格是可以借鑑參考的。
Mixer client
原有mixer client倉庫是獨立的,現在已經整合到了istio-proxy的程式碼倉庫中,這樣就可以很方便的在Sidecar Envoy代理中實現:
- 和mixer server互動
- 新增一級快取
- 前置檢查
- 後置批量上報
- 策略控制
- 屬性、欄位轉換和傳遞
Envoy呼叫Mixer流程
Pilot和istio-proxy的關係
istio/istio專案中的pilot會提供Envoy所需的一切介面,istio/proxy專案則是真正Envoy的專案,會訪問Pilot提供的介面。
官方pilot-agent-proxy命令中有詳細說明,pilot-agent啟動的時候,需要指定envoy的配置和二進位制路徑,然後映象中的proxyv2的映象的Dockerfile則參考這裡。pilot-agent是容器中PID為 1 的啟動程式,它啟動時又建立了一個 Envoy 程式。
小結
istio-proxy,這個Envoy的擴充套件,就是在Envoy基礎上,增加了一些Filter,然後通過這些個Filter在利用Mixer Client和 Mixer Server進行通訊,這樣就可以在proxy代理中:
- 流量代理
- 策略控制
- 遙測代理
- 快取