公告 WebAssembly 插件的 Alpha 版本

介紹新的 Wasm 插件 API 以及 Envoy 和 Istio 中基於 Wasm 的插件支援的更新。

2021 年 12 月 16 日 | 作者:Daniel Grimm - Red Hat、Pengyuan Bian - Google、Takeshi Yoneda - Tetrate

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

WasmPluginEnvoyFilter 之間有很多相似之處,也有些許差異,所以讓我們逐一檢視這些欄位。

上面的範例將 Wasm 模組部署到符合 selector 欄位的所有工作負載(包括閘道 Pod),這與 EnvoyFilter 中的運作方式非常相似。

下一個欄位是 phase。這決定了 Wasm 模組將注入到代理的篩選器鏈中的哪個位置。我們定義了四個不同的注入階段:

pluginConfig 欄位用於設定您的 Wasm 插件。無論您將什麼放入此欄位,都會以 JSON 格式編碼,並傳遞給您的篩選器,您可以在 Proxy-Wasm SDK 的設定回呼中存取它。例如,您可以使用 C++ SDK 中的 onConfigureRust SDK 中的 on_configureGo 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 篩選器鏈中。

Remote Wasm module fetch flow
遠端 Wasm 模組擷取流程

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 插件的開發人員體驗!

分享此文章