とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

frigga にみるNetflixのクラスタ命名規則とChaos Monkeyがkubernetes provider v2でうまく動かない理由

タイトルが長いけど簡単に言うと、Chaos Monkeyはk8s対応を謳ってますが k8s provider v2(Manifest)で Deployment などを使うと動かないことがあります。

github.com

Chaos Monkey should work with any backend that Spinnaker supports (AWS, Google Compute Engine, Azure, Kubernetes, Cloud Foundry). It has been tested with AWS, GCE, and Kubernetes.

理由はNetflixクラスタ命名規則に従っていないから。

以下、解説

frigga

friggaはNetflixから公開されているOSSです。

github.com

Utilities for working with Asgard named objects

friggaはAsgardで扱うオブジェクトの名前管理(バリデーションなど)をするライブラリらしいです。

AsgardはSpinnakerの前身であり、AWSのアプリケーションデプロイと管理をするWebコンソールでしたが、今はマルチクラウドでCI/CDを実現するSpinnakerに移行したようです。

github.com

Spinnakerでクラスタをデプロイしたことがある人はわかるかもしれませんが、SpinnakerではApplicaation Name, Stack, Detailで appName-stack-detail という名前をつけて各クラスタを把握していますが、以下のコードを見ると実はこれをfriggaが生成/管理していることがわかります。

Chaos Monkey

Chaos MonkeyもNetflixから公開されているOSSです。

Chaos MonkeyはNetflixがChaos Engineeringを行うためのツールとして代表的なものです。

ここでポイントなのはChaos MonkeyはNetflixが開発しており、Chaos Monkeyにおいてもfriggaがライブラリとして使われているということです。

そしてChaos Monkey v2と呼ばれるバージョンからはChaos Monkeyの動作はSpinnakerと連携するようになっています。 Chaos MonkeyはSpinnakerからクラスタインスタンスの名前を取得した上で対象となるインスタンスやPodを落とすようになっています。

Spinnaker

次にSpinnakerですが、上記でも述べたようにSpinnakerはAsgardの後継としてAWSだけではなくマルチクラウドでCI/CDを実現するOSSです。

www.spinnaker.io

対象とするクラウドAWSGCPなど以外にもOpenStackやKubernetesなども含まれており、こうしたクラウド環境に対してChaos Monkeyと連携しChaos Engineeringを実現することが可能となっています。

・・・というのがREADMEなどに書かれている内容なんですが、実はKubernetes provider v2においてdeploymentなどを使うとChaos Monkeyが動きません。

原因は以下のSpinnakerドキュメントに書いてあるとおりです。

Kubernetes Provider V2 (Manifest Based) - Spinnaker

You can deploy existing manifests without rewriting them to adhere to Frigga. Resource relationships (for example between applications and clusters) are managed using Kubernetes annotations, and Spinnaker manages these using its Moniker library.

ApplicationやClusterをKubernetesアノテーションやSpinnakerのMonikerというライブラリで管理するので、friggaに準拠しなくても良いようにしたとのことですが、これが原因でKubernetes provider v2においてはChaos Monkeyがfriggaの命名規則に合致しない deployment appName-stack-detail などという名前が出来上がった結果、friggaが管理する命名規則と合致せずエラーを起こしChaos Monkeyが動かないケースが有るという状態になっております。

一応こちらのIssueに上がっており、Slackでもお話はしてコミュニティには伝えたもののまだ対応はされてない模様。

github.com

Serge Poueme [3 months ago] Hi @mahito seems to be that yes. I just had a call with Ben, Ethan and Isaac ( Spinnaker office hours ) and they mentioned the mismatch between the v2 provider responses and chaosmonkey. A workaround would be to use replicasets instead of deployments. I will see if I can try that on our current dev project with minimal impact on the overall service definition.

今の所Chaos Monkeyの対象を Deployment にすると動かないので ReplicaSetを使うのが回避策らしい。