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 というツールは、この先使うことはないかと思いますが、こういうツールもあるということは覚えておこうと思います。
コメント