Istio 的宣告式 WebAssembly 部署
以宣告方式設定 Envoy 和 Istio 的 Wasm 擴充功能。
如 Istio 2020 趨勢部落格中所述,以及最近在 Istio 1.5 中宣布的,WebAssembly (Wasm) 現在是擴展 Istio 服務代理(Envoy 代理)功能的一個(alpha)選項。透過 Wasm,使用者可以為新的協定、自訂指標、記錄器和其他篩選器建立支援。我們社群 (Solo.io) 與 Google 密切合作,專注於建置、社交和將 Wasm 擴充功能部署到 Istio 的使用者體驗。我們已發布 WebAssembly Hub 和 相關工具,以建立類似 Docker 的 Wasm 工作體驗。
背景
透過 WebAssembly Hub 工具,我們可以使用 wasme
CLI 輕鬆引導 Envoy 的 Wasm 專案、將其推送到儲存庫,然後將其提取/部署到 Istio。例如,若要使用 wasme
將 Wasm 擴充功能部署到 Istio,我們可以執行以下操作
$ wasme deploy istio webassemblyhub.io/ceposta/demo-add-header:v0.2 \
--id=myfilter \
--namespace=bookinfo \
--config 'tomorrow'
這會將 demo-add-header
擴充功能新增至 bookinfo
命名空間中執行的所有工作負載。我們可以透過使用 --labels
參數,更精細地控制哪些工作負載會取得擴充功能
$ wasme deploy istio webassemblyhub.io/ceposta/demo-add-header:v0.2 \
--id=myfilter \
--namespace=bookinfo \
--config 'tomorrow' \
--labels app=details
這比手動建立 EnvoyFilter
資源並嘗試將 Wasm 模組傳輸到您要鎖定的工作負載所屬的每個 pod 容易得多。但是,這是與 Istio 互動的一種非常命令式的方法。就像使用者通常不會在生產環境中直接使用 kubectl
,而是偏好以宣告式、資源為基礎的工作流程一樣,我們也希望針對 Istio 代理的自訂設定採取相同做法。
宣告式方法
WebAssembly Hub 工具也包含 用於將 Wasm 擴充功能部署到 Istio 工作負載的運算子。運算子允許使用者使用宣告式格式定義其 WebAssembly 擴充功能,並將部署的修正工作交給運算子。例如,我們使用 FilterDeployment
資源來定義哪些映像和工作負載需要該擴充功能
apiVersion: wasme.io/v1
kind: FilterDeployment
metadata:
name: bookinfo-custom-filter
namespace: bookinfo
spec:
deployment:
istio:
kind: Deployment
labels:
app: details
filter:
config: 'world'
image: webassemblyhub.io/ceposta/demo-add-header:v0.2
然後,我們可以採用此 FilterDeployment
文件並使用其餘 Istio 資源進行版本控制。您可能想知道,當 Istio 已經有 EnvoyFilter
資源時,為什麼我們需要此自訂資源來設定 Istio 的服務代理以使用 Wasm 擴充功能。
讓我們來看看所有這些在底層是如何運作的。
運作方式
在底層,運算子正在執行幾項工作,以協助將 Wasm 擴充功能部署和設定到 Istio 服務代理 (Envoy Proxy)。
- 設定 Wasm 擴充功能的本機快取
- 將所需的 Wasm 擴充功能提取到本機快取
- 將
wasm-cache
掛載到適當的工作負載中 - 使用
EnvoyFilter
CRD 設定 Envoy 以使用 Wasm 篩選器
目前,Wasm 映像需要發布到登錄檔中,運算子才能正確快取它。快取 pod 會在每個節點上以 DaemonSet 形式執行,以便將快取掛載到 Envoy 容器中。這正在改進中,因為它不是理想的機制。理想情況下,我們不需要處理任何掛載,並且可以直接透過 HTTP 將模組串流到代理,因此請隨時關注更新(應在接下來幾天內推出)。掛載是透過使用 sidecar.istio.io/userVolume
和 sidecar.istio.io/userVolumeMount
註解來建立。請參閱 Istio 資源註解的文件,以了解其運作方式的詳細資訊。
一旦 Wasm 模組正確快取並掛載到工作負載的服務代理中,運算子就會設定 EnvoyFilter
資源。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: details-v1-myfilter
namespace: bookinfo
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: envoy.http_connection_manager
subFilter:
name: envoy.router
patch:
operation: INSERT_BEFORE
value:
config:
config:
configuration: tomorrow
name: myfilter
rootId: add_header
vmConfig:
code:
local:
filename: /var/local/lib/wasme-cache/44bf95b368e78fafb663020b43cf099b23fc6032814653f2f47e4d20643e7267
runtime: envoy.wasm.runtime.v8
vmId: myfilter
name: envoy.filters.http.wasm
workloadSelector:
labels:
app: details
version: v1
您可以看到 EnvoyFilter
資源將代理設定為新增 envoy.filter.http.wasm
篩選器,並從 wasme-cache
載入 Wasm 模組。
一旦 Wasm 擴充功能載入到 Istio 服務代理中,它就會使用您引入的任何自訂程式碼來擴充代理的功能。
後續步驟
在此部落格中,我們探討了將 Wasm 擴充功能安裝到 Istio 工作負載中的選項。在 Istio 上開始使用 WebAssembly 最簡單的方法是使用 wasme
工具 來引導新的 C++、AssemblyScript [或 Rust 即將推出!] Wasm 專案。例如,若要設定 C++ Wasm 模組,您可以執行
$ wasme init ./filter --language cpp --platform istio --platform-version 1.5.x
如果我們沒有額外的旗標,wasme init
將進入互動模式,引導您選擇正確的值。
請查看 WebAssembly Hub wasme 工具,開始在 Istio 上使用 Wasm。
了解更多
WebAssembly SF 演講(影片):網路代理的擴充功能,作者:John Plevyak