Slide 1

Slide 1 text

Envoy.なんか Kyoto.なんか #5 id:cohalz

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

自己紹介 ・id:cohalz / @cohalz ・はてなインターン 2017 ・はてな SRE (~ 2018)  ・最近異動してブログチームへ  ・主戦場: AWS

Slide 4

Slide 4 text

Q. Envoyって知ってますか?

Slide 5

Slide 5 text

A. HAProxyみたいな便利なやつです

Slide 6

Slide 6 text

Envoy ・L4/L7プロキシ  ・一通りのプロキシ・ロードバランサ機能  ・Circuit Breaker / Fault Injection  ・API経由による設定更新  ・ログ・メトリック・トレーシング連携

Slide 7

Slide 7 text

Envoy 用語集 ・Cluster  ・接続先をまとめた単位、Circuit Breakerはここに書く ・ Listener  ・待受けポートとかアクセスログとかFault Injectionはここに書く ・Router  ・ルーティング情報とかリトライ・タイムアウトはここに書く

Slide 8

Slide 8 text

Circuit Breaker ・閾値よりも多くなったら接続せず即エラーを返す機能 ・requestやpending, retryの数で設定できる ・目的としては、  ・レイテンシの悪化(カスケード障害)を防ぐ  ・接続先の負荷軽減

Slide 9

Slide 9 text

Circuit Breaker ・遮断時は超過した分だけエラーを返す ・つまりは最大値の設定  ・遮断したらすべてがエラーになるわけではない

Slide 10

Slide 10 text

Fault Injection ・障害時の挙動を再現できる機能  ・レスポンスを遅延  ・503など特定のステータスコードを返す ・確率やヘッダベースで条件を決める

Slide 11

Slide 11 text

Fault Injection ・思ってた以上に便利 ・書いたエラー処理が適切にハンドリングできてるかわかる ・ヘッダベースで注入は色々可能性がありそう

Slide 12

Slide 12 text

メトリック ・統計情報を出すエンドポイントが用意されている  ・レスポンス時間等のヒストグラム  ・Circuit BreakerやFault Injection ・種類が多すぎて困るレベルにある

Slide 13

Slide 13 text

Mackerelプラグイン ・社内でプロトタイプ作成中、そのうち公開されるかも

Slide 14

Slide 14 text

API経由での更新 ・Envoyサーバに設定を持たずAPI経由で情報を取得できる  ・xDS APIと呼ばれREST・gRPCで更新できる  ・エンドポイントやルーティングといった単位

Slide 15

Slide 15 text

API経由での更新方法 ・適切なレスポンスを返せるAPIサーバの実装が必要  ・公式のライブラリはあるが手間

Slide 16

Slide 16 text

サーバを立てずに外部から更新したい ・設定ファイル入れ替えるためにコンテナ入れ替えは重い ・Fargateとか使ってるとなおさら時間かかる ・コンテナ入れ替えず外部から更新できないか?

Slide 17

Slide 17 text

サーバを立てずに外部から更新したい ・ローカルファイル経由で読み込む方法を使う ・実は指定したファイルの更新を検知して自動リロードする https://medium.com/grensesnittet/file-based-dynamic-configuration-of-routes-in-envoy-proxy-6234dae968d2

Slide 18

Slide 18 text

S3に置いたファイルをマスターにできないか ・ファイル置き場といったらS3 ・毎分s3 syncするだけのDockerイメージを作っていた

Slide 19

Slide 19 text

S3に置いたファイルをマスターに ・これをサイドカーにしてEnvoyとボリュームを共有 ・毎分S3 から設定をpollingできるEnvoyサーバの完成!! ・Pros: コンテナ入れ替えなくとも簡単に更新できる ・Cons: 更新まで最大一分の遅延がある

Slide 20

Slide 20 text

Envoyのハマりどころ

Slide 21

Slide 21 text

X-Rayと一緒に使うとき ・X-Rayのサービスマップはホストヘッダを見ている  ・Envoyのエンドポイントでまとめられてしまう

Slide 22

Slide 22 text

X-Rayと一緒に使うとき ・AppにEnvoy用に接続先書き換えるロジックを入れて解決 ・EnvoyのX-Ray連携早く入って欲しい

Slide 23

Slide 23 text

設定のバリデーション ・ファイル分割してるとバリデーション難しい  ・ミスっても設定更新されないだけで落ちない ・これをCIで検知  ・ログレベルいじって数秒だけ起動させファイルに書く  ・そのファイルが作られてたらアウトに ・一応バリデーションツールはあるが動かせてない

Slide 24

Slide 24 text

timeout周り ・いろんなtimeoutがあって混乱する  ・connect_timeout (Cluster)  ・timeout (Router)  ・per_try_timeout (Router)  ・request_timeout (Listener) ・レスポンスを見てるのはtimeoutとper_try_timeout

Slide 25

Slide 25 text

Fault Injection・timeout ・遅延注入しつつ timeout を調整するの難しい  ・response timeout は遅延とは独立 ・ログや統計から適切な timeout を設定したほうがいい

Slide 26

Slide 26 text

Retry・Circuit Breaker ・timeout を短め・retry を多め  ・何回も接続しようとしてDoSになってしまう ・Circuit Breakerの閾値が低め  ・リソース余ってるのにエラーになる ・でも閾値緩めると設定が意味なくなる  ・いい感じにやっていくしかない

Slide 27

Slide 27 text

その他 ・MySQLプロキシやHTTP_PROXY相当の機能もある  ・まだ安定版ではないので注意 ・公式ブログからのドキュメントがリンク切れしててだるい ・あとApp Meshは機能がなさすぎる

Slide 28

Slide 28 text

HAProxy 2.0 ・Envoyにある機能どんどん取り込んでいて気になっている https://www.haproxy.com/blog/haproxy-2-0-and-beyond/

Slide 29

Slide 29 text

感想 ・マイクロサービスやっていくために便利に使える ・アプリから通信周りの知識を剥がせるだけでも便利 ・メトリック可視化しないと設定むずすぎる!! ・導入知見が全然流れてこなくて困る