ブラックフライデーの13%のリクエストエラーからゼロダウンタイムへ:コンテナ化デプロイメントによりサーバーコストを60%削減
昨年のブラックフライデーには、私たちのアドレス解決インターフェースが完全にダウンしました。13%のリクエストで429エラーが発生し、カスタマーサービスのバックエンドには300件以上の店舗からの苦情が寄せられました。3つのバックエンドサーバーが24時間連続でフル稼働し、ようやくピークを乗り越えることができました。当時、私たちのサービスは2台の固定構成のクラウドサーバー上で動いており、スケーリングはすべて手動で設定を変更することによって行われていました。新しいインスタンスが起動するまでには、トラフィックのピークが過ぎてしまっていました。
まず、コンテナ化デプロイメントとは何かを簡単に説明しましょう。
要するに、あなたのコード、依存ライブラリ、設定ファイルをすべてまとめて、数MBから数百MBの標準化された「コンテナ」にパッケージ化するのです。どのサーバーで実行しても、運用環境は100%同じになります。私たちが最初にパッケージ化した住所解決サービスのイメージのサイズは187MB、起動プロセス全体は10秒を超えません。
実際に得られた3つの主要な収益

- 自動的なスケーリング機能が本当に助かりました:今年のブラックフライデーにはトラフィックが3倍に増加しましたが、システムが自動的に27のコンテナインスタンスを起動し、ピークが過ぎた後は自動的に3つに削減されました。全過程で人の介入は一切なく、エラー率は0.1%以下に直接下がりました。
- 環境不一致によるバグが完全に解消されました:以前はローカル環境では問題なく動作していたのに、本番環境に移すとすぐにエラーが発生するという不可解な問題で、私たちのバグの総数の40%を占めていました。コンテナに移行してからは、このような問題は一切発生していません。
- サーバーコストが半分に削減されました:以前はピーク時に対応するために常に8台の高性能サーバーをレンタルしていましたが、通常の使用率は15%に過ぎませんでした。今では実際の使用量に応じて料金を支払うため、年間でサーバー費用を60%節約できました。
良い点だけを見ているわけにはいきませんね。これらの落とし穴にはしっかりとはまってしまいました。
コンテナに初めてデータを格納したとき、手間を省くためにログや一時ファイルをすべてコンテナ内に保存してしまいました。その結果、インスタンスが自動的に削除されてしまい、3日分のリクエストログがすべて失われてしまいました。データを復元するのに2日間もかかりました。また、イメージに不要な依存関係が多く含まれていたため、起動時間が10秒から2分に増加し、突発的なトラフィックが増加したときには拡張する間もなく、また障害が発生するところでした。
最も見過ごされがちなのは権限の問題です。当初、コンテナにroot権限を与えたところ、マイニングプログラムがその隙をついてCPUリソースの30%を占有してしまいました。1週間後にようやく監視システムでその異常に気づきました。
まず、本当にそれを使うべきかどうかよく考えてください。

もしあなたが数人の小さなチームで、トラフィックの変動が非常に少ない内部ツールを開発しており、サービスも1つか2つしかないのであれば、わざわざ大変なことをする必要はありません。サーバーをレンタルして使う方がずっと簡単です。
しかし、もしあなたのサービスのトラフィックが大きく変動したり、頻繁にアップデートを行う必要があったり、チーム内で異なる人々が開発している環境が互いに干渉したりする場合、または不要なサーバーリソースにお金を無駄にしていると感じているなら、コンテナ化デプロイは確かに1週間の時間をかけて試してみる価値があります。
初めての方への3つの具体的なアドバイス
- K8Sクラスターを使う前に、まずはDocker Composeを使ってシングルマシンでのデプロイを試してみてください。パッケージング、実行、ログのマウントの仕組みをしっかりと理解してください。私たちも最初の3ヶ月はそうやっていましたが、それで全く問題ありませんでした。
- 初回のイメージパッケージングでは「最小限の原則」に従い、実行に必要な依存関係のみをインストールしています。alpineベースのイメージを使用することで、サイズを半分以上削減することができます。
- 生成されたすべてのデータやログは、コンテナ外部のストレージボリュームにマウントする必要があります。絶対にコンテナ内に保存してはいけません。この点は、あなたのチームの運用規程の最初に明記されています。
よくある小さな質問とその答え
質問:私たちのチームにはコンテナについて理解している人がいませんが、学習コストは高くなりすぎるでしょうか?
答:基本的な使い方については、公式の入門ドキュメントを2日間読めば、最初のサービスを動かすことができます。もっと高度なクラスター設定については、実際に必要になったときに学んでも全く問題ありません。
質問:既存のサービスをコンテナに移行するのは大変ですか?
私たちの3つのバックエンドサービスは、1週間かけてすべて移行が完了しました。その大部分の時間は依存関係の整理に費やされましたが、実際にDockerfileを作成したのは1日未満でした。
役に立ちましたか?