[Kubernetes]なぜ Spotify のミスがサービスへ影響しなかったのか

株式会社プライムストラクチャーのエンジニアのSayaです。

今回は「Spotify がミスにより Kubernetes の本番クラスタを二度も削除したにも関わらず、なぜ顧客へのサービスへ影響しなかったのか」について以下の記事を参考にまとめてみようと思います。

SpotifyがミスによりKubernetesの本番クラスタを二度も削除。しかし顧客へのサービスにほとんど影響しなかったのはなぜか? - Publickey

Spotify とは

スウェーデンの企業である Spotify Technology によって運営されている、世界最大級のユーザー数を誇る音楽ストリーミングサービスです。

日本でも2016年9月29日よりサービスが開始されました。

Kubernetes とは

コンテナ化したアプリケーションのデプロイ・スケーリング・管理を行うための、オープンソースのコンテナオーケストレーションシステムです。

どのように運用していたのか

Google Cloud Platform 上で運用できる Google Kubernetes Engine を用いていたようです。
米国、欧州、アジアの各リージョンで Kubernetes の本番クラスタを構築し、それぞれ1時間ごとにバックアップを取っていたようです。

最初のミス発生

Spotify のインフラエンジニアである David Xia 氏によると、本番クラスタと同様の機能を持つテストクラスタの操作時に、ブラウザ上で本番クラスタとテストクラスタのタブを開いていたために、テストクラスタでクラスタの削除を行うつもりが誤って本番クラスタでクラスタの削除を行ってしまいました。

一度削除してしまったクラスタを再生成させるには手動での作業が必要で、その手順がマニュアル化されていなかったことやスクリプトにバグがあったことなどにより、作業に3時間15分かかってしまったようです。

2回目のミス発生

またその1ヶ月後にクラスタの作成をコード化してこのようなミスを防ぐために Terraform を導入しました。

Terraform はクラスタの状態をファイルに保存する仕組みを備えてたのですが、導入したてということもあり、その辺の挙動についてはみな詳しくなかったようです。

そしてあるエンジニアがクラスタ定義の動作を確認するためにレビュービルドを行ったところ、知らないうちにクラスタの状態を示すファイルが書き換わってしまい、これを本番用のコードにマージしてしまったようです。
そしてそのコードが本番クラスタに適用されて本番クラスタからアジアリージョンが削除されてしまいました。

その後削除されてしまったアジアリージョンを再構築するために、Terraform のスクリプトをローカルで動作確認を行って本番環境で実行したようです。
しかしローカル環境では気づかなかった本番環境でのパーミッション不足があり、その結果として動作不良により米国リージョンのKubernetesクラスまで削除されてしまいました。

どうやって被害を防いだのか

その結果エンジニアチームが非 Kubernetes ベースの仮想マシンを複数立ち上げることとなり、インフラチームが古いIPアドレスベースで記述されていた部分をすべてアップデートするといった作業に追われたようです。
しかしこの障害によるユーザーに対しての影響の報告は全くなかったそうです。

ユーザーに対しての影響がなかった理由として、計画的に障害に備えていたことと、Kubernetesのような複雑なインフラへの移行は段階的に行い、加えて社内には積極的に学ぶカルチャーが存在していたためだそうです。

さらにサービスディスカバリ機構は Kubernetes のものではなく、社内のものを使って Pod の IP アドレスを指していたため、Kubernetes クラスタが失われたときにはその IP アドレスを削除してサービスディスカバリを再起動することにより、すぐに非 Kubernetes のインスタンスへのフェイルオーバーが可能だったようです。

まとめ

David Xia 氏によるまとめとして、大事なことは、障害に備えてクラスタをちゃんとバックアップしておくこと。リストアのテストをしていないバックアップはバックアップの意味をなしていない、と述べています。
またインフラのコード化をすすめることや、新しいツールの導入は徐々に行うこと、さまざまな状況を想定した複数のディザスタリカバリテストを行うこと、といったことも述べています。

新しいツールを使うと確かに便利になるかもしれませんが、その分新しい予期せぬ事態が起こる可能性があります。
そのための備えとして様々な対策法を事前に練っておく事が重要と言えるようです。

参考文献

SpotifyがミスによりKubernetesの本番クラスタを二度も削除。しかし顧客へのサービスにほとんど影響しなかったのはなぜか? - Publickey