アプリケーションをターゲットにカナリア デプロイする
このクイックスタートでは、Cloud Deploy を使用して、カナリア デプロイのサンプル アプリケーション イメージを Google Kubernetes Engine または Cloud Run に提供する方法について説明します。 (GKE Enterprise にカナリア デプロイを実行することもできますが、このクイックスタートでは GKE と Cloud Run のみを説明します)。
カナリア デプロイでは、すでにデプロイされているアプリケーションのバージョンと新しいバージョンにトラフィックが分割されます。Cloud Run は、デリバリー パイプラインで構成した割合に基づいてトラフィックを割り当てます。GKE が新しいバージョンを一定の割合のポッドにデプロイします。このクイックスタートでは、最初に 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 マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。
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 リソースが含まれています。
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:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc
リリースを作成すると、Cloud Deploy は自動的にロールアウト リソースも作成し、1 つのターゲット prod
にすぐにデプロイします。
安定フェーズにスキップする
この最初のリリースでは、カナリア フェーズをスキップして 100%(安定したフェーズ)までデプロイします。これは、アプリケーションが以前にデプロイされていないため、50% の Pod(GKE の場合)や Service のトラフィック分割(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:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc
数分後、ロールアウトが作成され、今回はカナリア ステージが実行されます。
最初のロールアウト フェーズが終了すると、ロールアウトはカナリア フェーズになります。
これは、アプリケーションが現在 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_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
で終わります。
これでクイックスタートの演習はすべて終了です。