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

Google Cloud
CloudDeploy

2023-01-10

Julius SilverによるPixabayからの画像

#はじめに

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上で構築する場合は、選択肢の一つになりそうです。