Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Envoy.なんか / Kyoto.なんか #5

cohalz
August 24, 2019

Envoy.なんか / Kyoto.なんか #5

Kyoto.なんか #5
https://kyoto-nanka.connpass.com/event/141982/
の発表資料です

cohalz

August 24, 2019
Tweet

More Decks by cohalz

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  19. Envoyのハマりどころ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide