grasys blog
grasysブログ

 Google Cloud Deployでデリバリーしてみた

izumi

どうも泉水です。

4ヶ月ほど経ってしましいましたが、1月26日にGoogle Cloud DeployがGAされてちょっと使ってみたので使い勝手などをブログにしたいと思います。 実はpublic previewのタイミングでGAしたら使いたいなと思って触ってみてたんですけどね。。。

Google Cloud Deployは継続的デリバリー(CD)を行うためのマネージドサービスです。現在はGoogle Kubernetes Engine(GKE)のみが対象となっているようです。

Google Cloud のConsoleからだと、ナビゲーションメニューの「CI/CD」のサブメニューから選択することができます。

web console

Google Cloud Deployによるアプリケーションデプロイの流れ

1. GKEクラスタの構築

Cloud DeployはGKEクラスタへデプロイするためのマネージドサービスなのでまずはGKEクラスタを作成します。 今回はGKEクラスタを作成することが目的ではないので作成方法は割愛しますが、以下の条件で作成しています。

・限定公開クラスタ
・承認済みネットワークに接続元のIP
・クラスタ名「deploy-test」

2. デリバリーパイプラインとターゲットの作成

デプロイパイプラインとデプロイターゲットを定義するYAMLファイルを作成しCloud Dployに登録します。

パイプライン
・name:deploy-test
・targetId:dev

ターゲット
・name:dev
・cluster:deploy-test

  • clouddeploy.yaml
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: deploy-test
description: deploy-test
serialPipeline:
  stages:
  - targetId: dev
    profiles: []
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: dev
description: deploy to dev
requireApproval: true
gke:
  cluster: projects/{プロジェクト名}/locations/asia-northeast1-a/clusters/deploy-test
$ gcloud deploy apply --file clouddeploy.yaml --region=asia-northeast1 --project {プロジェクト名}

登録結果をコンソールで確認

web console

3. リリースの作成

リリースはデプロイ対象となる成果物の固まりです。具体的にはデプロイ対象となるコンテナイメージや、そのイメージをGKE上にデプロイするためのマニフェスト類です。 Cloud Deployは内部的にSkaffoldが使用されています。デプロイするためにKustomizeやHelmを使用することもできるようです。今回は、それらを利用せずシンプルにSkaffoldとkubernetsのマニフエストのみでデプロイしてみました。

skaffold.yamlとして以下のファイルを作成しました。 manifestディレクトリにある、「k8s-」から始まるマニフェストをデプロイ対象としてまとめています。

  • skaffold.yaml
apiVersion: skaffold/v2beta16
kind: Config
deploy:
  kubectl:
    manifests:
      - ./manifest/k8s-*

manifestディレクトリ配下にはnginx podをデプロイするための単純なマニフェストを用意してみました。

  • k8s-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  labels:
    app.kubernetes.io/name: web
    app.kubernetes.io/instance: nginx
    app.kubernetes.io/version: "0.0.1"
    app.kubernetes.io/part-of: web
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx

このマニフェストを「version-01」というリリース名でまとめて、nginxのイメージは1.20.0を指定してデプロイを実行してみます!

gcloud deploy releases create version-01 --project={プロジェクト名} --region=asia-northeast1 --delivery-pipeline=deploy-test --images=nginx=nginx:1.20.0

今デプロイを実行したリリースが保留中のリリースとして反映されました。

web console

実はこの保留中になっているリリースですが、最初作成したターゲットに起因しています。 マニフェストをよく見てみると「requireApproval」がtrueとなっています。このパラメータをtrueにすることでデプロイを実行するには承認が必要となります。逆にfalseを設定した場合は承認を要せずデプロイが実行されます。

それにしてもデプロイ状況が可視化されてわかるのはとても見やすくていいですね!

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: dev
description: deploy to dev
requireApproval: true

4. 承認

それでは実際にデプロイの反映を行なっていきます。 先ほどのパイプラインの可視化の画面から「確認」リンクをクリックすることでリリースの一覧が確認することができます。

web console

そこからREVIEWリンクをクリックすると実際の承認画面で「承認」もしくは「拒否」を選択することができます。 この画面ではマニフエストの差分を確認することができます。今回は新規作成なので全てが差分となっていますが、更新の際は差分を確認してレビューすることができるのでかなり便利ですね。

web console

では承認して、デプロイ完了をじっと待ちます。

失敗。。。

web console

そんな馬鹿なと思いましたが、Cloud Buildのログを確認してみます。 実はCloud DeployのバックエンドではCloud Buildが実行されているので失敗した場合はCloud Build側のログを参照する必要があります。

web console

なんとGKEのクラスタエンドポイントへの接続がタイムアウトしているようです。 今回はCloud Deployの動作を確認したいのでコントロール プレーン承認済みネットワークを解放しアクセスを許可して再度実行してみました。

gcloud deploy releases create version-02 --project=grasys-dev --region=asia-northeast1 --delivery-pipeline=deploy-test --images=nginx=nginx:1.20.0
web console

承認して、またデプロイ完了をじっと待ちます。

web console

今度はデプロイが正常に終了しました。 kubectlコマンドでpodが起動しているのも確認できました。

$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5879b57d48-h65kh   1/1     Running   0          93s

5. 使ってみて

Cloud Deployを触ってみてどうだったか・・・
・CD環境の構築が簡単
・GUIで操作ができて楽
・他のCDツールと違いマネージドなのでインフラの管理が必要ない

この辺りがCloud Deployのメリットなのかなと感じました。構築に関してはCloud Deploy用の設定ファイル、Skaffoldの設定ファイルを準備する必要はありますがCloud Deployの設定ファイルも記述量は多くないですし、SkaffoldはKubernetesでは割とスタンダードなツールなのでそこまでハードルは高くないのではと思います。

今回は承認済みネットワークに接続元のIPの設定をしていた為エラーになってたので急遽そこの設定を変更しましたが、そこに関してはCloud Buildのプライベートプールを利用することで回避できそうです。 また、マルチクラスタのパラレルデプロイや、カナリヤデプロイは提供されていなさそうです。

6. 終わり

今回は単純なデプロイを行ってみましたが、導入のハードルはかなり簡単そうです。あとは各プロジェクトのデプロイフローにあった作業ができるかどうかでしょうか。まだこれから色々と機能を試してみようと考えているのでまた続報を報告できればと思っています。

株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。