本日も乙

ただの自己満足な備忘録。

GCE に Spinnaker をインストールする

GCPのデプロイツールとして Spinnaker を検討しています。本記事GCEインスタンスに Spinnaker をインストールしたときのメモを共有します。
なお、 Spinnaker とは?他のCI/CDツールとどう違うの?とかは他の記事に譲ります。

GCPサービスアカウントの作成

spinnaker-gce-account というサービスアカウントを作成し、諸々必要な権限を付与します。

$ SERVICE_ACCOUNT_NAME=spinnaker-gce-account

$ gcloud iam service-accounts create \
    $SERVICE_ACCOUNT_NAME \
    --display-name $SERVICE_ACCOUNT_NAME

$ SA_EMAIL=$(gcloud iam service-accounts list \
    --filter="displayName:$SERVICE_ACCOUNT_NAME" \
    --format='value(email)')

$ PROJECT=$(gcloud info --format='value(config.project)')

# permission to create/modify instances in your project
$ gcloud projects add-iam-policy-binding $PROJECT \
    --member serviceAccount:$SA_EMAIL \
    --role roles/compute.instanceAdmin

# permission to create/modify network settings in your project
$ gcloud projects add-iam-policy-binding $PROJECT \
    --member serviceAccount:$SA_EMAIL \
    --role roles/compute.networkAdmin

# permission to create/modify firewall rules in your project
$ gcloud projects add-iam-policy-binding $PROJECT \
    --member serviceAccount:$SA_EMAIL \
    --role roles/compute.securityAdmin

# permission to create/modify images & disks in your project
$ gcloud projects add-iam-policy-binding $PROJECT \
    --member serviceAccount:$SA_EMAIL \
    --role roles/compute.storageAdmin

# permission to download service account keys in your project
# this is needed by packer to bake GCE images remotely
$ gcloud projects add-iam-policy-binding $PROJECT \
    --member serviceAccount:$SA_EMAIL \
    --role roles/iam.serviceAccountActor

# GCSバケットを外部ストレージとして作成する場合に必要
$ gcloud projects add-iam-policy-binding $PROJECT \
    --role roles/storage.admin --member serviceAccount:$SA_EMAIL

GCEインスタンスの作成、ログイン

GCEインスタンスを作成します。OSは Ubuntu 16.04 LTS、インスタンス名を dev-spinnaker としました。このとき、先ほど作成したサービスアカウントを指定します。

作成が完了したらSSHでログインします。

$ gcloud compute ssh dev-spinnaker

あらかじめパッケージを最新にしておきます。

$ sudo apt-get update
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

# カーネルがアップデートされたら再起動する
$ sudo reboot

Halyard のインストール

Halyard とは Spinnaker の設定やデプロイ、アップデートを操作するコマンドツールです。spinnaker が「帆」で、halyard が「帆や旗を揚げ下げするためのロープ」という意味です。

$ curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
$ sudo bash InstallHalyard.sh
$ hal --version
1.15.0-20190206103304

Halyardのバージョンが Unknown と出てしまうのはバグのようです(issue があります)。
解決されました。

タイムゾーンの設定

$ hal config edit --timezone Asia/Tokyo

Cloud Provider の設定

今回はGCPなので、以下のようにします。

$ hal config provider google enable
The halyard daemon isn't running yet... starting it manually.....
+ Get current deployment
  Success
+ Edit the google provider
  Success
Problems in default.provider.google:
- WARNING Provider google is enabled, but no accounts have been
  configured.

+ Successfully enabled google

もし、VPCネットワークが default ネットワークでない場合は、 作成したネットワーク(sample-network)に変更する必要があります。

$ hal config provider google bakery edit --network sample-network --zone asia-northeast1-a --use-internal-ip true
+ Get current deployment
  Success
+ Get google bakery defaults
  Success
+ Edit google bakery defaults
  Success
Problems in default.provider.google:
- WARNING Provider google is enabled, but no accounts have been
  configured.

