【GCP】Qwiklabs の「クラウドアーキテクチャ」を勉強しています~Spinnaker と Kubernetes Engine を使用した継続的デリバリー パイプライン~

Spinnaker GCP
Spinnaker

Qwiklabs の「クラウドアーキテクチャ」を進めていきたいと思います。

Spinnaker と Kubernetes Engine を使用した継続的デリバリー パイプライン

概要

Spinnaker と Kubernetes Engine を使用した継続的デリバリー パイプラインを学びます。

コマンド

環境の設定

gcloud config set compute/zone us-central1-f
gcloud container clusters create apinnaker-tutorial --machine-type=n1-standard-2
ID およびアクセス管理を構成する
gcloud iam service-accounts create spinnaker-account --display-name spinnaker-account
export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:spinnaker-account" --format='value(email)')
echo $SA_EMAIL
export PROJECT=$(gcloud info --format='value(config.project)')
echo $PROJECT
gcloud projects add-iam-policy-binding $PROJECT --role roles/storage.admin --member serviceAccount:$SA_EMAIL
gcloud iam service-accounts keys create spinnaker-sa.json --iam-account $SA_EMAIL

Spinnaker パイプラインをトリガーする Cloud Pub/Sub を設定する

gcloud pubsub topics create projects/$PROJECT/topics/gcr
gcloud pubsub subscriptions create gcr-triggers --topic projects/${PROJECT}/topics/gcr
gcloud beta pubsub subscriptions add-iam-policy-binding gcr-triggers --role roles/pubsub.subscriber --member serviceAccount:$SA_EMAIL

Helm を使用した Spinnaker のデプロイ

Helm をインストールする
wget https://get.helm.sh/helm-v3.1.0-linux-amd64.tar.gz
tar zxfv helm-v3.1.0-linux-amd64.tar.gz
cp linux-amd64/helm .
kubectl create clusterrolebinding user-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)
kubectl create clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:default spinnaker-admin
./helm repo add stable https://kubernetes-charts.storage.googleapis.com
./helm repo update
Spinnaker を構成する
export BUCKET=$PROJECT-spinnaker-config
echo $BUCKET
gsutil mb -c regional -l us-central1 gs://$BUCKET
export SA_JSON=$(cat spinnaker-sa.json)
echo $SA_JSON

Spinnaker のインストール方法を記述する spinnaker-config.yaml ファイルを作成します。

cat > spinnaker-config.yaml <<EOF
gcs:
  enabled: true
  bucket: $BUCKET
  project: $PROJECT
  jsonKey: '$SA_JSON'

dockerRegistries:
- name: gcr
  address: https://gcr.io
  username: _json_key
  password: '$SA_JSON'
  email: [email protected]

# デフォルトのストレージバックエンドである minio を無効にします
minio:
  enabled: false

#GCP サービスを有効にするように Spinnaker を構成します
halyard:
  additionalScripts:
    create: true
    data:
      enable_gcs_artifacts.sh: |-
        \$HAL_COMMAND config artifact gcs account add gcs-$PROJECT --json-path /opt/gcs/key.json
        \$HAL_COMMAND config artifact gcs enable
      enable_pubsub_triggers.sh: |-
        \$HAL_COMMAND config pubsub google enable
        \$HAL_COMMAND config pubsub google subscription add gcr-triggers \
          --subscription-name gcr-triggers \
          --json-path /opt/gcs/key.json \
          --project $PROJECT \
          --message-format GCR
EOF
Spinnaker チャートをデプロイする
./helm install -n default cd stable/spinnaker -f spinnaker-config.yaml --version 1.23.0 --timeout 10m0s --wait
export DECK_POD=$(kubectl get pods --namespace default -l "cluster=spin-deck" -o jsonpath="{.items[0].metadata.name}")
echo $DECK_POD
kubectl port-forward --namespace default $DECK_POD 8080:9000 >> /dev/null &

Cloud Shell ウィンドウの最上部で「ウェブでプレビュー」をクリックします。
「ポート8080でプレビュー」をクリックします。
Spinnaker のユーザーインターフェースが表示されます。

Docker イメージのビルド

