継続的デリバリープラットフォーム「Spinnaker」を試してみた

継続的デリバリー(CD)プラットフォームの「Spinnaker」をちょっと触ってみたので記録しておきます。

Spinnakerとは

Spinnakerは、Netflixが開発したマルチクラウドに対応したオープンソースの継続的デリバリープラットフォームです。
例えばJenkinsのCI後、自動でデプロイをしてくれたりするのがこいつです。
ただデプロイするだけであればいくらでも手段はありますが、
うまいことブルーグリーンデプロイをしてくれたりロールバックしてくれたりします。

またこのデプロイのトリガーもcronやJenkinsや手動だったり色々可能です。
例えばKubernatesのデプロイはインフラ担当者でないと難しいものではあるのですが
それもSpinnakerがいい感じにデプロイをしてくれるのでその課題もなくなります。

対象のマルチクラウドは公式ページだと

  • AWS EC2
  • Kubernates
  • Google Cloud Engine
  • Google Kubernates Engine
  • Google App Engine
  • Microsoft Azure
  • OpenStack

今後も増えていくみたいです。
こう見ると主要なパブリッククラウドにも対応しているし、
KubernatesやOpenStackにも対応しているので今後も期待できるものではないでしょうか。

用語

このSpinnakerを利用する上で理解していないとわかりづらいものがあったのでここで整理しておきます。

https://www.spinnaker.io/concepts/

ServerGroup

インスタンス数やオートスケーリングのポリシーなどの基本設定や、
DockerやVMイメージを指定して、展開されたインスタンスの集合のことです。

環境(開発/検証/本番など)単位でServerGroupを作ることになると思います。

Cluster

Server Groupをグループ化したものがClusterです。
もうデプロイ済みでトラフィックに乗っているものです。

Application

Clusterをグループ化したものがApplicationです。
通常のアプリケーションの単位で分割していくものだと思います。

Security Group

IP範囲(CIDR)とポートを指定して通信を制限する機能です。
AWSのセキュリティグループみたいなものです。

LoadBalancer

ServerGroup内のインスタンス間のトラフィックのバランシングを行います。
AWSのELBのようなものです。

Pipeline

ステージと呼ばれるいくつかのアクション(デプロイ、ManualJudgment、イメージの取得など)を組み合わせて
デプロイの流れを作っていくものです。

https://www.spinnaker.io/concepts/

触ってみた

ほとんど以下のドキュメント通り。
https://cloud.google.com/solutions/managing-deployments-on-gcp-with-spinnaker?hl=ja

Spinnakerのデプロイ

Spinnakerの用意はGCPアカウントを持っていればすごく簡単でした。
CloudLancharで数クリックで用意できました。

デプロイが終わると以下のような画面が表示されます。

「使うんならSSHトンネル通して見るんやで」って書いてあります。
黒くなってて見えないけど、ここにgloudコマンドが書いてあるので、ローカルPCで実行してブラウザで「localhost:9000」を見るとSpinnakerが表示されます。

WindowsPCでの確認方法

かなり蛇足ですが、Windows10の環境だとWindows Subsystem for Linuxを使うと
gcloudの導入が楽だったのでおすすめです。

Applicationの作成

Spinnakerでデプロイするためには、まずApplicationを作る必要があります。

Name: tutorial
Owner Email: 適当なメールアドレス
Instance Health: Consider only ~にチェック(タスクの実行時にクラウド プロバイダの正常性のみ考慮する)

作成ボタンをクリック。

Server Groupの作成

続いてClusterタブに行き、Sever Groupを作成します。

Stack: test (こうするとCluster名がtutorial-test となる)
Image: デプロイするイメージを指定
Instance Type: Micro Utilityで「Micro」を選択

作成ボタンをクリック。

Pipileneの作成

続いてPipelineタブに行き、パイプラインを作っていきます。


Pipeline Name: Promote Test to Stage

以下の画面が出るので「Add stage」をクリック

第1ステージを入力

第1ステージでは、「tutorial-test」クラスタのイメージを検索します。
Type: Find Image from Cluster
Find Image from Cluster Configuration
Cluster: tutorial-test
Server Group Selection: Newest(最新)

第2ステージを入力

第2ステージでは、第1ステージで見つけたイメージをステージング環境にデプロイします。
Type: Deploy

Deploy Configurationの「add server group」をクリック。
Copy configuration fromは「None」。

ステージング環境のクラスタの設定を行います。
Stack: stage
Strategy: Highlander(新しいクラスタのヘルスチェック確認後、古いクラスタを削除する)
あとは最初に設定したクラスタの設定と同じです。

デプロイしてみる

ではいま作ったパイプラインを実行してみます。
ちゃんと動けばstageのインスタンスが出来てるはずです。

できてるっぽい

実際にできたインスタンスを見てみると、stageのインスタンスがいる。

このデプロイをもう1度実行すると、Stageのインスタンスが切り替わるはずです。
ということでもう一度デプロイしてみる。

変わりました

最後に

Spinnakerを触ってみて感じたのは

  • ブルーグリーンデプロイのようなデプロイ戦略を簡単に実現できて楽
  • immutable infrastructureを強制できて良い
  • トリガーも多種多様なので扱いやすい
  • PipelineやServer Groupはソースコード管理できないのでしたい

なかなかこういうのを自分たちで実装するのは大変なので
OSSとして使えるのはすごくありがたいです。

今回はGoogleが公開しているサンプルをそのままやってみましたが、
機会があればより実践的なものを作っていきたいと思います。

では!