Cloud Deploy を使用したリリース

1. 目標

このチュートリアルでは、preview、canary、prod という名前の 3 つの GKE クラスタを作成します。次に、各クラスタに対応する Cloud Deploy ターゲトと、これらのターゲットでデプロイを実行する手順を定義する Cloud Deploy パイプラインを作成します。

デプロイ フローは、Cloud Deploy リリースを作成し、プレビュー クラスタでデプロイを行う cloudbuild パイプラインによってトリガーされます。プレビュー版のデプロイが正常に完了し、想定どおりに動作していることを確認したら、カナリア クラスタでリリースを手動で昇格させます。本番環境クラスタへのリリースのプロモーションには承認が必要です。Cloud Deploy UI で本番環境パイプラインを承認し、最終的にプロモートします。

このチュートリアルの目標は、次のステップに分けることができます。

  • ワークスペースを準備する
  • Cloud Deploy ターゲットを定義する
  • Cloud Deploy パイプラインを定義する
  • リリースの作成
  • デプロイメントを昇格させる
  • 本番環境リリースを承認する

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

2. プラットフォームの設定

ワークスペースの準備

ここでは、このチュートリアルの実行に必要な環境を設定します。この手順が完了すると、デプロイを実行できる GKE クラスタが作成されます。

  1. gcloud config のデフォルトを設定する

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. リポジトリのクローンを作成する

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. 環境変数を設定する

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. API を有効にする

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. GKE クラスタを作成する
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Cloud Deploy ターゲットの定義

  1. cloudshell で次のコマンドを使用して、deploy ディレクトリに preview.yaml という名前のファイルを作成します。

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Cloud Shell で次のコマンドを使用して、deploy ディレクトリに canary.yaml という名前のファイルを作成します。

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Cloud Shell で次のコマンドを使用して、deploy ディレクトリに prod.yaml という名前のファイルを作成します。

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

タグ requireApproval が true に設定されていることに注目してください。承認が得られるまで、本番環境ターゲットへの昇格は許可されません。リリースを承認するには、roles/clouddeploy.approver ロールが必要です。

  1. デプロイ ターゲットを作成する
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. アプリの作成

通常、新しいアプリケーションの作成の一環として、CICD パイプラインは自動ビルド、統合テスト、デプロイを実行するように設定されます。次の手順は、新しいアプリのセットアップ プロセスの一部と見なされます。新しいアプリケーションごとにデプロイ パイプラインが構成されます。

Cloud Deploy パイプラインの定義

  1. Cloud Shell で次のコマンドを使用して、deploy ディレクトリに pipeline.yaml という名前のファイルを作成します。

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

serialPipeline タグには、stages というタグが含まれています。これは、この配信パイプラインがデプロイするように構成されているすべてのターゲットのリストです。

targetId は、デリバリー パイプラインのこのステージに使用する特定のターゲットを識別します。値は、ターゲット定義の metadata.name プロパティです。

profiles は、skaffold.yaml の 0 個以上の Skaffold プロファイル名のリストです。Cloud Deploy は、リリースの作成時に skaffold レンダリングでプロファイルを使用します。

  1. パイプラインを適用する

gcloud beta deploy apply --file deploy/pipeline.yaml

4. 開発フェーズ

アプリケーションの開発に伴い、自動化された CICD ツールチェーンによってアセットがビルドされ、保存されます。次のコマンドを実行して、skaffold を使用してアプリケーションをビルドし、Cloud Deploy でデプロイするためのアセットを保存します。このステップは、アプリケーションのビルドごとに CICD プロセスによって実行されます。

  1. skaffold を使用してアプリケーションをビルドして保存する

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. リリース フェーズ

CICD プロセスの終了時(通常はコードに本番環境のタグが付けられたとき)に、cloud deploy release コマンドを呼び出してリリース プロセスを開始します。デプロイが検証されて承認されたら、自動プロセスまたは手動承認でアクションを昇格して承認することで、さまざまなターゲット環境にリリースを移動します。

リリースの作成

このチュートリアルでは、Cloud Deploy の仕組みを理解するために Cloud Deploy ファイルを作成しました。このデモでは、同じ Cloud Deploy ファイルを作成し、サンプルの Go アプリケーションとともに GitHub リポジトリに push しました。このアプリケーションのリリースには Cloud Deploy を使用します。

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

リリースを確認する

Cloud Deploy リリースが作成されると、最初のターゲット(プレビュー)に自動的にロールアウトされます。

  1. Google Cloud コンソールの [Cloud Deploy] に移動します。
  2. [sample-app] をクリックします。

この画面には、パイプラインのグラフィック表示が表示されます。

  1. プレビュー ボックスの左側に緑色の枠線が表示されていることを確認します。これは、リリースがその環境にデプロイされていることを意味します。
  2. 必要に応じて、画面下部の [リリースの詳細] でリリース名をクリックして、リリースの詳細を確認します。
  3. リリースでアプリケーションが正常にデプロイされたことを確認するには、cloudshell で次のコマンドを実行します。

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 画面右上のウェブ プレビュー アイコンをクリックします。
  2. [ポート 8080 でプレビュー] を選択します。

新しいページが開き、「Hello World!」というメッセージが表示されます。

  1. ターミナルで ctrl+c を使用して、ポート転送を終了します。

リリース版をプロモートする

リリースがパイプラインの最初のターゲット(プレビュー)にデプロイされたので、次のターゲット(カナリア)に昇格できます。次のコマンドを実行してプロセスを開始します。

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

リリース プロモーションを確認する

  1. Google Cloud コンソールの sample-app パイプラインに移動します。
  2. Canary ボックスの左側に緑色の枠線が表示されていることを確認します。これは、リリースがその環境にデプロイされていることを意味します。
  3. アプリケーションへのトンネルを作成して、アプリケーションが正しくデプロイされていることを確認する

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 画面右上のウェブ プレビュー アイコンをクリックします。
  2. [ポート 8080 でプレビュー] を選択します。

新しいページが開き、「Hello World!」というメッセージが表示されます。

  1. ターミナルで ctrl+c を使用して、ポート転送を終了します。

本番環境リリースの承認

prod.yaml を使用して prod ターゲットを作成したときに、タグ requireApproval を true に指定したことを思い出してください。これにより、本番環境での昇格に承認が必要になります。

  1. 次のコマンドを使用して、カナリア リリースを本番環境に昇格させます。

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Google Cloud コンソールの sample-app パイプラインに移動します。
  2. 「1 件保留中」と表示されている黄色のインジケーターに注目してください。

このメッセージは、本番環境へのデプロイのキューにリリースがあるが、確認と承認が必要であることを示します。

  1. 黄色い通知のすぐ下にある [確認] ボタンをクリックします。
  2. 次の画面でもう一度 [確認] をクリックして、製品版の承認画面にアクセスします。
  3. 必要に応じて、マニフェストの差分を確認して変更を確認します。この場合は、まったく新しいファイルです。
  4. [承認] ボタンをクリックします。
  5. sample-app パイプライン ページに戻ると、本番環境へのリリースの進行状況が表示されます。

製品版リリースを確認する

他の環境と同様に、デプロイが完了したら、次の手順で確認できます。

  1. cloudshell で次のコマンドを実行して、ポート転送を作成します。

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 画面右上のウェブ プレビュー アイコンをクリックします。
  2. [ポート 8080 でプレビュー] を選択します。

新しいページが開き、「Hello World!」というメッセージが表示されます。

  1. ターミナルで ctrl+c を使用して、ポート転送を終了します。