アプリケーションをターゲットにカナリア デプロイする
このクイックスタートでは、Cloud Deploy を使用して、カナリア デプロイのサンプル アプリケーション イメージを Google Kubernetes Engine または Cloud Run に提供する方法について説明します。 (GKE Enterprise にカナリア デプロイを実行することもできますが、このクイックスタートでは GKE と Cloud Run のみを説明します)。
カナリア デプロイでは、すでにデプロイされているバージョンのアプリケーションと新しいバージョンの間でトラフィックが分割されます。Cloud Run は、デリバリー パイプラインで構成した割合に基づいてトラフィックを分割します。GKE は、Pod の一部に新しいバージョンをデプロイします。このクイックスタートでは、最初に 50% までデプロイし、次に 100% までデプロイします。
このクイックスタートでは、ターゲット(prod
)は 1 つのみです。そのため、アプリケーションを実行する GKE クラスタまたは Cloud Run サービスを 1 つだけ作成します。
このクイックスタートでは、以下の内容を行います。
GKE クラスタを 1 つ作成する、または Cloud Run サービスを 1 つ定義します。
GKE Enterprise クラスタにカナリア デプロイすることもできますが、このクイックスタートでは GKE と Cloud Run のみを使用します。
Skaffold 構成と Kubernetes マニフェストを作成して、デプロイする(事前ビルドされた)コンテナ イメージを指定します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
リリースを作成して、デリバリー パイプラインを呼び出します。リリースは自動的に 1 つのターゲットにデプロイされます。
この最初のリリースでは、カナリア フェーズをスキップします。
Google Cloud コンソールでデリバリー パイプラインとリリースを表示します。
2 番目のリリースを作成します。今回はカナリア ステージを実行してアプリケーションを 50% までデプロイします。
100% までデプロイするようにリリースを進めます。
始める前に
- 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"
- 特定のランタイム向けのデベロッパー ロールを追加します。
- 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.yaml
Istio をインストールして、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 を使用して、デプロイする対象と、それをターゲットに適切にデプロイする方法の詳細を提供します。
このクイックスタートでは、デプロイする Kubernetes マニフェストまたは Cloud Run サービス構成を識別する skaffold.yaml
ファイルを作成します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-canary-quickstart-gke cd deploy-canary-quickstart-gke
GKE と Gateway API
mkdir deploy-canary-quickstart-gke-gatewayapi cd deploy-canary-quickstart-gke-gatewayapi
Cloud 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 manifestであり、アプリケーションをデプロイするためにクラスタに適用されます。
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 manifestであり、アプリケーションをデプロイするためにクラスタに適用されます。このマニフェストには、カナリア デプロイに必要な Service リソースと Deployment リソースに加えて、Gateway API の使用に必要な HTTPRoute と Gateway リソースが含まれています。
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 でサービスを作成するためにデプロイ時に適用されます。
デリバリー パイプラインとターゲットの作成
デリバリー パイプラインとターゲットは、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 つのターゲットが構成されたパイプラインが作成されました。
次のとおりに、パイプラインとターゲットを確認します。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。
作成したデリバリー パイプラインが表示され、[ターゲット] 列に構成した 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:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
リリースを作成すると、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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
GKE と 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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud 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:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
数分後、ロールアウトが作成され、今回はカナリア ステージが実行されます。
最初のロールアウト フェーズが完了すると、ロールアウトはカナリア フェーズに入ります。
これは、アプリケーションが現在 50% までデプロイされたことを示しています。serviceNetworking ベースの GKE の場合、Pod の半分までデプロイされます。Gateway API ベースの GKE と Cloud Run の場合、トラフィックは 50% まで割り当てられます。
[ロールアウトを進めます] をクリックし、プロンプトが表示されたら [進めます] をクリックします。
これにより、ロールアウトが「安定」フェーズに進み、アプリケーションが 100% までデプロイされます。
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
canary-quickstart-cluster
クラスタを削除します(GKE のみ)。gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
my-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_ID
Cloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeploy
で終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.com
で終わります。
これでクイックスタートの演習はすべて終了です。