「Cookpad Tech Kitchen #20 クックパッドのマイクロサービスプラットフォーム現状」に参加してきました

  • Cookpad Tech Kitchen #20 クックパッドのマイクロサービスプラットフォーム現状に参加してきました

cookpad.connpass.com

  • Cookpadにおけサービスメッシュ、gRPC、ECSの導入事例を紹介してもらいました。
  • gRPCやEnvoy等気になっているサービスの話を聞くことができて参考になりました。
  • 講演だけでなくQAセッションもあり、採用する技術に対する深い話も聞くことができてとてもよかったです。
タイトル 発表者
クックパッドでのサービスメッシュについて 小野大器
gRPC in Cookpad 岩間雄太
Amazon ECS の安定運用 鈴木康平

クックパッドでのサービスメッシュについて

背景

  • 開発者200+
  • サービス100+
  • 色んな開発チームとSREチーム
    • 運用をSREチームから各チームへ移していきたい

課題

  • 昔は大きなモノリシック
    • 今は100近いアプリが相互に連携通信している
  • マイクロサービス内でインシデント起きた時の特定が大変
  • キャパシティプランニングも難しい
  • 何が起きているか見えるようにしたい

解決策

  • Expeditor
  • aws-xray
    • 分散トレーシング
  • ruby以外も各々作って改善を続けていかないといけない
  • ネットワークプロキシを挟んでそこでやらせればいいのではないか
    • サービスメッシュ
    • 2017年ころから

導入と運用

  • 2017年はじめに計画
  • 2017年終わりにMVP作った
  • 2018年から利用

Envoy

  • 当時使えるもので一番良かった
  • Istioはまだなかった
  • AmazonECSを使っていた
    • IstioはKubeが前提だから使えないかも

ゴール

  • 各アプリで管理するのではなく中央で制御したい
  • メトリクスはPrometheus
  • 運用コストを抑えたい

運用

結果

  • 一時的なエラー率上昇がタイムアウトリトライの設定で回避できるようになった
    • SREチームの負荷が下がった
  • 設定が中央に集まったのでレビューしやすくなった
  • Observability
    • 情報が可視化されるようになった

QA

  • 冪等性をどう担保している
    • GET/PUTは自動でリトライ
    • POSTとgRPCはリトライできると分かったるものはリトライ
      • デフォルトはリトライオフ
  • Istio使わない?
    • 今の構成で安定してるから今はこのまま
  • マイクロサービスを導入するタイミングは?
    • 組織が大きくなってきてコミュニケーションコストが大きくなってきたとき
    • 明らかペイするのは2000人とかの規模

gRPC in Cookpad

これまでのCookpadのサービス感通信

CookpadでのgRPC

gRPC

  • IDLとしてProtocol Buffersが使える
  • Protocol Bbufferでクライアント/サーバのコード生成
  • 多言語対応
  • HTTP2上で動作
  • Interceptorでログ、認証、エラー処理など

gRPCの運用

  • 基本的にhako上で
  • cookpad.comでも使ってる
  • Envoy経由でリクエストを受ける

サービス定義(ProtocolBuffer)の管理

  • 1つのリポジトリで管理
  • サービスごとにディレクトリを切ってる
  • ciでlintも入れてる
  • ドキュメントもciで自動生成
    • protoc-gen-doc

メトリクス

  • Envoyコンテナでメトリクス取る
  • Prometheusに入れてGrafanaで見る

rubyでgRPC

  • grpc gem
    • C, C++で作られたものをRubyの拡張として使用
    • マルチスレッド(シングルプロセス)
  • grpc-tool gemでクライアント/サーバのコード生成
  • 公式のgRPC実装を使用してる

今後

  • Envoyの機能を使ったかなりあリリース
  • 自作gRPCライブラリへの移行
  • grpc-gatewayの導入

QA

  • gRPCをRESTで叩くことはしてない
    • gRPC使う時はクライアント/サーバどちらもgRPCでやってる

Amazon ECS の安定運用

前提

  • ほとんどのアプリがECSで動いてる
  • hakoを使ってデプロイやバッチ起動
  • ECSインスタンス 40
  • ECSサービス 500
  • 1日あたりのRun Task 80000

コンテナインスタンスの管理

  • オンデマンドインスタンスはAutoScalingGroup
  • スポットインスタンスはSpotFleet
  • オンデマンド:スポット=1:4
  • Fargate
    • 一部使ってるけど基本自前管理
      • 自前のほうが安いから
      • 起動が遅いし起動時間が安定しないから
    • 使うケース
      • ECSクラスタのオートスケールするジョブ
      • 特別大きいCPUリソースを使うジョブ

オンデマンドインスタンス

  • 自前でオートスケール
  • AutoScalingGroup

スポットインスタンス

  • オートスケールは自前
  • SpotFleet

オートスケーリング

スケールアウト
  • CloudWatchの値をチェックして閾値を超えたらスケールアウト
  • 各サービスの値をチェックしてスケールアウト
  • hako oneshotがリソース不足で失敗したときにSQSで通知を受け取ってスケールアウト
スケールイン
  • CloudWatchの値をチェックして閾値を下回ったらスケールイン

ログ

  • fluentd経由でS3に保存
  • Athenaで簡易検索できるようにしてる

CloudWatch Logs

  • 量が多すぎてピークタイムではリアルタイムにに入りきらない
  • スケーラブルで安価なS3を使うことに

ログ配送

  • 各コンテナからfluentdの集約ノードへ転送
    • 集約ノードには大量のログが来ることになる
  • 集約ノードのfluentdが1分毎にログをS3へ

ログ検索

  • Athenaで検索できるようにGlueでカタログを日時更新

モニタリング

  • CloudWatchにサービス単位のメトリクスはある
    • タスク単位やコンテナ単位はない
  • アプリ開発者はアプリコンテナのメトリクスだけ見たい
  • cAdvisorでメトリクスを取得しPrometheus送りGrafanaで可視化

QA

  • なぜECS?なぜkubeでない?EKSは?
    • 運用する人が多くないからできるだけマネージドがいい
    • EKSがECSくらい使いやすくなったら使うかも
      • 今はECSほどマネージドではない
      • 今すぐ移行するというほどではない