2022/10/30 開催の TECHHILLS 「Kubernetes/Fargateの導入・活用事例-カカクコム×CROOZ×ナビタイム」 発表資料です。
イベントURL https://techplay.jp/event/877265
© Kakaku.com Inc. All Rights Reserved. 1⾷べログ on Kubernetes株式会社カカクコム⾷べログシステム本部技術部 SREチーム 下國峰昌2022年11⽉30⽇(⽔)運⽤15年以上の⼤規模レガシーシステムをKubernetesに乗せていく
View Slide
© Kakaku.com Inc. All Rights Reserved. 2下國 峰昌(しもくに みねまさ)SREチーム 技術専⾨職2019年中途⼊社。⾷べログではSRE⼀本でやってきました最近の活動• ⾷べログオーダー インフラ、CI/CD、モニタリング構築• Google Dataflow + Big Queryでアクセス解析システムを刷新• OpsGenieクライアントRuby gemの作成• ⾷べログ既存システムのKubernetes化
© Kakaku.com Inc. All Rights Reserved. 3本⽇お持ち帰り頂きたいこと• システムをKubernetes化する動機• オンプレKubernetesかマネージドKubernetesかの選択基準• オンプレKubernetesのいいところとつらいところ
© Kakaku.com Inc. All Rights Reserved. 4⽬次 1. ⾷べログのシステム構成の紹介2. なぜK8s化するのか3. 何からK8s化に着⼿するのか4. どうやってK8s化していくのか5. まとめ
© Kakaku.com Inc. All Rights Reserved. 51. ⾷べログのシステム構成の紹介
© Kakaku.com Inc. All Rights Reserved. 6⾷べログのシステム構成の紹介⽇本最⼤級のレストラン検索・予約サイト• 約9,000万MAU(2022年9⽉)• レストランの⼝コミ・写真• レストランのネット予約• 飲⾷店DX(予約台帳、⾷べログオーダー、⾷べログ仕⼊れ)• お取り寄せEC(⾷べログモール)
© Kakaku.com Inc. All Rights Reserved. 7⾷べログのシステム構成の紹介インフラ⽬線から⾒ると?
© Kakaku.com Inc. All Rights Reserved. 8⾷べログのシステム構成の紹介• この構成になって15年⽬• ほぼオンプレのVM ⼀部ECSやGKEあり• リクエスト数 80億req/⽉• オンプレサーバ台数 数百台• ハイスペックマシン多め• 12core 32GBmemなど
© Kakaku.com Inc. All Rights Reserved. 92. なぜK8s化するのか
© Kakaku.com Inc. All Rights Reserved. 10なぜK8s化するのかこいつをなんとかしたい。
© Kakaku.com Inc. All Rights Reserved. 11なぜK8s化するのかこのMonorepoが抱える課題• デプロイ/ロールバックに時間がかかる。MTTRが⻑い• ⼤量のサーバに対するインフラ作業がトイル• 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
© Kakaku.com Inc. All Rights Reserved. 12なぜK8s化するのかこのMonorepoが抱える課題• デプロイ/ロールバックに時間がかかる。MTTRが⻑い• ⼤量のサーバに対するインフラ作業がトイル• 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
© Kakaku.com Inc. All Rights Reserved. 13なぜK8s化するのかデプロイ/ロールバックに時間がかかる。MTTRが⻑いMonorepoのデプロイ回数: 4回/⽇1⽇4回、エンジニアがデプロイ作業に拘束される
© Kakaku.com Inc. All Rights Reserved. 14なぜK8s化するのかデプロイ/ロールバックに時間がかかる。MTTRが⻑い7min.
© Kakaku.com Inc. All Rights Reserved. 15なぜK8s化するのかデプロイ/ロールバックに時間がかかる。MTTRが⻑いサーバが増え続ける中、これ以上デプロイを⾼速にするのは、今のアーキテクチャでは厳しい。エンジニアがデプロイに捧げる時間を減らし、開発作業に集中できるようにしたい。デプロイ時間が縮まれば、デプロイ頻度も上げられる。また、デプロイ起因で障害が発⽣した際には、即座にロールバックできるようにしたい。
© Kakaku.com Inc. All Rights Reserved. 16なぜK8s化するのかデプロイ/ロールバックに時間がかかる。MTTRが⻑いKubernetes化すると、Argo CDなどのKubernetes⽤ GitOps CDツールを使えば、デプロイ担当者は、GitHub上のプルリクエストをマージするだけで完了!ロールバックは、マージしたプルリクエストをリバートするだけ!3sec.
© Kakaku.com Inc. All Rights Reserved. 17なぜK8s化するのかこのMonorepoが抱える課題• デプロイ/ロールバックに時間がかかる。MTTRが⻑い• ⼤量のサーバに対するインフラ作業がトイル• 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
© Kakaku.com Inc. All Rights Reserved. 18なぜK8s化するのか⼤量のサーバに対するインフラ作業がトイルhttps://www.tenable.com/cve/CVE-2019-19952システムを運⽤していると、ある⽇突然こんなのがぽんと降ってくる。
© Kakaku.com Inc. All Rights Reserved. 19なぜK8s化するのか⼤量のサーバに対するインフラ作業がトイルサーバ数百台の依存コンポーネントバージョンアップ作業しかも緊急。下⼿すると3時間作業⼯数/精神的負担が、突発的に発⽣し、SRE本来の業務へ割く⼒を奪っていた。
© Kakaku.com Inc. All Rights Reserved. 20なぜK8s化するのか⼤量のサーバに対するインフラ作業がトイルKubernetes化すると、ここを⼤幅に削減できる。Dockerfileを書き換えてビルドし、applyするのみ(数秒)※イメージです。現在のバージョンとは異なります• Ansibleを流す時間(下⼿すると3時間)• その間のシステムモニタリング
© Kakaku.com Inc. All Rights Reserved. 21なぜK8s化するのかこのMonorepoが抱える課題• デプロイ/ロールバックに時間がかかる。MTTRが⻑い• ⼤量のサーバに対するインフラ作業がトイル• 無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
© Kakaku.com Inc. All Rights Reserved. 22なぜK8s化するのか無数の歴史的負債があるが、それに⼿を⼊れるのが怖い
© Kakaku.com Inc. All Rights Reserved. 23なぜK8s化するのか無数の歴史的負債があるが、それに⼿を⼊れるのが怖いこのNW経路いる?このDB接続いる?これデッドコードっぽいから消したいなこれ機能ごと別システムに切り出したいなこのシステムだけES6使えないんだけど
© Kakaku.com Inc. All Rights Reserved. 24なぜK8s化するのか無数の歴史的負債があるが、それに⼿を⼊れるのが怖いこのNW経路いる?このDB接続いる?これデッドコードっぽいから消したいなこれ機能ごと別システムに切り出したいなこのシステムだけES6使えないんだけどでもそれを検証するのに⼯数かかるし、えいやで出して障害起こしてもロールバックに時間かかるし触らんとこ。。。
© Kakaku.com Inc. All Rights Reserved. 25なぜK8s化するのか無数の歴史的負債があるが、それに⼿を⼊れるのが怖い• リグレッションテストをきちんと⾏える環境がない• ステージング環境はあるけど、本番と微妙に違う• カナリアリリース/ブルーグリーンデプロイメントの仕組みがない• いきなり改修したコードに100%トラフィックが流れてしまう• コードの本番リリース後のロールバック機能がない• ミュータブルなVMへの構成変更はロールバック不可ために、歴史的負債の返済に⼿を出しづらい。
© Kakaku.com Inc. All Rights Reserved. 26なぜK8s化するのか無数の歴史的負債があるが、それに⼿を⼊れるのが怖いKubernetes化すると、• 本番環境とほぼ同じステージング環境が⼿に⼊る• マニフェストで宣⾔的にインフラを定義できる• カナリアリリース等の仕組みが導⼊しやすい• 試しに1%だけ改修したコードへトラフィックを流せる• コードリリースを⼀瞬でロールバックできる• インフラがイミュータブルになり、変更がロールバック可能になるため、負債返済のための攻めのリリースができる※リグレッションテスト環境も構築を進めています!⾷べログのソフトウェアテスト⾃動化デザインパターン
© Kakaku.com Inc. All Rights Reserved. 27なぜK8s化するのかこのMonorepoが抱える課題• デプロイ/ロールバックに時間がかかる。MTTRが⻑い• ⼤量のサーバに対するインフラ作業がトイル• 無数の歴史的負債があるが、それに⼿を⼊れるのが怖いまとめを、解消したい。その⼿段として、Kubernetesを選びました。
© Kakaku.com Inc. All Rights Reserved. 283.何からK8s化に着⼿するのか
© Kakaku.com Inc. All Rights Reserved. 29何からK8s化に着⼿するのかKubernetes導⼊前の懸念難しいんでしょ?
© 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/
© Kakaku.com Inc. All Rights Reserved. 31何からK8s化に着⼿するのかKubernetes オンプレでいくかクラウドで⾏くかクラウドの魅⼒• 運⽤に必要なものが⼀通り揃っている• 採⽤事例が多く、情報が多い• ノードの管理がほぼ不要• これがしんどい• ECS + Fargateなどのマネージドサービス使えばもっと楽オンプレの魅⼒• カカクコム社として統⼀的なプラットフォーム• ハイスペックなマシンを⼤量に並べるとなると圧倒的に安い• 80億req/⽉のネットワーキング料⾦となると圧倒的に安い=> 原則オンプレでいくことに
© Kakaku.com Inc. All Rights Reserved. 32何からK8s化に着⼿するのかKubernetes化進めていくぜ早くKubernetesに乗せたいのはメインサービスのMonorepo。でも、オンプレKubernetesの運⽤ノウハウがなかったそこで、事故っても影響が⼩さく、簡素なシステムからKubernetes化していった。1. 社内ツール2. データベースを持たないステートレスなシステム3. 他システムから参照されない独⽴したDBを⼀つだけ持つシステム
© Kakaku.com Inc. All Rights Reserved. 33何からK8s化に着⼿するのか新規サービスはもう全部KubernetesでオンプレKubernetesの運⽤ノウハウがたまってきた=> 新規サービスは全部オンプレKubernetesでいこう!=> Next.jsやGraphQL(NestJS)のKubernetes化の知⾒もゲット
© Kakaku.com Inc. All Rights Reserved. 34何からK8s化に着⼿するのか満を持してMonorepoのKubernetes化へ⼀旦、Monorepo上のアプリケーションすべてをKubernetes上で稼働させてしまうその後、ドメイン単位でVMからKubernetesへ切り替えていく=>影響範囲を局所化しつつ切り替え可能にINSERVICE INSERVICEMAINTENANCEMAINTENANCEMonorepo
© Kakaku.com Inc. All Rights Reserved. 354. どうやってK8s化していくのか
© Kakaku.com Inc. All Rights Reserved. 36どうやってK8s化していくのか⼤前提は、リフト & シフト⾷べログは、運⽤15年を過ぎた歴史あるシステム。Kubernetes移⾏にあたってシステム全体を⾒回したとき、つい直したくなる地雷も多く埋まっている。しかし、いま⼤規模改修をしてもMTTRが⻑いまま。まずはMTTRを短くするためにKubernetesに乗せる。地雷を撤去していくのはそのあと。この⽬的を⾒失わずにやっていきます。
© Kakaku.com Inc. All Rights Reserved. 37どうやってK8s化していくのか• モニタリングどうすんの• ロギングどうすんの• ノード運⽤どうすんのオンプレ特有の悩み
© Kakaku.com Inc. All Rights Reserved. 38どうやってK8s化していくのか• モニタリングどうすんの• ロギングどうすんの• ノード運⽤どうすんのオンプレ特有の悩み
© Kakaku.com Inc. All Rights Reserved. 39どうやってK8s化していくのかモニタリングどうすんのVM時代のホストベース監視ツールは使えないKubernetes上ではPodが次々に⽣まれ変わるためサービスディスカバリ機能を備えた監視ツールが必要ÞPrometheusを採⽤サーバAにはこの監視を、サーバBにはこの監視を……Pod AもPod Bももういない?!Pod Cは何を監視すれば?
© Kakaku.com Inc. All Rights Reserved. 40どうやってK8s化していくのかモニタリングどうすんのPrometheusは、デフォルトでは15⽇でデータが揮発するÞremote write機能を使い、NewRelicへデータを永続化メインはオンプレでも、任せられるものはSaaSに任せたほうがいいよね。
© Kakaku.com Inc. All Rights Reserved. 41どうやってK8s化していくのかモニタリングどうすんの監視の分断を避けるKubernetesで障害が起きると、当然AP層でも障害になるこのとき、監視の⽬が分断していると、原因に気付くのが難しいKubernetesは⼤量の複雑なコンポーネントが相互作⽤して稼働しているため
© Kakaku.com Inc. All Rights Reserved. 42どうやってK8s化していくのかモニタリングどうすんの監視の分断を避けるKubernetesシステム全体を俯瞰できるダッシュボードが必要全てのデータをNewRelicへ集約し、システム全体状況を把握できるように• MW以上/OS: Prometheus & NewRelicへのremote write• Kubernetes層: NewRelic Kubernetes Integration
© Kakaku.com Inc. All Rights Reserved. 43どうやってK8s化していくのか• モニタリングどうすんの• ロギングどうすんの• ノード運⽤どうすんのオンプレ特有の悩み
© Kakaku.com Inc. All Rights Reserved. 44どうやってK8s化していくのかロギングどうすんのコンテナのログは標準出⼒に出⼒するのが基本です。ノードにfluentdなどを仕込み、ノードレベルでログを回収しましょう。とは⾏かないのが運⽤15年⽬のシステム。⼀つのRailsアプリケーションから、10種類を超える種類のログファイルを出⼒していることもある⽤途が違う10種類のログを、ごちゃっと⼀つの標準出⼒に出⼒するよう作り変えるのは⾟い
© Kakaku.com Inc. All Rights Reserved. 45どうやってK8s化していくのかロギングどうすんのFluent-bitを各Podのサイドカーに配置し、Cloud Loggingへ送信ログルーター機能を利⽤し、条件に応じて、テーブルやバケットを分けてBig QueryやGCSへも保管分析⽤⻑期保管⽤短期閲覧⽤
© Kakaku.com Inc. All Rights Reserved. 46どうやってK8s化していくのかロギングどうすんの個⼈情報を含むログは、クラウドには置きたくない=>オンプレのNFSボリュームへ保管。別サーバにもマウントし、閲覧可能に
© Kakaku.com Inc. All Rights Reserved. 47どうやってK8s化していくのか• モニタリングどうすんの• ロギングどうすんの• ノード運⽤どうすんのオンプレ特有の悩み
© Kakaku.com Inc. All Rights Reserved. 48どうやってK8s化していくのかノード運⽤どうすんのこれがかなりきつい。何か障害が起きていることはわかる。でも何が原因かわからないことが多い。• 事例1: 謎のノードメモリ使⽤量⾼騰• dockerdのメモリリークが原因。Podたちは悪くなかった• 定期的にノードをdrainし、dockerdを再起動する運⽤• 事例2: 謎の⼤量Pending Podの出現• CRI経由でのdockerdへのリクエストの遅延が原因。Kubernetesは悪くなかった• なぜ遅延していたかまでは未だ不明• dockerdのレイテンシを監視 & 再起動する運⽤• 最終的にコンテナランタイムをdockerdからcontainerdへ変更した障害から学び、監視 & 運⽤を⽇々ブラッシュアップしていく覚悟が必要
© Kakaku.com Inc. All Rights Reserved. 49どうやってK8s化していくのか• モニタリングどうすんの• ロギングどうすんの• ノード運⽤どうすんのオンプレ特有の悩み
© Kakaku.com Inc. All Rights Reserved. 50どうやってK8s化していくのか逆に⾔うと、ここまでをあまり気にしなくてもなんとなく使えるのがマネージドKubernetesのいいところ
© Kakaku.com Inc. All Rights Reserved. 51どうやってK8s化していくのか⾷べログ固有のつらみ• ⼤規模MonorepoのCI/CDどうする• ⼤規模アセットどうする
© Kakaku.com Inc. All Rights Reserved. 52どうやってK8s化していくのか• ⼤規模MonorepoのCI/CDどうする• ⼤規模アセットどうする⾷べログ固有のつらみ
© Kakaku.com Inc. All Rights Reserved. 53どうやってK8s化していくのか⼤規模MonorepoのCI/CDどうするMonorepoにあるコンテナイメージの数は14種デプロイ頻度(=ビルド頻度)もそこそこ多いビルドをSaaSで⾏うと、費⽤がとんでもないことになる
© Kakaku.com Inc. All Rights Reserved. 54どうやってK8s化していくのか⼤規模MonorepoのCI/CDどうするイメージビルド基盤を内製SaaSを使えば楽だが、⻑期的コストを鑑みた
© Kakaku.com Inc. All Rights Reserved. 55どうやってK8s化していくのか• ⼤規模MonorepoのCI/CDどうする• ⼤規模アセットどうする⾷べログ固有のつらみ
© Kakaku.com Inc. All Rights Reserved. 56どうやってK8s化していくのか⼤規模アセットどうするMonorepoには、image/js/css、pdfなどの静的コンテンツが1GBある従来、Webサーバで配布していたこれら静的コンテンツを、Webサーバのイメージ内に含めてしまうと、コンテナのビルドサイズが巨⼤になり、ノードのディスクはおろか、イメージプルでネットワーク帯域を⾷いつぶしてしまう
© Kakaku.com Inc. All Rights Reserved. 57どうやってK8s化していくのか⼤規模アセットどうするCD時に静的コンテンツをNFSへ配置し、WebサーバはNFSからサーブする苦⾁の策だが、リフト & シフトを⽅針に容易な⽅法をとった
© Kakaku.com Inc. All Rights Reserved. 585.まとめ
© Kakaku.com Inc. All Rights Reserved. 59まとめ• ⾷べログでは、⻑い歴史を持つMonorepoのつらみを解消するために、Kubernetes化を始めた• Kubernetesは複雑。⼩さく初めて徐々に広げていく• オンプレKubernetesはつらみも多いが、システム規模によってはコスト⾯で⼤きなメリットを得られる• ⾷べログではリフト&シフトでKubernetes化を進めている。気になる課題も多いが、その先にあるメリットを早く享受したいため
© Kakaku.com Inc. All Rights Reserved. 60ご清聴ありがとうございました
© Kakaku.com Inc. All Rights Reserved. 61WE ARE HIRING!https://hrmos.co/pages/kakakucom/jobs/1011020⾷べログTech Blogはじめました!https://tech-blog.tabelog.com/