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

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

リソースを準備する

実際に動かすためのGCPリソースを作成します。

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のトリガーを設定する

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


クラウドアンドビルド株式会社

Cloud and Build, Inc.

クラウドアンドビルド株式会社は、Google Cloud パートナー企業です。

GCP 導入から開発・コンサルティングまでワンストップでお任せください。

お問い合わせ

デジタル変革を開始しますか?

お気軽にお問い合わせください。

contact_at_cloudandbuild.jp
所在地

〒305-0031

茨城県つくば市吾妻2丁目5番地1

つくばスタートアップパーク

Designed by Freepik
© 2020 Cloud and Build, Inc.