LoginSignup
5
3

More than 3 years have passed since last update.

Envoyで試すL7での経路制御

Last updated at Posted at 2019-10-03

Envoyとは

Lyft社が開発しているHTTP/2に対応しているモダンなL7プロキシです。CNCF Graduatedなプロジェクトで、既に多くの企業での採用事例もあります。マイクロサービス基盤におけるService MeshでSideCarとして使われる事が多く、SDやCircuit Breakerといった機能も備わっています。あくまでプロキシなので、静的ファイルの配信といった目的には使われません。

HTTP Filters

Envoyに備わっている機能の一つで、HTTPなIngress/Egressに付加されている情報を動的に書き換えたりする機能があります。この機能を用いることで、Headerに記述されているメタな情報を動的に書き換えて色々なことが出来ます。例えばJWTの検証とか、Fault Injectionとか。また、Luaを用いてプログラマブルな制御も可能です。Worker Thread単位でLuaJITを起動しています。

やりたいこと

HTTP Filterを使って動的にヘッダを書き換え、Kubernetes上の同一Pod内での経路制御を行うことです。HTTP/2では、コロンから始まるヘッダフィールドが実装されていて、このヘッダフィールドの中に:pathヘッダが含まれるようになっています。このフィールドの値をLuaで動的に書き換えたいという話ですね。

この:pathヘッダの値を、Header内に定義されているユーザーに対して一意に割り振られている情報を参照しつつ書き換えます。これは、ユーザーの値に応じて疎通先を変えたいA/Bテストやカナリアリリースのような事にも応用可能です。この方法が正しいかどうかはよくわかりませんが。

実装

Screen Shot 2019-10-03 at 23.36.55.png

構成図は上のような感じで、Goで書かれたGreen, Blueのアプリケーションに対して、Envoyでヘッダに書かれたユーザーIDを参照しつつ、Luaを用いて経路制御を行うといったものになります。Redisはセッションストアとしてしか用いていません。

全体の実装はここに置いてます。

http_filters:
  - name: envoy.lua
    typed_config:
      "@type": type.googleapis.com/envoy.config.filter.http.lua.v2.Lua
      inline_code: |
        function envoy_on_request(request_handle)
          local mod = request_handle:headers():get("x-user-id-mod")
          local current_post = request_handle:headers():get(":path")
          if mod == 0 then
            local replaced_post = "/green" .. current_post
            request_handle:headers():replace(":path", replaced_post)
          else
            local replaced_post = "/blue" .. current_post
            request_handle:headers():replace(":path", replaced_post) 
          end
        end

実装は上みたいな感じで、x-user-id-modというカスタムヘッダに、ユーザーIDの剰余が設定されていて、その値に応じてアクセスを振り分けるといったものになっています。剰余の取り方や、経路制御の条件をより細かく設定すれば、より細かい制御も可能だと思います。

総括

工夫すればこのような事もEnvoyでできますし、アプリケーション側から煩わしいネットワーク周りの処理も削減することができそうな機能です。ただ、この実装はあまりエレガントではない気がするので、もっとキレイに書けたら良さそうです。1

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3