Google Cloud DeployとCI/CDパイプラインの構築

はじめに
Google Cloud Deployを利用してGitHubにPushしたら自動でデプロイされるCDパイプラインを構築してみようと思います。
Google Cloud Deployとは
フルマネージドのデプロイメント パイプライン サービスです。 内部ではSkaffoldを利用しており、GKEやCloudRunなどを対象にデプロイすることができます。
参考:https://cloud.google.com/deploy
OSSだと、ArgoCDやTektonなどが分類的に近いと思います。
料金
Google Cloud Deploy のお客様には、アクティブなパイプラインごとに毎月管理費が請求されます。毎月、請求先アカウントごとに最初のアクティブなデリバリー パイプラインは無料です。追加の配信パイプラインごとに月額 $15.00 が課金されます。
毎月、請求先アカウントごとに最初のアクティブなデリバリー パイプラインは無料
という一風変わった料金体系になっています。無料枠があると気軽に試せるので良いですね。
ハンズオン
動作確認するための最低限の設定を用意します。 今回は、デプロイターゲットはGKEとします。 マニフェストのレンダリングには、Helmを利用します。
流れを図にすると以下のようになります。
GitHubのトリガーを機に実行されるCloud Buildの設定ファイルです。
- はじめのステップで、Skaffoldでビルドを行います。
- その次のステップで、Cloud Deployをトリガーします。
- cloudbuild.yaml
steps: - name: 'gcr.io/cloud-builders/gcloud' id: build-image entrypoint: "/bin/bash" args: - '-c' - |- set -x curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash gcloud auth configure-docker asia-northeast1-docker.pkg.dev skaffold build --interactive=false --default-repo=asia-northeast1-docker.pkg.dev/$PROJECT_ID/example --file-output artifacts.json - name: 'gcr.io/cloud-builders/gcloud' id: trigger-deploy args: [ "deploy", "releases", "create", "release-$SHORT_SHA", "--delivery-pipeline", "example", "--region", "asia-northeast1", "--build-artifacts", "artifacts.json" ]
Cloud Deployの設定ファイルです。
ターゲットとしてDev環境とProd環境を用意します。
<PROJECT_ID>
はプレースホルダです。実際の環境に合わせて設定する必要があります。
- clouddeploy.yaml
apiVersion: deploy.cloud.google.com/v1kind: DeliveryPipelinemetadata: name: exampledescription: main application pipelineserialPipeline: stages: - targetId: dev profiles: [] - targetId: prod profiles: []---apiVersion: deploy.cloud.google.com/v1kind: Targetmetadata: name: devdescription: A Dev clustergke: cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-1---apiVersion: deploy.cloud.google.com/v1kind: Targetmetadata: name: proddescription: A Prod clusterrequireApproval: truegke: cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-2
Helmのチャートを作成します。今回は作成したものをそのまま使います。
helm create deployments/helm/example
skaffoldの設定ファイルです。 ビルドとデプロイの設定を記述します。
- skaffold.yaml
apiVersion: skaffold/v2beta29kind: Configbuild: artifacts: - image: exampledeploy: helm: releases: - name: example chartPath: deployments/helm/example
今回は、こちらのリポジトリにファイルを配置しています。
https://github.com/wonyx/gcp-deploy-pipeline
リソースを準備する
実際に動かすためのGCPリソースを作成します。
GKEクラスタを作成する
export PROJECT=$(gcloud config get-value project)export LOCATION=asia-northeast1export CLUSTER_1=autopilot-cluster-1gcloud container clusters create-auto ${CLUSTER_1} \--region ${LOCATION} \--release-channel "regular"export CLUSTER_2=autopilot-cluster-2gcloud container clusters create-auto ${CLUSTER_2} \--region ${LOCATION} \--release-channel "regular"
Cloud Deployのパイプラインを作成する
gcloud deploy apply --file=clouddeploy.yaml --region=asia-northeast1
Cloud Buildのトリガーを設定する
GCPコンソールからCloud Buildsのトリガー設定を行なってもOKです。
gcloud beta builds triggers create github \
--repo-name gcp-deploy-pipeline \
--repo-owner wonyx \
--branch-pattern '^main$' \
--name gcp-deploy-pipeline \
--build-config cloudbuild.yaml
デプロイ
これで、GitHubにpushすると、Cloud Buildがトリガーされ、Cloud Deployが実行されます。
Devにデプロイする
プロモートする
プロモートボタンを押すと、Prodのデプロイが可能になります。Prodは承認を必要とするよう設定しましたので、承認するまでデプロイは始まりません。
Prodにデプロイする
確認ボタンを押すと、承認画面が表示される。
承認ボタンを押すと、Prodにデプロイが始まります。
最終的なCloudDeployのコンソール画面
Pros/Cons
Cloud Deployを利用してみて感じたPros/Consです。
Pros
- 機能がシンプル
差分を確認して、承認したらデプロイされるなど、必要最低限の機能が実装されています。 - 導入が容易
マネージドサービスなので今回のように設定ファイルを用意して、数回のコマンドで導入できます。 ArgoCDやtektonを自前で運用するとk8sクラスタの上に載せる必要があり、リソースも必要になりますから料金がかかってきます。 Cloud Deployは保守・運用に関するコストがほぼゼロになるので、コスト面で有利です。 - GCPとの親和性
マネージドサービスなので当然ですが、IAMロールなど利用することで、Cloud Deployのパイプラインを実行する権限を制限できます。 - 低料金
比較的低料金で利用できます。
Cons
- Skaffoldに依存する
Skaffoldをすでに利用していれば、あまり問題にはならないと思いますが、Cloud Deployを利用するには、Skaffoldを利用する必要があります。 Skaffoldでもレンダリングには、HelmやKustomizeを利用できまるので、それほど問題にはならないかもしれませんが、利用しているツールによっては移行するのが大変かもしれません。 - 限定公開クラスタに導入するのは難しい
実際に試せてはいませんが、Cloud DeployはCloud Build環境で動いているので、Cloud Buildから限定公開GKEにデプロイする方法と同じ方式を取れば実現はできると思います。ただし、この方式自体がVPC間をVPNで接続していたりして少しハードルが高いです。
参考:https://cloud.google.com/architecture/accessing-private-gke-clusters-with-cloud-build-private-pools
VPC PeeringだとCloud DeployのVPCからManaged GKEのコントロールプレーンのVPCに直接的にアクセスできないようです。推移的ピアリングの関係で。
限定公開クラスタでデプロイパイプラインを作るのであれば、k8s上に載せられるArgoCDなどを利用する方が容易かもしれません。
まとめ
Google Cloud Deployを利用してGitHubにPushしたら自動でデプロイされるCDパイプラインを構築してみました。 簡単なサンプルなので、すぐに構築できましたが、もっと実用的なパイプラインでは、CI/CD, Dev, Staging, Productionの環境をプロジェクトを分けて用意して、それぞれの環境にデプロイするようになるでしょう。 これから新しくデプロイパイプラインをGCP上で構築する場合は、選択肢の一つになりそうです。