+ Successfully edited bakery defaults for google's bakery.

また、--use-internal-ip true でイメージ作成用のVMインスタンスにグローバルIPアドレスをつけないように設定しておきます *1

Spinnaker上のGoogleアカウントを作成します。
ドキュメントではサービスアカウントのJSONファイルパスを指定していますが、今回は先ほど作成したサービスアカウントをGCEインスタンスに設定しているので指定する必要がありません。

$ PROJECT=$(gcloud info --format='value(config.project)')
$ ACCOUNT=my-gce-account
$ hal config provider google account add $ACCOUNT --project $PROJECT
+ Get current deployment
  Success
+ Add the my-gce-account account
  Success
+ Successfully added account my-gce-account for provider
  google.

外部ストレージの設定

今回はGCPなので、Cloud Storage (GCS) にします。
東京リージョンにGCSバケットを作成します。

$ BUCKET_NAME="sample-network-spinnaker"
$ hal config storage gcs edit --bucket $BUCKET_NAME --bucket-location asia-northeast1 --project $PROJECT
+ Get current deployment
  Success
+ Get persistent store
  Success
+ Edit persistent store
  Success
Problems in default.persistentStorage:
- WARNING Your deployment will most likely fail until you configure
  and enable a persistent store.

+ Successfully edited persistent store "gcs".

$ hal config storage edit --type gcs
+ Get current deployment
  Success
+ Get persistent storage settings
  Success
+ Edit persistent storage settings
  Success
+ Successfully edited persistent storage.

Spinnaker のデプロイ

デプロイできるバージョンを見てみます。

$ hal version list
+ Get current deployment
  Success
+ Get Spinnaker version
  Success
+ Get released versions
  Success
+ You are on version "", and the following are available:
 - 1.9.5 (Bright):
   Changelog: https://gist.github.com/spinnaker-release/d24a2c737db49dda644169cf5fe6d56e
   Published: Mon Oct 01 17:15:37 UTC 2018
   (Requires Halyard >= 1.0.0)
 - 1.10.10 (Maniac):
   Changelog: https://gist.github.com/spinnaker-release/8c6e6abe2a0016b823b900523e82cba1
   Published: Sat Jan 12 02:23:07 UTC 2019
   (Requires Halyard >= 1.11)
 - 1.11.5 (Cobra Kai):
   Changelog: https://gist.github.com/spinnaker-release/5cbb402297feb85f82482a73e9428967
   Published: Fri Jan 11 22:45:19 UTC 2019
   (Requires Halyard >= 1.11)

今回は 1.10.10 をデプロイします。

$ hal config version edit --version 1.10.10
$ sudo hal deploy apply

デプロイ完了までに数分程度かかりました。
デプロイ完了後、SpinnakerのUIに接続してみましょう。

$ hal deploy connect
+ Get current deployment
  Success
+ Connect to Spinnaker deployment.
  Success
Spinnaker is installed locally on this machine - no work to do.

GCEインスタンス上で Deck(マネジメントUI) が localhost:9000Gate(APIゲートウェイ) が localhost:8084 でアクセスできるようになりました。
ブラウザから見たいので、ポートフォワードしてあげます。

$ gcloud compute ssh dev-spinnaker -- -L 9000:localhost:9000 -L 8084:localhost:8084

ブラウザから localhost:9000 で Spinnaker のGUIが確認できるはずです。
localhost:8084 が接続できない(Connection refused)場合、sudo journalctl -u gate.service でログを追って原因をつきとめていきましょう。
私の場合、 redis-server.service が起動していなかったため、起動したら解決しました。

$ sudo systemctl start redis-server.service
$ sudo systemctl restart gate.service

各種サービスを自動起動するようにします。

$ sudo systemctl enable spinnaker.service
$ sudo systemctl enable gate.service
$ sudo systemctl enable redis-server.service

参考文献

*1:Cloud NATによってVPCネットワーク内でもインターネットに通信できることが条件です