Istio 的宣告式 WebAssembly 部署

以宣告方式設定 Envoy 和 Istio 的 Wasm 擴充功能。

2020 年 3 月 16 日 | 作者:Christian Posta - Solo.io

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)。

How the wasme operator works
了解 wasme 運算子的運作方式

目前,Wasm 映像需要發布到登錄檔中,運算子才能正確快取它。快取 pod 會在每個節點上以 DaemonSet 形式執行,以便將快取掛載到 Envoy 容器中。這正在改進中,因為它不是理想的機制。理想情況下,我們不需要處理任何掛載,並且可以直接透過 HTTP 將模組串流到代理,因此請隨時關注更新(應在接下來幾天內推出)。掛載是透過使用 sidecar.istio.io/userVolumesidecar.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。

了解更多

分享此文章