Spinnakerでデプロイ先のクラスタを追加する

Cloud Launcher で起動したspinnakerにデプロイ先のクラスタを追加しようとした際にハマったので手順を記します.

ubuntuユーザで実施しないといけない点と hal deploy applyでだけでは設定が適用されない点に注意が必要です.

# 前提

Cloud Lancherのspinnakerの起動は以下の状態で起動するものとします.

<img width="473" alt="スクリーンショット 2018-04-07 10.23.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/248262/183d1a51-0bd3-f344-047b-703f40b6d41c.png">


- Kubernetes Account Name

  - *first-cluster-k8s*

- Kubernetes Cluster Name

  - *first-cluster*

- Kubernetes Cluster Zone
 
  - *asia-east1-a*

- Google Container Registry Address
 
  - *asia.gcr.io*

- GCR Account Name

  - *first-cluster-gcr*


追加するクラスタは次のものとします.

- クラスタ名
  - *second-cluster*

- ゾーン
  - *asia-east1-a*

# 手順

```bash
$ gcloud compute ssh spinnakerが動いているインスタンス
```

SSHした後，

```bash
$ sudo su - ubuntu
$ chmod +w .kube/config

# kubectlのインストール
$ sudo curl -L https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl
$ sudo chmod 755 /usr/local/bin/kubectl

$ gcloud config set project <PROJECT NAME>
$ gcloud config set container/use_client_certificate true

# Cloud Lancherで起動した際に自動で作成されるspinnaker上のアカウント [first-cluster-k8s]に
# [first-cluster] クラスタのコンテキストを紐付けます.
# 単一のクラスタ管理であればコンテキストが追加されていなくとも動かすことができますが複数のクラスタを管理するには,
# どのアカウントがどのクラスタのコンテキストを有しているかが必要になるためです.
# （デフォルトではコンテキストは紐づいていません）
$ hal config provider kubernetes account edit first-cluster-k8s --context=gke_<PROJECT NAME>_asia-east1-a_first-cluster
```

```bash
$ K8S_ACCOUNT=second-cluster-k8s
$ GCR_ACCOUNT=second-cluster-gcr
$ GCR_ZONE=asia.gcr.ip
$ KEY_FILE_PATH=~/.gcp/gce-for-second-cluster.json
$ SERVICE_ACCOUNT_EMAIL=<サービスアカウントのメールアドレス(自分はデフォルトのCompute Engine default service accountを使いました)>

# サービスアカウントの鍵の作成
$ gcloud iam service-accounts keys create $KEY_FILE_PATH --iam-account $SERVICE_ACCOUNT_EMAIL

# （任意）クラスタ共通で同じサービスアカウントとその鍵を使いまわしていいのであればこれは不要です
$ hal config provider docker-registry account add $GCR_ACCOUNT \
  --address $GCR_ZONE \
  --password-file $KEY_FILE_PATH \
  --username _json_key
```

ここまできたらクラスタの作成をします. (今回は例として **second-cluster** という名前)

注意なのは作成する際にサービスアカウントは上の手順で `$SERVICE_ACCOUNT_EMAIL` に代入したメールアドレスのサービスアカウントを指定することです.

クラスタの作成が完了したらまたspinnakerインスタンスで作業します.

```bash
$ gcloud container clusters get-credentials second-cluster --zone=asia-east1-a
$ hal config provider kubernetes account add $K8S_ACCOUNT \
  --docker-registries $GCR_ACCOUNT \
  --context $(kubectl config current-context)
$ hal deploy apply
```

`hal deploy apply` を実行すると

```bash
+ Get current deployment
  Success
+ Prep deployment
  Success
Problems in halconfig:
- WARNING There is a newer version of Halyard available (0.44.0),
  please update when possible
? sudo apt-get update && sudo apt-get upgrade spinnaker-halyard

+ Preparation complete... deploying Spinnaker
+ Get current deployment
  Success
+ Apply deployment
  Success
+ Run `hal deploy connect` to connect to Spinnaker.
/home/ubuntu/.hal/default/install.sh must be executed with root permissions; exiting
! ERROR Error encountered running script. See above output for more
  details.
```

このように最後にエラーメッセージが表示されます.
このままでは設定が適用されていないので適用するために下記のコマンドを実行します.

```
$ sudo .hal/default/install.sh
```

しばらく時間がかかりますがこれで完了です.


<img width="921" alt="スクリーンショット 2018-04-07 10.15.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/248262/0d823c59-c0eb-eaf8-98b8-9ec4d8dfc624.png">

うまく追加されればspinnakerから複数のアカウントが選択できるようになり，それに紐づくクラスタへのデプロイができるようになります．