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:9000
、Gate(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ネットワーク内でもインターネットに通信できることが条件です