初めての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に爆速で入門する です。