IstioとEnvoy WebAssembly拡張機能、1年間の軌跡
EnvoyとIstioのWebAssemblyベースの拡張機能への取り組みの最新情報。
1年前の今日、1.5リリースで、WebAssemblyベースの拡張機能をIstioに導入しました。この1年間、Istio、Envoy、Proxy-Wasmコミュニティは、WebAssembly(Wasm)拡張機能を安定性、信頼性、導入の容易さを向上させるための共同作業を続けてきました。Istio 1.9リリースまでのWasmサポートの更新と、今後の計画について説明します。
WebAssemblyサポートがアップストリームEnvoyにマージ
WasmとWebAssembly for Proxies(Proxy-Wasm)ABIの試験的サポートをIstioのEnvoyフォークに追加した後、アーリーアダプターのコミュニティから素晴らしいフィードバックを収集しました。このフィードバックと、Istio Wasmコア拡張機能の開発から得られた経験により、ランタイムの成熟と安定化が進みました。これらの改善により、2020年10月にWasmサポートがEnvoyアップストリームに直接マージされ、すべての公式Envoyリリースの一部となりました。これは重要なマイルストーンであり、以下のことを示しています。
- ランタイムは、より幅広い導入の準備が整いました。
- プログラミングABI/API、拡張設定API、ランタイムの動作は安定しつつあります。
- 今後、より大きなコミュニティによる採用とサポートが期待できます。
wasm-extensions
エコシステムリポジトリ
Envoy Wasmランタイムのアーリーアダプターとして、Istio Extensions and Telemetryワーキンググループは拡張機能の開発において多くの経験を積みました。メタデータ交換、Prometheus統計、属性生成など、いくつかの主要な拡張機能を構築しました。学習内容をより広く共有するために、istio-ecosystem
組織にwasm-extensions
リポジトリを作成しました。このリポジトリには2つの目的があります。
- (基本認証など)高度に要求される機能を網羅した、標準的な拡張機能の例を提供します。
- Wasm拡張機能の開発、テスト、リリースのガイドを提供します。このガイドは、Istio拡張機能チームによって使用、保守、テストされているのと同じビルドツールチェーンとテストフレームワークに基づいています。
このガイドでは、現在、C++を使用したWebAssembly拡張機能の開発と単体テスト、IstioプロキシバイナリでWasmモジュールを実行することで実際のランタイムをシミュレートするGoテストフレームワークを使用した統合テストについて説明しています。今後、Open Policy Agentとの統合や、JWTトークンに基づくヘッダー操作など、さらにいくつかの標準的な拡張機能を追加する予定です。
Istio Agentを介したWasmモジュールの配布
Istio 1.9より前は、リモートWasmモジュールをプロキシに配布するためにEnvoyリモートデータソースが必要でした。この例では、2つのEnvoyFilter
リソースが定義されています。1つはリモートフェッチEnvoyクラスタを追加するため、もう1つはHTTPフィルターチェーンにWasmフィルターを挿入するためのものです。この方法には欠点があります。設定ミスや一時的なエラーが原因でリモートフェッチが失敗した場合、Envoyは誤った設定のままになります。Wasm拡張機能がフェイルクローズドとして設定されている場合、リモートフェッチの失敗によりEnvoyがサービスを提供できなくなります。この問題を解決するには、根本的な変更を加えて、Envoy xDSプロトコルが非同期xDS応答を許可するようにする必要があります。
Istio 1.9は、istio-agent内のxDSプロキシとEnvoyの拡張設定検出サービス(ECDS)を活用することで、信頼性の高い配布メカニズムをすぐに利用できるようにします。
istio-agentは、istiodからの拡張設定リソースの更新をインターセプトし、リモートフェッチヒントを読み取り、Wasmモジュールをダウンロードし、ダウンロードしたWasmモジュールのパスでECDS設定を書き直します。ダウンロードに失敗した場合、istio-agentはECDSの更新を拒否し、誤った設定がEnvoyに到達するのを防ぎます。詳細については、Wasmモジュール配布に関するドキュメントをご覧ください。
Istio Wasm SIGと今後の取り組み
Wasm拡張機能に関して多くの進歩を遂げましたが、プロジェクトにはまだ多くの未完了の部分があります。さまざまな関係者からの取り組みを統合し、今後の課題により適切に対処するために、Istio WebAssembly SIGを結成しました。これは、IstioがWasm拡張機能を利用するための標準的で信頼性の高い方法を提供することを目的としています。現在取り組んでいることの一部を以下に示します。
- ファーストクラスの拡張API:現在、Wasm拡張機能はIstioの
EnvoyFilter
APIを介して挿入する必要があります。ファーストクラスの拡張APIにより、IstioでWasmを使用することが容易になります。これはIstio 1.10で導入される予定です。 - 配布アーティファクトの相互運用性:Solo.ioのWebAssembly OCIイメージ仕様への取り組みに基づいて構築された標準Wasmアーティファクト形式により、ビルド、プル、公開、実行が容易になります。
- コンテナストレージインターフェース(CSI)ベースのアーティファクト配布:istio-agentを使用してモジュールを配布すると導入は容易ですが、各プロキシがWasmモジュールのコピーを保持するため、効率的ではない場合があります。より効率的なソリューションとして、Ephemeral CSIを使用すると、ポッドのストレージを設定できるDaemonSetが提供されます。CNIプラグインと同様に動作するCSIドライバーは、xDSフローから帯域外でWasmモジュールをフェッチし、ポッドの起動時に
rootfs
内にマウントします。
参加をご希望の場合は、隔週火曜日の午後2時(太平洋時間)に開催されるグループミーティングにご参加ください。ミーティングは、Istioワーキンググループカレンダーにあります。
Wasmを使用してIstioをどのように拡張するか、楽しみにしています!