Kyoto.なんか #5 https://kyoto-nanka.connpass.com/event/141982/ の発表資料です
Envoy.なんかKyoto.なんか #5id:cohalz
View Slide
自己紹介・id:cohalz / @cohalz・はてなインターン 2017・はてな SRE (~ 2018) ・最近異動してブログチームへ ・主戦場: AWS
Q. Envoyって知ってますか?
A. HAProxyみたいな便利なやつです
Envoy・L4/L7プロキシ ・一通りのプロキシ・ロードバランサ機能 ・Circuit Breaker / Fault Injection ・API経由による設定更新 ・ログ・メトリック・トレーシング連携
Envoy 用語集・Cluster ・接続先をまとめた単位、Circuit Breakerはここに書く・ Listener ・待受けポートとかアクセスログとかFault Injectionはここに書く・Router ・ルーティング情報とかリトライ・タイムアウトはここに書く
Circuit Breaker・閾値よりも多くなったら接続せず即エラーを返す機能・requestやpending, retryの数で設定できる・目的としては、 ・レイテンシの悪化(カスケード障害)を防ぐ ・接続先の負荷軽減
Circuit Breaker・遮断時は超過した分だけエラーを返す・つまりは最大値の設定 ・遮断したらすべてがエラーになるわけではない
Fault Injection・障害時の挙動を再現できる機能 ・レスポンスを遅延 ・503など特定のステータスコードを返す・確率やヘッダベースで条件を決める
Fault Injection・思ってた以上に便利・書いたエラー処理が適切にハンドリングできてるかわかる・ヘッダベースで注入は色々可能性がありそう
メトリック・統計情報を出すエンドポイントが用意されている ・レスポンス時間等のヒストグラム ・Circuit BreakerやFault Injection・種類が多すぎて困るレベルにある
Mackerelプラグイン・社内でプロトタイプ作成中、そのうち公開されるかも
API経由での更新・Envoyサーバに設定を持たずAPI経由で情報を取得できる ・xDS APIと呼ばれREST・gRPCで更新できる ・エンドポイントやルーティングといった単位
API経由での更新方法・適切なレスポンスを返せるAPIサーバの実装が必要 ・公式のライブラリはあるが手間
サーバを立てずに外部から更新したい・設定ファイル入れ替えるためにコンテナ入れ替えは重い・Fargateとか使ってるとなおさら時間かかる・コンテナ入れ替えず外部から更新できないか?
サーバを立てずに外部から更新したい・ローカルファイル経由で読み込む方法を使う・実は指定したファイルの更新を検知して自動リロードするhttps://medium.com/grensesnittet/file-based-dynamic-configuration-of-routes-in-envoy-proxy-6234dae968d2
S3に置いたファイルをマスターにできないか・ファイル置き場といったらS3・毎分s3 syncするだけのDockerイメージを作っていた
S3に置いたファイルをマスターに・これをサイドカーにしてEnvoyとボリュームを共有・毎分S3 から設定をpollingできるEnvoyサーバの完成!!・Pros: コンテナ入れ替えなくとも簡単に更新できる・Cons: 更新まで最大一分の遅延がある
Envoyのハマりどころ
X-Rayと一緒に使うとき・X-Rayのサービスマップはホストヘッダを見ている ・Envoyのエンドポイントでまとめられてしまう
X-Rayと一緒に使うとき・AppにEnvoy用に接続先書き換えるロジックを入れて解決・EnvoyのX-Ray連携早く入って欲しい
設定のバリデーション・ファイル分割してるとバリデーション難しい ・ミスっても設定更新されないだけで落ちない・これをCIで検知 ・ログレベルいじって数秒だけ起動させファイルに書く ・そのファイルが作られてたらアウトに・一応バリデーションツールはあるが動かせてない
timeout周り・いろんなtimeoutがあって混乱する ・connect_timeout (Cluster) ・timeout (Router) ・per_try_timeout (Router) ・request_timeout (Listener)・レスポンスを見てるのはtimeoutとper_try_timeout
Fault Injection・timeout・遅延注入しつつ timeout を調整するの難しい ・response timeout は遅延とは独立・ログや統計から適切な timeout を設定したほうがいい
Retry・Circuit Breaker・timeout を短め・retry を多め ・何回も接続しようとしてDoSになってしまう・Circuit Breakerの閾値が低め ・リソース余ってるのにエラーになる・でも閾値緩めると設定が意味なくなる ・いい感じにやっていくしかない
その他・MySQLプロキシやHTTP_PROXY相当の機能もある ・まだ安定版ではないので注意・公式ブログからのドキュメントがリンク切れしててだるい・あとApp Meshは機能がなさすぎる
HAProxy 2.0・Envoyにある機能どんどん取り込んでいて気になっているhttps://www.haproxy.com/blog/haproxy-2-0-and-beyond/
感想・マイクロサービスやっていくために便利に使える・アプリから通信周りの知識を剥がせるだけでも便利・メトリック可視化しないと設定むずすぎる!!・導入知見が全然流れてこなくて困る