Edited at

Spinnaker on GKE (導入編)

More than 1 year has passed since last update.


ToDo

Halyard on GKE Quickstart - [https://www.spinnaker.io/setup/quickstart/halyard-gke/]

これをそのまま(最新版にして, asia-northeast1-cゾーンで)やってみた。


Spinnaker?

-> CD (Continuous Delivery Platform)

メリットは

・Immutable Infrastructure *1 の徹底

・予測可能で安全なデプロイ パイプラインの作成

 (cronによってもパイプライン起動可 → k8s jobsの管理にも)

役割

spinnaker_netflix.png

(引用:参考記事①)

これにより、リリースにおける

安定したイメージの作成 、デプロイ後のテスト、問題が発生した場合の切り戻し

などの作業を"ちゃんと"管理できる

この "ちゃんと" の部分を今回は検証したい

→ 今回は導入のみ


Halyard?

-> Spinnaker自体のDeploy管理ツール

Spinnakerは複数のコンポーネント(コンテナ)で形成されているため、Halyardでの管理が推奨されている。

Spinnakerの各コンポーネントのDeploy、Test、Updateの実行が含まれる。


必要になるもの

・GCPアカウント

  ・gcloudコマンド (GoogleCloudSDK)

  ・GCE, GKEを使用

  ・以下のAPI有効化

   Google Identity and Access Management (IAM) API

   Google Cloud Resource Manager API


作るもの

spinnaker_deployment.png

GCEにHalyardを展開、そこからGKEにSpinnakerを展開する


やってみた

少し時間がかかるので、先にGKEのクラスタを作成しておく

(1.8.4-gke.0, asia-northeast1-c, あとはデフォルト)

左にVM(GCE)作成

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

HALYARD_SA=halyard-service-account

gcloud iam service-accounts create $HALYARD_SA \
--project=$GCP_PROJECT \
--display-name $HALYARD_SA

HALYARD_SA_EMAIL=$(gcloud iam service-accounts list \
--project=$GCP_PROJECT \
--filter="displayName:$HALYARD_SA" \
--format='value(email)')

gcloud projects add-iam-policy-binding $GCP_PROJECT \
--role roles/iam.serviceAccountKeyAdmin \
--member serviceAccount:$HALYARD_SA_EMAIL

gcloud projects add-iam-policy-binding $GCP_PROJECT \
--role roles/container.admin \
--member serviceAccount:$HALYARD_SA_EMAIL

GCS_SA=gcs-service-account

gcloud iam service-accounts create $GCS_SA \
--project=$GCP_PROJECT \
--display-name $GCS_SA

GCS_SA_EMAIL=$(gcloud iam service-accounts list \
--project=$GCP_PROJECT \
--filter="displayName:$GCS_SA" \
--format='value(email)')

gcloud projects add-iam-policy-binding $GCP_PROJECT \
--role roles/storage.admin \
--member serviceAccount:$GCS_SA_EMAIL

HALYARD_HOST=$USER-halyard-`date +%m%d`

gcloud compute instances create $HALYARD_HOST \
--project=$GCP_PROJECT \
--zone=asia-northeast1-c \
--scopes=cloud-platform \
--service-account=$HALYARD_SA_EMAIL \
--image-project=ubuntu-os-cloud \
--image-family=ubuntu-1404-lts \
--machine-type=n1-standard-4

VM(GCE)にSSHで入る

gcloud compute ssh $HALYARD_HOST \

--project=$GCP_PROJECT \
--zone=asia-northeast1-c \
--ssh-flag="-L 9000:localhost:9000" \
--ssh-flag="-L 8084:localhost:8084"

最新の安定版 kubectl を入れる。(今回はv1.8.4が入った)

→ 試してみたが画面表示されないバグになって、かなり詰まった。

チュートリアル通りここはv1.6.1を入れる。

curl -O https://storage.googleapis.com/kubernetes-release/release/v1.6.1/bin/linux/amd64/kubectl

chmod +x kubectl

sudo mv kubectl /usr/local/bin/kubectl

安定版halyardを入れる。

curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/stable/InstallHalyard.sh

sudo bash InstallHalyard.sh

. ~/.bashrc

GKE登録

GKE_CLUSTER_NAME={YOUR_GKE_CLUSTER_NAME}

GKE_CLUSTER_ZONE={YOUR_GKE_CLUSTER_ZONE}

gcloud config set container/use_client_certificate true

gcloud container clusters get-credentials $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE

GCS_SA=gcs-service-account

GCS_SA_DEST=~/.gcp/gcp.json

mkdir -p $(dirname $GCS_SA_DEST)

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

gcloud iam service-accounts keys create $GCS_SA_DEST \
--iam-account $GCS_SA_EMAIL

Spinnaker最新バージョンを使うように設定(今回はv1.5.1が設定された)

hal config version edit --version $(hal version latest -q)

GCS設定

hal config storage gcs edit \

--project $(gcloud info --format='value(config.project)') \
--json-path ~/.gcp/gcp.json

hal config storage edit --type gcs

GCR設定

hal config provider docker-registry enable

hal config provider docker-registry account add my-gcr-account \
--address asia.gcr.io \
--password-file ~/.gcp/gcp.json \
--username _json_key

k8s プロバイダ設定

hal config provider kubernetes enable

hal config provider kubernetes account add my-k8s-account \
--docker-registries my-gcr-account \
--context $(kubectl config current-context)

Deploy Spinnaker!

hal config deploy edit \

--account-name my-k8s-account \
--type distributed

hal deploy apply

Halyard (GCP) ⇔ Spinnaker (GKE) 接続

hal deploy connect

今回はローカルから9000番をリンクしてSSH接続したので、

http://localhost:9000 でSpinnakerに接続

※ deploy後、OAuthを設定してない、GCRに何もないなどWarningが出るが接続はできる

 

Screen Shot 2017-12-07 at 15.49.29.png


感想

長くなったので、実動作については別記事に書こうと思います。

コンテナレジストリ(今回はGCR)と連携してくれてとても便利そう。

halコマンド覚えないと。中身の動作まで理解できたらk8sの勉強にもなりそう。

hal deploy apply SoCOOL! Halyardは常駐させなくていい?


大変参考になる記事

Global Continuous Delivery with Spinnaker - Netflix 本家ブログ

→ はじめに。

SpinnakerによるContinuous Delivery - メルカリブログ

→ 分かりやすいく使いたくなる記事。簡潔にまとまってて素晴らしい。

Compute Engine での Spinnaker の実行 - GCP Blog

→ "Spinnakerについて" のセクションが分かりやすい


*1 不変のインフラ (参考:http://image.itmedia.co.jp/l/im/enterprise/articles/1701/23/l_kz_kore0123_01.jpg)