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

食べログ on Kubernetes ~ 運用15年以上の大規模レガシーシステムを Kuber...

食べログ on Kubernetes ~ 運用15年以上の大規模レガシーシステムを Kubernetesに乗せていく~

2022/10/30 開催の TECHHILLS 「Kubernetes/Fargateの導入・活用事例-カカクコム×CROOZ×ナビタイム」 発表資料です。

イベントURL
https://techplay.jp/event/877265

Shimokuni Minemasa

December 01, 2022
Tweet

Other Decks in Technology

Transcript

  1. © Kakaku.com Inc. All Rights Reserved. 1 ⾷べログ on Kubernetes

    株式会社カカクコム ⾷べログシステム本部 技術部 SREチーム 下國峰昌 2022年11⽉30⽇(⽔) 運⽤15年以上の⼤規模レガシーシステムを Kubernetesに乗せていく
  2. © Kakaku.com Inc. All Rights Reserved. 2 下國 峰昌(しもくに みねまさ)

    SREチーム 技術専⾨職 2019年中途⼊社。⾷べログではSRE⼀本でやってきました 最近の活動 • ⾷べログオーダー インフラ、CI/CD、モニタリング構築 • Google Dataflow + Big Queryでアクセス解析システムを刷新 • OpsGenieクライアントRuby gemの作成 • ⾷べログ既存システムのKubernetes化
  3. © Kakaku.com Inc. All Rights Reserved. 3 本⽇お持ち帰り頂きたいこと • システムをKubernetes化する動機

    • オンプレKubernetesかマネージドKubernetesかの選択基準 • オンプレKubernetesのいいところとつらいところ
  4. © Kakaku.com Inc. All Rights Reserved. 4 ⽬次 1. ⾷べログのシステム構成の紹介

    2. なぜK8s化するのか 3. 何からK8s化に着⼿するのか 4. どうやってK8s化していくのか 5. まとめ
  5. © Kakaku.com Inc. All Rights Reserved. 6 ⾷べログのシステム構成の紹介 ⽇本最⼤級のレストラン検索・予約サイト •

    約9,000万MAU(2022年9⽉) • レストランの⼝コミ・写真 • レストランのネット予約 • 飲⾷店DX(予約台帳、⾷べログオーダー、⾷べログ仕⼊れ) • お取り寄せEC(⾷べログモール)
  6. © Kakaku.com Inc. All Rights Reserved. 8 ⾷べログのシステム構成の紹介 • この構成になって15年⽬

    • ほぼオンプレのVM ⼀部ECSやGKEあり • リクエスト数 80億req/⽉ • オンプレサーバ台数 数百台 • ハイスペックマシン多め • 12core 32GBmemなど
  7. © Kakaku.com Inc. All Rights Reserved. 11 なぜK8s化するのか このMonorepoが抱える課題 •

    デプロイ/ロールバックに時間がかかる。MTTRが⻑い • ⼤量のサーバに対するインフラ作業がトイル • 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
  8. © Kakaku.com Inc. All Rights Reserved. 12 なぜK8s化するのか このMonorepoが抱える課題 •

    デプロイ/ロールバックに時間がかかる。MTTRが⻑い • ⼤量のサーバに対するインフラ作業がトイル • 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
  9. © Kakaku.com Inc. All Rights Reserved. 15 なぜK8s化するのか デプロイ/ロールバックに時間がかかる。MTTRが⻑い サーバが増え続ける中、これ以上デプロイを

    ⾼速にするのは、今のアーキテクチャでは厳しい。 エンジニアがデプロイに捧げる時間を減らし、 開発作業に集中できるようにしたい。 デプロイ時間が縮まれば、デプロイ頻度も上げられる。 また、デプロイ起因で障害が発⽣した際には、 即座にロールバックできるようにしたい。
  10. © Kakaku.com Inc. All Rights Reserved. 16 なぜK8s化するのか デプロイ/ロールバックに時間がかかる。MTTRが⻑い Kubernetes化すると、

    Argo CDなどのKubernetes⽤ GitOps CDツールを 使えば、デプロイ担当者は、GitHub上の プルリクエストをマージするだけで完了! ロールバックは、マージしたプルリクエストを リバートするだけ! 3sec.
  11. © Kakaku.com Inc. All Rights Reserved. 17 なぜK8s化するのか このMonorepoが抱える課題 •

    デプロイ/ロールバックに時間がかかる。MTTRが⻑い • ⼤量のサーバに対するインフラ作業がトイル • 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
  12. © Kakaku.com Inc. All Rights Reserved. 19 なぜK8s化するのか ⼤量のサーバに対するインフラ作業がトイル サーバ数百台の依存コンポーネントバージョンアップ作業

    しかも緊急。下⼿すると3時間作業 ⼯数/精神的負担が、突発的に発⽣し、 SRE本来の業務へ割く⼒を奪っていた。
  13. © Kakaku.com Inc. All Rights Reserved. 20 なぜK8s化するのか ⼤量のサーバに対するインフラ作業がトイル Kubernetes化すると、

    ここを⼤幅に削減できる。 Dockerfileを書き換えてビルドし、applyするのみ(数秒) ※イメージです。現在のバージョンとは異なります • Ansibleを流す時間(下⼿すると3時間) • その間のシステムモニタリング
  14. © Kakaku.com Inc. All Rights Reserved. 21 なぜK8s化するのか このMonorepoが抱える課題 •

    デプロイ/ロールバックに時間がかかる。MTTRが⻑い • ⼤量のサーバに対するインフラ作業がトイル • 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
  15. © Kakaku.com Inc. All Rights Reserved. 23 なぜK8s化するのか 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い このNW

    経路いる? このDB 接続いる? これデッド コードっぽ いから消し たいな これ機能ご と別システ ムに切り出 したいな このシステ ムだけES6 使えないん だけど
  16. © Kakaku.com Inc. All Rights Reserved. 24 なぜK8s化するのか 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い このNW

    経路いる? このDB 接続いる? これデッド コードっぽ いから消し たいな これ機能ご と別システ ムに切り出 したいな このシステ ムだけES6 使えないん だけど でもそれを検証するのに ⼯数かかるし、えいやで出して 障害起こしてもロールバックに 時間かかるし触らんとこ。。。
  17. © Kakaku.com Inc. All Rights Reserved. 25 なぜK8s化するのか 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い •

    リグレッションテストをきちんと⾏える環境がない • ステージング環境はあるけど、本番と微妙に違う • カナリアリリース/ブルーグリーンデプロイメントの仕組みがない • いきなり改修したコードに100%トラフィックが流れてしまう • コードの本番リリース後のロールバック機能がない • ミュータブルなVMへの構成変更はロールバック不可 ために、歴史的負債の返済に⼿を出しづらい。
  18. © Kakaku.com Inc. All Rights Reserved. 26 なぜK8s化するのか 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い Kubernetes化すると、

    • 本番環境とほぼ同じステージング環境が⼿に⼊る • マニフェストで宣⾔的にインフラを定義できる • カナリアリリース等の仕組みが導⼊しやすい • 試しに1%だけ改修したコードへトラフィックを流せる • コードリリースを⼀瞬でロールバックできる • インフラがイミュータブルになり、変更がロールバック可能に なるため、負債返済のための攻めのリリースができる ※リグレッションテスト環境も構築を進めています! ⾷べログのソフトウェアテスト⾃動化デザインパターン
  19. © Kakaku.com Inc. All Rights Reserved. 27 なぜK8s化するのか このMonorepoが抱える課題 •

    デプロイ/ロールバックに時間がかかる。MTTRが⻑い • ⼤量のサーバに対するインフラ作業がトイル • 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い まとめ を、解消したい。 その⼿段として、Kubernetesを選びました。
  20. © Kakaku.com Inc. All Rights Reserved. 30 何からK8s化に着⼿するのか Kubernetes導⼊前の懸念 難しいんでしょ?

    => やってみなわからんわな 新規サービスでお試し。 ⾷べログテイクアウト を、Google Kubernetes Engineで構築。 インフラ担当2⼈、3ヶ⽉でサービスインできた。 ⼩さく始め、⼿応えを掴むところから始めた ※Googleの顧客事例にも取り上げられました https://cloud.google.com/blog/ja/topics/customers/kakaku-com-gke/
  21. © Kakaku.com Inc. All Rights Reserved. 31 何からK8s化に着⼿するのか Kubernetes オンプレでいくかクラウドで⾏くか

    クラウドの魅⼒ • 運⽤に必要なものが⼀通り揃っている • 採⽤事例が多く、情報が多い • ノードの管理がほぼ不要 • これがしんどい • ECS + Fargateなどのマネージドサービス使え ばもっと楽 オンプレの魅⼒ • カカクコム社として統⼀的なプラット フォーム • ハイスペックなマシンを⼤量に並べる となると圧倒的に安い • 80億req/⽉のネットワーキング料⾦と なると圧倒的に安い => 原則オンプレでいくことに
  22. © Kakaku.com Inc. All Rights Reserved. 32 何からK8s化に着⼿するのか Kubernetes化進めていくぜ 早くKubernetesに乗せたいのはメインサービスのMonorepo。

    でも、オンプレKubernetesの運⽤ノウハウがなかった そこで、事故っても影響が⼩さく、簡素なシステムからKubernetes化していった。 1. 社内ツール 2. データベースを持たないステートレスなシステム 3. 他システムから参照されない独⽴したDBを⼀つだけ持つシステム
  23. © Kakaku.com Inc. All Rights Reserved. 33 何からK8s化に着⼿するのか 新規サービスはもう全部Kubernetesで オンプレKubernetesの運⽤ノウハウがたまってきた

    => 新規サービスは全部オンプレKubernetesでいこう! => Next.jsやGraphQL(NestJS)のKubernetes化の知⾒もゲット
  24. © Kakaku.com Inc. All Rights Reserved. 34 何からK8s化に着⼿するのか 満を持してMonorepoのKubernetes化へ ⼀旦、Monorepo上のアプリケーションすべてをKubernetes上で稼働させてしまう

    その後、ドメイン単位でVMからKubernetesへ切り替えていく =>影響範囲を局所化しつつ切り替え可能に INSERVICE INSERVICE MAINTENANCE MAINTENANCE Monorepo
  25. © Kakaku.com Inc. All Rights Reserved. 36 どうやってK8s化していくのか ⼤前提は、リフト &

    シフト ⾷べログは、運⽤15年を過ぎた歴史あるシステム。 Kubernetes移⾏にあたってシステム全体を⾒回したとき、 つい直したくなる地雷も多く埋まっている。 しかし、いま⼤規模改修をしてもMTTRが⻑いまま。 まずはMTTRを短くするためにKubernetesに乗せる。 地雷を撤去していくのはそのあと。 この⽬的を⾒失わずにやっていきます。
  26. © Kakaku.com Inc. All Rights Reserved. 37 どうやってK8s化していくのか • モニタリングどうすんの

    • ロギングどうすんの • ノード運⽤どうすんの オンプレ特有の悩み
  27. © Kakaku.com Inc. All Rights Reserved. 38 どうやってK8s化していくのか • モニタリングどうすんの

    • ロギングどうすんの • ノード運⽤どうすんの オンプレ特有の悩み
  28. © Kakaku.com Inc. All Rights Reserved. 39 どうやってK8s化していくのか モニタリングどうすんの VM時代のホストベース監視ツールは使えない

    Kubernetes上ではPodが次々に⽣まれ変わるため サービスディスカバリ機能を備えた監視ツールが必要 ÞPrometheusを採⽤ サーバAにはこの監 視を、サーバBには この監視を…… Pod AもPod Bも もういない?! Pod Cは何を監視 すれば?
  29. © Kakaku.com Inc. All Rights Reserved. 40 どうやってK8s化していくのか モニタリングどうすんの Prometheusは、デフォルトでは15⽇でデータが揮発する

    Þremote write機能を使い、NewRelicへデータを永続化 メインはオンプレでも、任せられるものはSaaSに任せたほうがいいよね。
  30. © Kakaku.com Inc. All Rights Reserved. 41 どうやってK8s化していくのか モニタリングどうすんの 監視の分断を避ける

    Kubernetesで障害が起きると、当然AP層でも障害になる このとき、監視の⽬が分断していると、原因に気付くのが難しい Kubernetesは⼤量の複雑なコンポーネントが相互作⽤して稼働しているため
  31. © Kakaku.com Inc. All Rights Reserved. 42 どうやってK8s化していくのか モニタリングどうすんの 監視の分断を避ける

    Kubernetesシステム全体を俯瞰できるダッシュボードが必要 全てのデータをNewRelicへ集約し、システム全体状況を把握できるように • MW以上/OS: Prometheus & NewRelicへのremote write • Kubernetes層: NewRelic Kubernetes Integration
  32. © Kakaku.com Inc. All Rights Reserved. 43 どうやってK8s化していくのか • モニタリングどうすんの

    • ロギングどうすんの • ノード運⽤どうすんの オンプレ特有の悩み
  33. © Kakaku.com Inc. All Rights Reserved. 44 どうやってK8s化していくのか ロギングどうすんの コンテナのログは標準出⼒に出⼒するのが基本です。

    ノードにfluentdなどを仕込み、ノードレベルでログを回収しましょう。 とは⾏かないのが運⽤15年⽬のシステム。 ⼀つのRailsアプリケーションから、10種類を超える種類のログファイル を出⼒していることもある ⽤途が違う10種類のログを、ごちゃっと⼀つの標準出⼒に出⼒するよう 作り変えるのは⾟い
  34. © Kakaku.com Inc. All Rights Reserved. 45 どうやってK8s化していくのか ロギングどうすんの Fluent-bitを各Podのサイドカーに配置し、Cloud

    Loggingへ送信 ログルーター機能を利⽤し、条件に応じて、テーブルやバケットを分けて Big QueryやGCSへも保管 分析⽤ ⻑期 保管⽤ 短期 閲覧⽤
  35. © Kakaku.com Inc. All Rights Reserved. 47 どうやってK8s化していくのか • モニタリングどうすんの

    • ロギングどうすんの • ノード運⽤どうすんの オンプレ特有の悩み
  36. © Kakaku.com Inc. All Rights Reserved. 48 どうやってK8s化していくのか ノード運⽤どうすんの これがかなりきつい。

    何か障害が起きていることはわかる。でも何が原因かわからないことが多い。 • 事例1: 謎のノードメモリ使⽤量⾼騰 • dockerdのメモリリークが原因。Podたちは悪くなかった • 定期的にノードをdrainし、dockerdを再起動する運⽤ • 事例2: 謎の⼤量Pending Podの出現 • CRI経由でのdockerdへのリクエストの遅延が原因。Kubernetesは悪くなかった • なぜ遅延していたかまでは未だ不明 • dockerdのレイテンシを監視 & 再起動する運⽤ • 最終的にコンテナランタイムをdockerdからcontainerdへ変更した 障害から学び、監視 & 運⽤を⽇々ブラッシュアップしていく覚悟が必要
  37. © Kakaku.com Inc. All Rights Reserved. 49 どうやってK8s化していくのか • モニタリングどうすんの

    • ロギングどうすんの • ノード運⽤どうすんの オンプレ特有の悩み
  38. © Kakaku.com Inc. All Rights Reserved. 51 どうやってK8s化していくのか ⾷べログ固有のつらみ •

    ⼤規模MonorepoのCI/CDどうする • ⼤規模アセットどうする
  39. © Kakaku.com Inc. All Rights Reserved. 53 どうやってK8s化していくのか ⼤規模MonorepoのCI/CDどうする Monorepoにあるコンテナイメージの数は14種

    デプロイ頻度(=ビルド頻度)もそこそこ多い ビルドをSaaSで⾏うと、費⽤がとんでもないことになる
  40. © Kakaku.com Inc. All Rights Reserved. 56 どうやってK8s化していくのか ⼤規模アセットどうする Monorepoには、image/js/css、pdfなどの

    静的コンテンツが1GBある 従来、Webサーバで配布していたこれら静的コンテンツを、 Webサーバのイメージ内に含めてしまうと、 コンテナのビルドサイズが巨⼤になり、ノードのディスクは おろか、イメージプルでネットワーク帯域を⾷いつぶしてし まう
  41. © Kakaku.com Inc. All Rights Reserved. 57 どうやってK8s化していくのか ⼤規模アセットどうする CD時に静的コンテンツをNFSへ配置し、

    WebサーバはNFSからサーブする 苦⾁の策だが、リフト & シフトを⽅針に容易な⽅法をとった
  42. © Kakaku.com Inc. All Rights Reserved. 59 まとめ • ⾷べログでは、⻑い歴史を持つMonorepoのつらみを

    解消するために、Kubernetes化を始めた • Kubernetesは複雑。⼩さく初めて徐々に広げていく • オンプレKubernetesはつらみも多いが、システム規 模によってはコスト⾯で⼤きなメリットを得られる • ⾷べログではリフト&シフトでKubernetes化を進めて いる。気になる課題も多いが、その先にあるメリット を早く享受したいため
  43. © Kakaku.com Inc. All Rights Reserved. 61 WE ARE HIRING!

    https://hrmos.co/pages/kakakucom/jobs/1011020 ⾷べログTech Blogはじめました! https://tech-blog.tabelog.com/