Cloud Deploy でのリリース プロモーションとロールアウト進行の自動化
このページでは、Cloud Deploy を使用して自動的にリリースをターゲットに昇格し、次のフェーズにロールアウトを進める方法について説明します。
このクイックスタートでは、以下の内容を行います。
2 つの GKE クラスタまたは 2 つの Cloud Run サービスを作成します。
Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
このパイプラインは、
dev
とstaging
の 2 つのターゲットにデプロイされます。また、staging
ターゲットは カナリア デプロイ戦略を使用します。2 つの自動化ルールを定義します。
dev
へのロールアウトが成功すると、staging
ターゲットにリリースを昇格させる自動化。canary-25
フェーズが正常に完了するとstable
フェーズにロールアウトを進める自動化。
リリースを作成してデリバリー パイプラインをインスタンス化します。リリースは自動的に
dev
ターゲットにデプロイされます。Google Cloud コンソールでデリバリー パイプラインとリリースを表示します。
自動プロモーションにより、このリリースは自動的に
staging
に昇格します。staging
ターゲットはカナリア デプロイ戦略を使用し、さらにこのランタイムに対する初回のデプロイとなるため、canary-25
フェーズはスキップされます。カナリア フェーズが初回にスキップされる理由について詳しくは、フェーズがスキップされることがある理由をご覧ください。フェーズの自動進行により、ロールアウトは
stable
フェーズに進みます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。
このサービス アカウントにはすでに必要な権限が付与されている場合があります。これらの手順は、デフォルトのサービス アカウントの自動的なロール付与を無効にするプロジェクトに含まれています。
- 最初に、
clouddeploy.jobRunner
ロールを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner"
clouddeploy.releaser
ロールを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.releaser"
- 特定のランタイム向けのデベロッパー ロールを追加します。
- GKE の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer"
- Cloud Run の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer"
-
iam.serviceAccountUser
ロールを追加します。これには、デフォルト サービス アカウントがランタイムにデプロイするactAs
権限が含まれます。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
-
actAs
権限を含むiam.serviceAccountUser
ロールをご自身に追加してデフォルト サービス アカウントを使用します。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=user:YOUR_EMAIL_ADDRESS \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
この場合、YOUR_EMAIL_ADDRESS は Google Cloud へのアクセスに使用するメールアドレスです。
- 最初に、
CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。
gcloud components update
ランタイム環境を作成する
Cloud Run にデプロイする場合は、以下のコマンドをスキップできます。
GKE の場合は、デフォルトの設定で automation-quickstart-cluster-dev
と automation-quickstart-cluster-staging
の 2 つのクラスタを作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。
GKE クラスタには、デフォルトで外部からアクセス可能です。
gcloud container clusters create-auto automation-quickstart-cluster-dev \
--project=PROJECT_ID \
--region=us-central1 \
&& gcloud container clusters create-auto automation-quickstart-cluster-staging \
--project=PROJECT_ID \
--region=us-central1
プロジェクト番号を取得する
デフォルトのサービス アカウントを特定するには、プロジェクト番号が必要です。これは、自動化リソースの構成に必要です。
次のコマンドを実行してプロジェクト番号を取得します。
gcloud projects describe PROJECT_ID
コマンドライン出力からプロジェクト番号をコピーし、こちらに貼り付けます。
これをコマンドとして実行する必要はありません。こちらに貼り付けると、このクイックスタートの後半にある自動化構成ファイルにサービス アカウントのリファレンスが追加されます。
PROJECT_NUMBER
Skaffold 構成とアプリケーション マニフェストを準備する
Cloud Deploy では、Skaffold を使用して、デプロイする対象と、個々のターゲットに適切にデプロイする方法の詳細を提供します。
このクイックスタートでは、skaffold.yaml
ファイルを作成して、サンプルアプリのデプロイに使用する アプリケーション マニフェストを識別します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-automation-gke-quickstart cd deploy-automation-gke-quickstart
Cloud Run
mkdir deploy-automation-run-quickstart cd deploy-automation-run-quickstart
次の内容のファイルを
skaffold.yaml
という名前で作成します。GKE
apiVersion: skaffold/v4beta7 kind: Config metadata: name: gke-automation manifests: rawYaml: - k8s-deployment.yaml deploy: kubectl: {}
Cloud Run
apiVersion: skaffold/v4beta7 kind: Config metadata: name: run-automation profiles: - name: dev manifests: rawYaml: - run-dev.yaml - name: staging manifests: rawYaml: - run-staging.yaml deploy: cloudrun: {}
このファイルは最小限の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、単純な非本番環境アプリケーション用に作成することもできます。
この構成ファイルの詳細については、
skaffold.yaml
リファレンスをご覧ください。Cloud Run サービス定義のペアか、GKE Kubernetes マニフェストでアプリケーションの定義を作成します。
GKE
次の内容のファイルを
k8s-deployment.yaml
という名前で作成します。apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80
このファイルは、アプリケーションのデプロイに使用される単純な Kubernetes マニフェストです。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。Cloud Run
次の内容のファイルを
run-dev.yaml
という名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-dev spec: template: spec: containers: - image: my-app-image
次の内容のファイルを
run-staging.yaml
という名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-staging spec: template: spec: containers: - image: my-app-image
これらのファイルは、アプリケーションのデプロイに使用される単純な Cloud Run サービス定義です。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。
デリバリー パイプライン、ターゲット、自動化を作成します。
デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。個別のファイルで自動化アクションを定義することもできます。このクイックスタートでは、パイプライン、ターゲット、自動化に 1 つのファイルを使用します。
デリバリー パイプライン、ターゲット定義、自動化のアクションを作成します。
GKE
deploy-automation-gke-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev - targetId: automation-quickstart-staging profiles: [] strategy: canary: runtimeConfig: kubernetes: serviceNetworking: service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: promotes a release suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: name: "promote-release" wait: 1m toTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: name: "advance-rollout" sourcePhases: ["canary-25"] wait: 1m
Cloud Run
deploy-automation-run-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev profiles: [dev] - targetId: automation-quickstart-staging profiles: [staging] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: Promotes a release to the next target suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: name: "promote-release" wait: 1m toTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: name: "advance-rollout" sourcePhases: ["canary-25"] wait: 1m
パイプラインとターゲットを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
これで、2 つの GKE ターゲットまたは Cloud Run ターゲットから成るマルチターゲットを有するパイプラインが作成されました。これで、アプリケーションをデプロイする準備が整いました。
次のとおりに、パイプラインとターゲットを確認します。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。
作成したデリバリー パイプラインが表示され、[ターゲット] 列に 2 つのターゲットが表示されます。
パイプライン名をクリックして、デリバリー パイプラインの可視化を開きます。
[配信パイプラインの詳細] で [自動化] タブを選択します。
作成した 2 つの自動化が表示されます。
リリースを作成する
リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。
GKE
deploy-automation-gke-quickstart
ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release
リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
--images=
フラグに注目してください。このフラグは、マニフェストのプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにマニフェストをテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
Cloud Run
deploy-automation-run-quickstart
ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release
リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
--images=
フラグに注目してください。これは、サービス定義のプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにサービスとジョブの定義をテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
デフォルトでは、リリースを作成すると、パイプラインの最初のターゲットに対してロールアウトが自動作成されます。
このクイックスタートには 2 つの自動化が含まれているため、次の 2 つの処理が自動的に実行されます。
最初のターゲットでデプロイが成功すると、リリースは 2 番目のターゲットに自動的に昇格します。
自動化による昇格には 1 分間の待ち時間があります。
2 つ目のターゲット(25% のカナリアが構成されている)では、2 つ目の自動化によってロールアウトが
canary-25
からstable
に進みます。この最初のリリースでは、カナリア対応の既存バージョンのアプリが存在しないため、
canary-25
フェーズはスキップされます。これにより、ロールアウトが自動的にstable
に進みます。自動化の進行には 1 分の遅延があります。
すべてが完了すると、一切の操作を必要とせずにアプリケーションは両方のターゲットに正常にデプロイされます。
カナリア デプロイ戦略の実行に関する詳細は、カナリアのクイックスタートをお試しください。
Google Cloud コンソールで結果を表示する
自動化の実行などの結果は Google Cloud コンソールで確認できます。
Cloud Deploy の [デリバリー パイプライン] ページに移動して、デリバリー パイプラインを表示します。
デリバリー パイプラインの名前 [my-automation-demo-app-1] をクリックします。
可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。十分な時間が経過すると、両方のターゲットが緑色になります。
リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。
[オートメーションの実行] タブをクリックします。
作成した 2 つの自動化に 1 つずつ、2 つのエントリが存在します。そのいずれかをクリックすると、その自動化実行の詳細が表示されます。
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
GKE クラスタまたは Cloud Run サービスを削除します。
GKE
gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \ && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
Cloud Run
gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \ && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
デリバリー パイプライン、ターゲット、自動化、リリース、ロールアウトを削除します。
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
Cloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeploy
で終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.com
で終わります。
これでクイックスタートの演習はすべて終了です。