アプリケーションをターゲットにカナリア デプロイする
このクイックスタートでは、Cloud Deploy を使用して、カナリア デプロイのサンプル アプリケーション イメージを Google Kubernetes Engine または Cloud Run に提供する方法について説明します。 (GKE 接続クラスタにカナリア デプロイを実行することもできますが、このクイックスタートでは GKE と Cloud Run のみを説明します)。
カナリア デプロイでは、すでにデプロイされているバージョンのアプリケーションと新しいバージョンの間でトラフィックが分割されます。Cloud Run は、デリバリー パイプラインで構成した割合に基づいてトラフィックを割り当てます。 GKE は、新しいバージョンを Pod の割合にデプロイします。このクイックスタートでは、最初に 50% までデプロイし、次に 100% までデプロイします。
このクイックスタートでは、ターゲット(prod)は 1 つのみです。そのため、アプリケーションを実行する GKE クラスタまたは Cloud Run サービスを 1 つだけ作成します。
このクイックスタートでは、以下の内容を行います。
GKE クラスタを 1 つ作成する、または Cloud Run サービスを 1 つ定義します。
GKE 接続クラスタにカナリア デプロイすることもできますが、このクイックスタートでは GKE と Cloud Run のみを使用します。
デプロイする(事前ビルド済みの)コンテナ イメージを指定する Skaffold構成と Kubernetes マニフェストを作成します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
リリースを作成して、デリバリー パイプラインを呼び出します。リリースは自動的に 1 つのターゲットにデプロイされます。
この最初のリリースでは、カナリア フェーズをスキップします。
コンソールでデリバリー パイプラインとリリースを表示します。 Google Cloud
2 番目のリリースを作成します。今回はカナリア ステージを実行してアプリケーションを 50% までデプロイします。
100% までデプロイするようにリリースを進めます。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
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" - 特定のランタイム向けのデベロッパー ロールを追加します。
- GKE、および Gateway API を使用した 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
- 最初に、
CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。
gcloud components update
ランタイム環境を作成する
GKE
1 つの GKE Autopilot クラスタを作成します。
gcloud container clusters create-auto canary-quickstart-cluster \
--project=PROJECT_ID \
--region=us-central1
GKE と Gateway API
Istio での使用をサポートするための推奨設定を使用して、1 つの GKE クラスタを作成します。
gcloud container clusters create canary-quickstart-cluster \ --machine-type=n1-standard-1 \ --num-nodes 4 \ --region=us-central1 \ --project=PROJECT_IDクラスタの認証情報を取得します。
gcloud container clusters get-credentials canary-quickstart-cluster \ --project=PROJECT_ID \ --region=us-central1クラスタに Kubernetes Gateway API CRD がまだ存在しない場合は、インストールします。
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yamlIstio をインストールして、Istio の Gateway Controller の実装を有効にします。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \ && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
Cloud Run
Cloud Run を使用している場合は、このコマンドをスキップできます。ここでは 何もする必要はありません。
Skaffold 構成とアプリケーション マニフェストを準備する
Cloud Deploy では、Skaffold を使用して、デプロイする対象と、それをターゲットに適切にデプロイする方法の詳細を提供します。
このクイックスタートでは、skaffold.yaml ファイルを作成します。このファイルは、デプロイする Kubernetes マニフェストまたは Cloud Run サービス構成を指定します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-canary-quickstart-gke cd deploy-canary-quickstart-gkeGKE と Gateway API
mkdir deploy-canary-quickstart-gke-gatewayapi cd deploy-canary-quickstart-gke-gatewayapiCloud Run
mkdir deploy-canary-quickstart-run cd deploy-canary-quickstart-run次の内容のファイルを
skaffold.yamlという名前で作成します。GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}GKE と Gateway API
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - run.yaml deploy: cloudrun: {}このファイルは、マニフェストを識別する最小限の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、単純な非本番環境アプリケーション用に作成することもできます。
この構成ファイルの詳細については、
skaffold.yamlリファレンスをご覧ください。アプリケーション マニフェストを作成します。
GKE
deploy-canary-quickstart-gkeディレクトリに、次の内容のファイルをkubernetes.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 マニフェストであり、アプリケーションをデプロイするために クラスタに適用されます。このマニフェストには、カナリア デプロイに必要な Service リソースと Deployment リソースに加えて、Gateway API の使用に必要な HTTPRoute リソースと Gateway リソースが含まれています。
デプロイするコンテナ イメージは、プレースホルダ
my-app-imageとして ここに設定されます。これは、リリースを作成するときに特定のイメージに 置き換えられます。GKE と Gateway API
deploy-canary-quickstart-gke-gatewayapiディレクトリに、次の内容のファイルをkubernetes.yamlという名前で作成します。kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-gateway annotations: networking.istio.io/service-type: "ClusterIP" spec: gatewayClassName: istio listeners: - name: default hostname: "*.example.com" port: 80 protocol: HTTP allowedRoutes: namespaces: from: All --- kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-httproute spec: parentRefs: - kind: Gateway name: my-gateway hostnames: - "test.example.com" rules: - backendRefs: - name: my-service port: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-imageこのファイルは Kubernetes マニフェストであり、アプリケーションをデプロイするために クラスタに適用されます。このマニフェストには、カナリア デプロイに必要な Service リソースと Deployment リソースに加えて、Gateway API の使用に必要な HTTPRoute リソースと Gateway リソースが含まれています。
デプロイするコンテナ イメージは、プレースホルダ
my-app-imageとして ここに設定されます。これは、リリースを作成するときに特定のイメージに 置き換えられます。Cloud Run
deploy-canary-quickstart-runディレクトリに、次の内容のファイルをrun.yamlという名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-canary-run-service spec: template: spec: containers: - image: my-app-imageこのファイルは基本的な Cloud Run サービス定義であり、Cloud Run でサービスを作成するためにデプロイ時に適用されます。デプロイするコンテナ イメージは、 プレースホルダ
my-app-imageとして設定されます。これは、リリースを作成するときに特定の イメージに置き換えられます。
デリバリー パイプラインとターゲットの作成
デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、パイプラインと 1 つのターゲットで、1 つのファイルを作成します。
GKE
deploy-canary-quickstart-gke ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: "my-service"
deployment: "my-deployment"
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod GKE cluster
gke:
cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
GKE と Gateway API
deploy-canary-quickstart-gke-gatewayapi ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
gatewayServiceMesh:
httpRoute: "my-httproute"
service: "my-service"
deployment: "my-deployment"
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod GKE cluster
gke:
cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
Cloud Run
deploy-canary-quickstart-run ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
cloudRun:
automaticTrafficControl: true
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod Run Service
run:
location: projects/PROJECT_ID/locations/us-central1
パイプラインとターゲットを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_IDこれで、カナリア デプロイ戦略用に 1 つのターゲットが構成されたパイプラインが作成されました。
次のとおりに、パイプラインとターゲットを確認します。
コンソールで、Cloud Deploy の [**デリバリー パイプライン**] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。 Google Cloud
作成したデリバリー パイプラインが表示され、構成した 1 つのターゲットが [ターゲット] 列に一覧表示されます。