ソースコード リポジトリを作成する
wget https://gke-spinnaker.storage.googleapis.com/sample-app-v2.tgz
tar xzfv sample-app-v2.tgz
cd sample-app
git config --global user.email "$(gcloud config get-value core/account)"
git config --global user.name "user1"
git init
git add .
git commit -m "Initial commit"
gcloud source repos create sample-app
git config credential.helper gcloud.sh
git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app
git push origin master

ナビゲーションメニュー⇒「Source Repositories」をクリックします。
「すべてのリポジトリを表示」をクリックします。
「sample-app」をクリックします。

ビルドトリガーを構成する

ナビゲーションメニュー⇒「Cloud Build」⇒「トリガー」をクリックします。
「トリガーを作成」をクリックします。
下記を入力して「作成」をクリックします。

名前sample-app-tags
イベントPush new tag
ソースsample-app (Cloud Source Repositories)
タグv.*
ビルド構成Cloud Build 構成ファイル (yaml または json)
Cloud Build 構成ファイルの場所/cloudbuild.yaml
Spinnaker で使用するために Kubernetes マニフェストを準備する
gsutil mb -l us-central1 gs://$PROJECT-kubernetes-manifests
gsutil versioning set on gs://$PROJECT-kubernetes-manifests
sed -i s/PROJECT/$PROJECT/g k8s/deployments/*
git commit -a -m "Set project ID"
イメージをビルドする
git tag v1.0.0
git push --tags

ナビゲーションメニュー⇒「Cloud Build」⇒「履歴」をクリックします。
ビルドがトリガーされたことを確認します。

デプロイメント パイプラインの構成

Spinnaker を管理する spin CLI をインストールする
curl -LO https://storage.googleapis.com/spinnaker-artifacts/spin/1.14.0/linux/amd64/spin
chmod +x spin
デプロイメント パイプラインを作成する
./spin application save --application-name sample \
  --owner-email "$(gcloud config get-value core/account)" \
  --cloud-providers kubernetes \
  --gate-endpoint http://localhost:8080/gate
sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json > pipeline.json
./spin pipeline save --gate-endpoint http://localhost:8080/gate -f pipeline.json
パイプラインの実行を手動でトリガーして確認する

Spinnaker UI で、画面の上部にある「Applications」をクリックします。
「sample」をクリックします。
「PIPELINES」をクリックします。
「Start Manual Execution」をクリックします。
「OK」をクリックします。
「Execution Details」をクリックします。
黄色の「人物」アイコンにカーソルを合わせ「Continue」をクリックします。
本番環境のデプロイメントが完了するのを待ちます。

Spinner UI の上部で「INFRASTRUCTURE」⇒「LOAD BALANCERS」をクリックします。
「service sample-frontend-production」の下の「DEFAULT」をクリックします。
右側の詳細ペインの Ingress IP をコピーします。
ブラウザの新しいタブで Ingress IP を表示します。

コードの変更によるパイプラインのトリガー

sed -i 's/orange/blue/g' cmd/gke-info/common-service.go
git commit -a -m "Change color to blue"
git tag v1.0.1
git push --tags

ナビゲーションメニュー⇒「Cloud Build」⇒「履歴」をクリックします。
「稼働時間チェック」⇒「稼働時間チェックの作成」をクリックします。
Spinnaker UI に戻り、「PIPELINES」をクリックします。

カナリア デプロイメントを観察する

デプロイが一時停止し、本番環境へのロールアウトを待機します。(黄色の「人物」アイコンで一時停止している)
ブラウザで Ingress IP を何回かリロードします。
Version が canary のページだけ、青色の新しいバージョンになっていることを確認します。
黄色の「人物」アイコンにカーソルを合わせ「Continue」をクリックします。
本番環境のデプロイメントが完了するのを待ちます。

git revert v1.0.1
git tag v1.0.2
git push --tags

ロールバックして、v1.0.2 をコミットします。
同様にして、デプロイメントを確認します。
黄色の「人物」アイコンにカーソルを合わせ「Continue」をクリックします。
ブラウザで Ingress IP を何回かリロードします。

まとめ

Spinnaker と Kubernetes Engine を使用した継続的デリバリー パイプラインを学びました。
正直、Spinnaker というツールは、この先使うことはないかと思いますが、こういうツールもあるということは覚えておこうと思います。

コメント

タイトルとURLをコピーしました