Dynamic Dataで閾値を決定するソリューション
SpinnakerとKayenta
Spinnakerは、マルチプラットフォームに対応したCDソリューションです。Kubernetesに限らず、さまざまなプラットフォーム上で動作するアプリケーションのプログレッシブデリバリーに利用することができます。
Spinnakerだけでカナリアを始めとしたさまざまなデリバリー戦略を実行することができますが、自動カナリア分析にはKayentaというコンポーネントを使います。Spinnaker用に開発されたものですが、単体でも動作します。カナリアだけでなく現行バージョンのメトリクスも収集し、それらを比較することで分析を行います。
データポイント毎に、各メトリックはPass、High、Lowのいずれかに分類されます。システムオーナーは、どこに分類されると失敗とみなすかを設定し、それに従って自動で分析が行われます。例えば、HTTPエラーレートが以前より低い場合(Low)は問題ありませんが、高い(High)場合は問題です。
メトリクス毎に許容する変化だけを設定し、細かい閾値のことは考えなくて良い点が魅力です。
Harness Continuous Verification
Harness Continuous Verification(CV)は、Harness社が提供するSaaSの1つで、こちらもマルチプラットフォームに対応しています。
機械学習を用いて閾値を自動で決定することで、変化を続けるアプリケーションへの継続的な分析を可能にすることを目指しています。
HarnessではSpinnakerと同様に、カナリアと現行バージョンのメトリクスを比較するCanary Analysisに加え、以前のデプロイと比較するPrevious Analysisという機能も提供しています。
これは詰まるところ、カナリアをデプロイすることなく新バージョンを分析することができるということです。カナリアのデプロイには、カナリアと現行バージョンをどのように隔離するかという問題が常につきまといます。
カナリアと現行バージョンは、データベースやフロントエンド、ネットワークなど、さまざまなものを共有しています。カナリアデプロイメントとはしばしば、それらの依存関係に起因して予期せぬ結果を招きます。
Harness CVは過去デプロイ時のメトリクスを保存しているため、カナリアの代わりにこのデータを利用することで、そういった複雑さから逃れることができます。
動的に閾値が設定されるのは柔軟ではありますが、恐ろしくもあります。一定ラインを絶対に死守したいメトリクスがある場合のために、Fast-failという形で静的に閾値を設定する方法も提供されています。
まとめ
プログレッシブデリバリーは、理解することよりも継続的に実践することの方が遥かに難しいことが分かっていただけたかと思います。
プロセスのうちいくつかは統一できますが、大部分がシステムの要件によって異なることが主な理由です。
今回触れませんでしたが、まだまだ考えるべきことがたくさんあります。例えばリクエストがコンスタントに来ないサービスの場合はどうでしょうか。適切にカナリア分析するために、擬似的なリクエストを生成したり、トラフィックを複数環境へコピーする機能(トラフィックティーイング)を提供しているソリューションもあります。
しかしそれだけで解決するケースは極めて稀です。また、2つのバージョンのアプリケーションを本当に同時に実行して良いのかどうかは、システムオペレーターにしか分かりません。
このような現実世界への適用の難しさが、デリバリーソリューションが乱立する要因だと思います。それでも、一つ一つのプロセスに向き合う価値は十分にあると思います。
今回紹介したソリューションは一部でしかありませんが、それぞれの特徴に絞って紹介しました。チームのデリバリー戦略を決める際に、本記事が何らかの形で参考になれば幸いです。
参考
- 『サイトリライアビリティワークブック――SREの実践方法』(Betsy Beyer、Niall Richard Murphy、David K. Rensin、Kent Kawahara、Stephen Thorne 編、澤田 武男、関根 達夫、細川 一茂、矢吹 大輔 監訳、玉川 竜司 訳、オライリー・ジャパン、2020年6月)
- Why Perform Continuous Verification?(Harness)
- Monitoring Distributed Systems(Site Reliability Engineering)
- Best practices for configuring canary(Spinnaker)
- How canary judgment works(Spinnaker)
- Flagger
- Argo Rollouts - Kubernetes Progressive Delivery Controller(Argo)
- Towards Progressive Delivery(RedMonk)
