Google Cloud DeployとCI/CDパイプラインの構築
2023-01-10

#はじめに
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/v1
kind: DeliveryPipeline
metadata:
name: example
description: main application pipeline
serialPipeline:
stages:
- targetId: dev
profiles: []
- targetId: prod
profiles: []
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: dev
description: A Dev cluster
gke:
cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-1
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: A Prod cluster
requireApproval: true
gke:
cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-2
Helmのチャートを作成します。今回は作成したものをそのまま使います。
helm create deployments/helm/example
skaffoldの設定ファイルです。
ビルドとデプロイの設定を記述します。
- skaffold.yaml
apiVersion: skaffold/v2beta29
kind: Config
build:
artifacts:
- image: example
deploy:
helm:
releases:
- name: example
chartPath: deployments/helm/example
今回は、こちらのリポジトリにファイルを配置しています。
https://github.com/wonyx/gcp-deploy-pipeline
#リソースを準備する
実際に動かすためのGoogle Cloudのリソースを作成します。
#GKEクラスタを作成する
export PROJECT=$(gcloud config get-value project)
export LOCATION=asia-northeast1
export CLUSTER_1=autopilot-cluster-1
gcloud container clusters create-auto ${CLUSTER_1} \
--region ${LOCATION} \
--release-channel "regular"
export CLUSTER_2=autopilot-cluster-2
gcloud container clusters create-auto ${CLUSTER_2} \
--region ${LOCATION} \
--release-channel "regular"
#Cloud Deployのパイプラインを作成する
gcloud deploy apply --file=clouddeploy.yaml --region=asia-northeast1
#Cloud Buildのトリガーを設定する
Google Cloudのコンソールから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は保守・運用に関するコストがほぼゼロになるので、コスト面で有利です。 -
Google Cloudとの親和性
マネージドサービスなので当然ですが、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の環境をプロジェクトを分けて用意して、それぞれの環境にデプロイするようになるでしょう。
これから新しくデプロイパイプラインをGoogle Cloud上で構築する場合は、選択肢の一つになりそうです。
