公告 WebAssembly 插件的 Alpha 版本
介紹新的 Wasm 插件 API 以及 Envoy 和 Istio 中基於 Wasm 的插件支援的更新。
Istio 1.9 引入了對 WebAssembly (Wasm) 模組分發的實驗性支援,以及一個 Wasm 擴充生態系統儲存庫,其中包含用於擴充開發的規範範例和用例。在過去的 9 個月中,Istio、Envoy 和 Proxy-Wasm 社群持續共同努力,使 Wasm 可擴充性變得穩定、可靠且易於採用,我們很高興宣布 Istio 1.12 中對 Wasm 可擴充性的 Alpha 支援!在以下章節中,我們將逐步介紹針對 1.12 版本對 Wasm 支援所做的更新。
新的 WasmPlugin API
透過 extensions.istio.io
命名空間中新的 WasmPlugin
CRD,我們正在引入一個新的高階 API,用於使用自訂 Wasm 模組擴充 Istio 代理的功能。這項工作建立在過去兩年中在 Proxy-Wasm 規範和實作方面所做的出色工作之上。從現在開始,您不再需要使用 EnvoyFilter
資源將自訂 Wasm 模組新增到您的代理中。相反地,您現在可以使用 WasmPlugin
資源。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: your-filter
spec:
selector:
matchLabels:
app: server
phase: AUTHN
priority: 10
pluginConfig:
someSetting: true
someOtherSetting: false
youNameIt:
- first
- second
url: docker.io/your-org/your-filter:1.0.0
WasmPlugin
和 EnvoyFilter
之間有很多相似之處,也有些許差異,所以讓我們逐一檢視這些欄位。
上面的範例將 Wasm 模組部署到符合 selector
欄位的所有工作負載(包括閘道 Pod),這與 EnvoyFilter
中的運作方式非常相似。
下一個欄位是 phase
。這決定了 Wasm 模組將注入到代理的篩選器鏈中的哪個位置。我們定義了四個不同的注入階段:
AUTHN
:在任何 Istio 驗證和授權篩選器之前。AUTHZ
:在 Istio 驗證篩選器之後,以及在任何第一級授權篩選器之前,也就是在應用AuthorizationPolicy
資源之前。STATS
:在所有授權篩選器之後,以及在 Istio 統計篩選器之前。UNSPECIFIED_PHASE
:讓控制平面決定插入位置。這通常會在篩選器鏈的末端,緊接在路由器之前。這是此phase
欄位的預設值。
pluginConfig
欄位用於設定您的 Wasm 插件。無論您將什麼放入此欄位,都會以 JSON 格式編碼,並傳遞給您的篩選器,您可以在 Proxy-Wasm SDK 的設定回呼中存取它。例如,您可以使用 C++ SDK 中的 onConfigure
、Rust SDK 中的 on_configure
或 Go SDK 中的 OnPluginStart
回呼來擷取設定。
url
欄位指定要提取 Wasm 模組的位置。您會注意到此範例中的 url
是 Docker URI。除了透過 HTTP、HTTPS 和本機檔案系統 (使用 file://) 載入 Wasm 模組外,我們還引入了 OCI 映像格式,作為分發 Wasm 模組的首選機制。
最後要注意的一件事是,目前 Wasm 插件 API 僅適用於輸入 HTTP 篩選器鏈。對網路篩選器和輸出流量的支援將在未來新增。
Wasm 映像規格
我們相信容器是儲存、發布和管理代理擴充功能的理想方式,因此我們與 Solo.io 合作,擴充了他們現有的 Proxy-Wasm 容器格式,並提供了一個旨在與所有註冊表和 CLI 工具鏈相容的變體。根據您的流程,您現在可以使用現有的容器 CLI 工具(例如 Docker CLI 或 buildah)來建置代理擴充容器。
若要了解如何建置 OCI 映像,請參閱這些指示。
Istio 代理中的映像擷取器
自 Istio 1.9 以來,Istio-agent 透過利用 istio-agent 內部的 xDS 代理和 Envoy 的擴充設定探索服務 (ECDS),為載入從 EnvoyFilters
中設定的遠端 HTTP 來源提取的 Wasm 二進位檔提供了一個可靠的解決方案。相同的機制適用於 Istio 1.12 中新的 Wasm API 實作。您可以可靠地使用 HTTP 遠端資源,而無需擔心 Envoy 在遠端擷取失敗時可能會因設定不良而卡住。
此外,Istio 1.12 將此功能擴充到 Wasm OCI 映像。這表示 Istio-agent 現在能夠從任何 OCI 註冊表擷取 Wasm 映像,包括 Docker Hub、Google Container Registry (GCR)、Amazon Elastic Container Registry (Amazon ECR) 等。擷取映像後,Istio-agent 會從中提取並快取 Wasm 二進位檔,然後將它們插入 Envoy 篩選器鏈中。
Envoy Wasm 執行階段的改進
Envoy 中由 V8 支援的 Wasm 執行階段自 Istio 1.5 以來就已推出,並且此後進行了許多改進。
WASI 支援
首先,現在支援某些 WASI (WebAssembly 系統介面) 系統呼叫。例如,可以從 Wasm 程式進行 clock_time_get
系統呼叫,因此您可以在 Envoy Wasm 擴充功能中使用 Rust 中的 std::time::SystemTime::now()
或 Go 中的 time.Now().UnixNano()
,就像任何其他原生平台一樣。另一個範例是 Envoy 現在支援 random_get
,因此 Go 中的「crypto/rand」套件可用作加密安全的亂數產生器。我們目前也在研究檔案系統支援,因為我們看到有人要求從在 Envoy 中執行的 Wasm 程式讀取和寫入本機檔案。
可偵錯性
接下來是可偵錯性的改進。當程式導致執行階段錯誤時,例如,當 C++ 中發生空指標例外,或在 Go 或 Rust 中呼叫 panic 函式時,Envoy 執行階段現在會發出程式的堆疊追蹤。雖然 Envoy 錯誤訊息之前沒有包含任何關於原因的資訊,但它們現在會顯示追蹤,您可以使用它來偵錯您的程式。
Function: proxy_on_request_headers failed: Uncaught RuntimeError: unreachable
Proxy-Wasm plugin in-VM backtrace:
0: 0xdbd - runtime._panic
1: 0x103ab - main.anotherCalculation
2: 0x10399 - main.someCalculation
3: 0xea57 - main.myHeaderHandler
4: 0xea15 - proxy_on_request_headers
上面是基於 Go SDK 的 Wasm 擴充功能的堆疊追蹤範例。您可能會注意到輸出在追蹤中不包含檔案名稱和行號。這是一個重要的未來工作項目,也是一個與 WebAssembly 的 DWARF 格式和 WebAssembly 規格的例外處理提案相關的開放問題。
Wasm 程式的 Strace 支援
您可以看到 Envoy 發出的 strace
等效記錄。透過 Istio 代理的元件記錄層級 wasm:trace
,您可以觀察跨 Wasm 虛擬機器和 Envoy 之間的邊界的全部系統呼叫和 Proxy-Wasm ABI 呼叫。以下是此類 strace
記錄串流的範例:
[host->vm] proxy_on_context_create(2, 1)
[host<-vm] proxy_on_context_create return: void
[host->vm] proxy_on_request_headers(2, 8, 1)
[vm->host] wasi_snapshot_preview1.random_get(86928, 32)
[vm<-host] wasi_snapshot_preview1.random_get return: 0
[vm->host] env.proxy_log(2, 87776, 18)
這對於在執行階段偵錯 Wasm 程式的執行情況特別有用,例如,驗證它是否未進行任何惡意系統呼叫。
Wasm 內度量標準的任意 Prometheus 命名空間
最後一個更新是關於度量標準。Wasm 擴充功能能夠定義自己的自訂度量標準並在 Envoy 中公開它們,就像任何其他度量標準一樣,但在 Istio 1.12 之前,所有這些自訂度量標準都以 envoy_
Prometheus 命名空間作為前置詞,並且使用者無法使用自己的命名空間。現在,您可以選擇任何您想要的命名空間,並且您的度量標準將按原樣在 Envoy 中公開,而無需以 envoy_
作為前置詞。
請注意,為了實際公開這些自訂度量標準,您必須在 meshConfig
中設定 ProxyConfig.proxyStatsMatcher
以進行全域設定,或在 proxy.istio.io/config
中進行每個代理的設定。如需詳細資訊,請參閱 Envoy 統計資訊
。
未來工作和徵求意見
雖然我們已經宣布 Wasm 插件的 Alpha 版本可用,但仍有許多工作要做。一個重要的工作項目是 Wasm API 中的「映像提取密碼」支援,這將使您能夠輕鬆地在私有儲存庫中使用 OCI 映像。其他還包括對 L4 篩選器的第一級支援、Wasm 二進位檔的簽名驗證、Envoy 中的執行階段改進、Proxy-Wasm SDK 改進、文件等。
這只是我們在 Istio 中提供第一級 Wasm 支援的計畫的開始。我們很樂意聽取您的意見,以便我們在 Istio 的未來版本中改進使用 Wasm 插件的開發人員體驗!