Loading
BLOG 開発者ブログ

2018年12月11日

初めてのSpinnaker 〜継続的デリバリー(CD)の実現〜(第一弾)

クラウドによるシステム開発が主流になってきた現在、
開発速度は加速し、アプリケーションの開発からデプロイといったフローにも速度が求められるようになってきました。
このような現状の中、継続的インテグレーション(CI)や継続的デリバリー(CD)といった手法・考え方が重要になっています。

しかし、「実際にどうやってCDを実現しようか」という悩みを持った開発者は多いと思います。
今回は、このような問題に対して、

  • 「継続的デリバリーの実現を助けるツール」であるSpinnaker

を簡単に紹介するとともに、第一歩として、GCP(Google Cloud Platform)上にSpinnkerを配置し、触れるようにしていこうと思います。

この記事は アイソルート Advent Calendar 11日目の記事です。
こんにちは。
モバイルソリューショングループのimai.kです。

 

Spinnakerとは

Spinnakerは、マルチクラウドに対応した継続的デリバリーのプラットフォームです。
これだけでは分かりづらいので例をあげると、Spinnakerを使用して以下のようなことが実現できます。

  • Blue-Green Deployment
  • Canary Release
  • デプロイする前に承認フローを設ける
  • etc…

これらをプロジェクト内で運用できるようにするため、正しく環境構築することは難易度が高く、コストのかかる作業でしょう。

Spinnakeのメリットは、こういったムズカシイ部分を任せ、正しく・素早く環境構築できることだと思います。

と、、紹介はこれくらいにして、
早速、Spinnakerを触れるようにしていきましょう。


環境構築

今回はSpinnakerの環境構築を行うため、公式のチュートリアルをまるっと進めていきます。


行うこと(概要)

  • Spinnakerを展開するため、GCE(Google Compute Engine)上にHalyardというツールを展開します。
  • Halyardを使用し、SpinnakerをGKE(Google Kubernetes Engine)上に展開します。


準備

まず、GCPリソースをコマンドラインから操作するために、gcloudコマンドを使用できる状態にしてください。

gcloudコマンドが使用できるようになったら、以下のように初期設定を済ませてください。

gcloud auth login
gcloud config set project {PROJECT_NAME}


GKE クラスタの作成

GCPコンソール上で、GKEクラスタを作成しましょう。

この際、「以前の認証を有効にする」にチェックをつけておいてください。それ以外はデフォルト設定で問題ありません。

Google APIの有効化

以下のAPIを有効化してください。


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

Halyardが動く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

あとでSpinnakerがGCS(Google Cloud Storage)、GCR(Google Container Registry)にアクセスするためのサービスアカウントを作成します。

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

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


HalyardホストVM(GCEインスタンス)の作成

Halyardが動作するGCEインスタンスを作成します。

HALYARD_HOST=$(echo $USER-halyard-`date +%m%d` | tr '_.' '-')

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

しばらく待つと、インスタンスが立ち上がります。

立ち上がったインスタンスにSSHしましょう。

gcloud compute ssh $HALYARD_HOST \
--project=$GCP_PROJECT \
--zone={YOUR_PROJECT_ZONE} \
--ssh-flag="-L 9000:localhost:9000" \
--ssh-flag="-L 8084:localhost:8084"

ここから先は、SSHしたGCEインスタンス上でコマンドを実行していきましょう。

Halyardのインストール

さて、GCEインスタンスにHalyardをインストールしていきます。

その前に、、

Halyardは後の手順でGKE上にSpinnakerを展開しますが、Kubernetesクラスタを操作するために、kubectlをインストールしておく必要があります。

KUBECTL_LATEST=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
curl -LO https://storage.googleapis.com/kubernetes-release/release/$KUBECTL_LATEST/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/debian/InstallHalyard.sh
sudo bash InstallHalyard.sh
. ~/.bashrc


GCPリソースアクセスに必要な認証情報の設定

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


HalyardにSpinnakerの設定を行います

Spinnakerを使用するために、Halyardに設定を入れます。

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

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

hal config storage edit --type gcs

hal config provider docker-registry enable

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

hal config provider kubernetes enable

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


最後に、SpinnakerをGKEクラスタにデプロイします

hal config deploy edit \
--account-name my-k8s-account \
--type distributed

hal deploy apply

Spinnakerがデプロイされたら、HalyardからSpinnakerに接続を行います。

hal deploy connect

ここまで行うと、自身のPCからSpinnakerにアクセスできるようになります。

まとめと「次回」について

ここまでで、Spinnakerを触れる状態になりました。

次回(アイソルート Advent Calendar 25日目の記事)は、実際にパインプラインの設定から簡単なアプリケーションのデプロイまでを実践していこうと思います。

明日は watanabe.t さんの FirebaseのCI/CDに爆速で入門する です。

imai.kのブログ