リリースを作成する
リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。
デプロイするコンテナ イメージを表す release リソースを作成するには、deploy-canary-quickstart-gke、deploy-canary-quickstart-gke-gatewayapi、または deploy-canary-quickstart-run ディレクトリから次のコマンドを実行します。
GKE
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
GKE と Gateway API
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud Run
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
--images= フラグに注意してください。このフラグを使用して、
マニフェストまたはサービス定義
のプレースホルダ(my-app-image)を、SHA 修飾された特定のイメージに置き換えます。Google では、このようにマニフェストをテンプレート化し、リリース作成時に SHA 修飾されたイメージ名を使用することをおすすめします。
リリースを作成すると、Cloud Deploy は自動的にロールアウト リソースも作成し、1 つのターゲット prod にすぐにデプロイします。
安定フェーズにスキップする
この最初のリリースでは、カナリア フェーズをスキップして 100%(安定したフェーズ)までデプロイします。これは、アプリケーションが以前にデプロイされていないため、ポッドの 50% を計算する方法(GKE の場合)や、サービスに対するトラフィックを分割する方法(Cloud Run の場合)がないためです。Pod(GKE)またはリビジョン(Cloud Run)はまだ存在していません。
カナリア フェーズをスキップしたので、100% までのトラフィックを受信する、安定フェーズを開始する準備が整いました。その後、別のリリースを作成し、カナリアを実行します。
実際の状況では、アプリケーションがすでに動作しているカナリア デプロイが実行されるため、このフェーズをスキップすることはまれです。
コンソールでリリースを表示する Google Cloud
これで最初のリリースを作成し、ロールアウトが作成されたため、 コンソールでリリースとロールアウトを Google Cloud 表示できます。可視化されたパイプラインを表示して、リリースの現在のステータスを確認することもできます。
Google Cloud コンソールで、Cloud Deploy [**デリバリー パイプライン**] ページに移動し、[**my-canary-demo-app-1**] デリバリー パイプラインを表示します。
デリバリー パイプラインの名前「my-run-demo-app-1」をクリックします。
可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。パイプラインには 1 つのステージしかないため、可視化されたパイプラインにはノードが 1 つだけ表示されます。

リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。
リリース名
test-release-001をクリックします。ロールアウトが [ロールアウト] に表示されます。ロールアウトをクリックすると、デプロイログなどの詳細を表示できます。

ロールアウト ステータスが「Pending advance」になっており、可視化されたパイプラインに表示されているターゲットに「Advance to stable」へのリンクがあることに注目してください。
ロールアウト フェーズを進める
最初のリリースの後、カナリア フェーズはスキップされ、ロールアウトは「安定」フェーズの開始を待機しています。このフェーズにより、アプリケーションが 100% までデプロイされます。
可視化されたパイプラインで、[Advance to stable] をクリックします。
プロンプトが表示されたら、[Advance] をクリックして確定します。
数分後、ロールアウトが「安定」フェーズになり、アプリケーションが 100% までデプロイされます。

カナリア デプロイを実行する
最初のリリースでカナリア フェーズをスキップしたため、別のリリースを作成し、今回はカナリア デプロイを実行します。
新しい
releaseを作成するには、deploy-canary-quickstart-gke、deploy-canary-quickstart-gke-gatewayapi、またはdeploy-canary-quickstart-runディレクトリから次のコマンドを実行します。GKE
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaGKE と Gateway API
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaCloud Run
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a数分後、ロールアウトが作成され、今回はカナリア ステージが実行されます。

最初のロールアウト フェーズが終了すると、ロールアウトはカナリア フェーズになります。

これは、アプリケーションが現在 50% までデプロイされたことを示しています。serviceNetworking ベースの GKE の場合、Pod の半分までデプロイされます。Gateway API ベースの GKE と Cloud Run の場合、トラフィックは 50% まで割り当てられます。
[Advance Rollout] をクリックし、プロンプトが表示されたら [Advance] をクリックします。
これにより、ロールアウトが「安定」フェーズに進み、アプリケーションが 100% までデプロイされます。

クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、 次の手順を実施します。
canary-quickstart-clusterクラスタを削除します(GKE のみ)。gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_IDmy-canary-run-serviceサービスを削除します(Cloud Run のみ)。gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_IDデリバリー パイプライン、ターゲット、すべてのリリースとロールアウト リソースを削除します。
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_IDCloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeployで終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.comで終わります。
これでクイックスタートの演習はすべて終了です。
次のステップ
Cloud Deploy のチュートリアルをお試しください。
マニフェストを管理する方法を学習します。
CI/CD ツールを組み合わせてソフトウェアを効果的に開発し、GKE に提供する方法を確認する。 Google Cloud