Cloud Deploy やってみた:verify(デプロイの検証機能)を試してみた

Cloud Deploy やってみた:verify(デプロイの検証機能)を試してみた

こんにちは、急に春らしく暖かい気候が到来し梅が早々に散り
スギ花粉が猛威を奮っている様ですが、まだ花粉症は発症していない高田です

私はどちらかというと春の睡魔が甚だしくて、寝ても寝足りません…

さて、2週間ほど前の2023年2月27日にGoogle Cloud (GCP) Deploy の verify 機能がGAになったとのことで
早速どんな感じで使えるのか試してみました!

なお、Coud Deploy の基本的な動作、所感についてはこちらの記事 をご覧いただければと思います

また、公式ドキュメントのページはこちらです

事前準備

必要な権限やロールが足りてるか確認しておく

今回はGoogle Kubernetes Engine (以下GKE)でCloud Deployを実施するため以下が必要になります

  • Kubernetes 開発者の権限

  • clouddeploy.jobRunner ロール

設定についての詳細は公式ドキュメント参照されていますのでそちらをどうぞ

GKE Clusterの作成しておく

Cloud Deploy を使ってGKE をデプロイする場合、対応しているクラスタの種類としては

  • スタンダード版

  • Autopilot

  • 限定公開クラスタ

で動作します。限定公開クラスタも対応しているのは有難いですね!
ただし前記事にもある通りクラスタのネットワーク設定をしておかないと、リリースのタイミングでハマるかもしれないので要注意です

今回私はWebコンソールでAutopilotにしてGKEクラスタ “takada-cl” を作成しました

GKE Clusterの作成しておくの画面

Cloud Deploy の準備

ここからはCloud Deployの設定です
Cloud Deployの基本的な動作記事と同様、初めにデリバリーパイプラインとそのターゲットを指定する必要がありますのでそのyamlを記述します
デプロイ検証用のために1つ以上はターゲットを構成する必要があるとのことで、こんな感じのyamlファイルを準備しました
デプロイ検証機能のverifyスタンザがどのタイミングで動作するのかイメージしづらかったので敢えて承認フローが必要となるよう“requireApproval: true”を設定しています

Plain text
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: takada-demo
description: taada deploy server pipeline
serialPipeline:
  stages:
  - targetId: takada-cl
    profiles: []
    strategy:
     standard:
       verify: true
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: takada-cl
description: FOR Cloud Deploy verify cluster
requireApproval: true
gke:
  cluster: projects/{プロジェクト名}/locations/us-central1/clusters/takada-cl

上記の設定をCloud Deployへ登録します

Plain text
gcloud deploy apply --file clouddeploy.yaml --region=us-central1 --project {プロジェクト名}

Webコンソールでデリバリーパイプラインが作成されたのを確認できました

Cloud Deploy の準備の画面

Skaffold の構成

検証のための Skaffold を構成します
ポイントは以下の通り

  • ここの“manifests:“以下3行は、過去記事の kustomizeを使用したmanifest をデプロイするよう記述しています

  • Kustomizeのデプロイ指定を記述する際の注意点として overlays より深い階層でskaffold.yamlのmanifest定義を記述するとCloud Deploy時のビルド中baseを参照できずにビルド失敗します

  • まずは検証失敗を確認したいので、安直ですがverifyスタンザの部分はshellでexit code 1を返すように記載しました

Plain text
apiVersion: skaffold/v3alpha1
kind: Config
build:
  artifacts:
    - image: nginx
      context: nginx
manifests:
  kustomize:
    paths:
    - overlays/dev
deploy:
  kubectl: {}
verify:
- name: nginx
  container:
    name: nginx
    image: nginx
    command: ["/bin/sh"]
    args: ["-c", "exit 1"] #failさせる

Cloud Deploy 動作確認

では以下のコマンドにてリリースしてみます

Plain text
gcloud deploy releases create v1 --delivery-pipeline=takada-demo --region=us-central1 --images=nginx=nginx:1.23.3

Webコンソールで確認してみるとまだ承認待ちの状態になっているv1が作成されていますのでリンクを辿っていきます

Cloud Deploy 動作確認の画面(1)

この段階でリリースを作成した時のCloud Buildのログやmanifestなどがリンクになっているmanifestの内容もブラウザで確認が可能です

Cloud Deploy 動作確認の画面(2)

試しに、yamlファイルを表示してみました
Chromeブラウザだと別タブで表示されます
レビューしやすそうですね

Cloud Deploy 動作確認の画面(3)

manifest.yamlの表示リンクを選択した時の様子

それでは、先ほどの画面から承認してみます

Cloud Deploy 動作確認の画面(4)

Cloud Deploy 動作確認の画面(5)

画面遷移して、デプロイ開始の通知が画面中央下に出るので「ロールアウトを表示」を選択します

Cloud Deploy 動作確認の画面(6)

デプロイ直後は処理中となるので、ステータスが変わるまで待ちます

Cloud Deploy 動作確認の画面(7)

しばらくするとレンダリングにあるVerificationのステータスが失敗となりました

Cloud Deploy 動作確認の画面(8)

「確認ログ」からビルドログを確認してみるとexit code 1によってERRORになり検証失敗になっていることが確認できました!

Cloud Deploy 動作確認の画面(9)

Deplomentは成功ステータスですがロールアウト自体も失敗のステータスとなっています
これは公式ドキュメントの通りとなります(抜粋):

Skaffold は、skaffold.yaml の verify スタンザで指定されたテスト(複数可)を呼び出し、デプロイされたアプリケーションに対して実行します。
いずれかのテストに失敗した場合、検証は失敗します。

  • 検証が失敗した

    • ロールアウトも失敗します。
  • 検証中にデプロイが失敗した場合は、ロールアウトを検査して確認できます。

Webコンソール画面の上部でリニューアル版が予定されている様ですが、このPREVIEWからも確認してみます

Cloud Deploy 動作確認の画面(10)

manifestの要素別に確認ができるので分かりやすく、cloudbuildのログも同画面内で見られます
いちいち別画面へ遷移せずに確認できるのはいいですね

Cloud Deploy 動作確認の画面(11)

失敗した認証の再試行

verifyスタンザは、検証のリトライが可能です
今回の環境でのコマンドは以下になります

Plain text
gcloud deploy rollouts retry-job v1-to-takada-cl-0001 \
--job-id=verify \
--phase-id=stable \
--delivery-pipeline=takada-demo \
--release=v1 \
--region=us-central1

Webコンソールからでもリトライ実行が可能です(先ほどのPREVIEW版画面の以下)

失敗した認証の再試行の画面(1)

リトライ実行直後、Webコンソール上でも処理中の画面に切り替わっているのが確認できます
リトライ分のビルドログが増えていることも確認できました!

失敗した認証の再試行の画面(2)

※今回のmanifestはexitステータスコードを1で返し続けるので何度リトライしても確実に失敗してしまいます

失敗しないケースを見てみる

shellコマンドでビルドログにechoで適当に文字出力させるようにしたものを、リリースバージョンを上げてデプロイしてみます

skaffold.yamlは以下の様に修正しました

Plain text
piVersion: skaffold/v3alpha1
kind: Config
build:
  artifacts:
    - image: nginx
      context: nginx
manifests:
  kustomize:
    paths:
    - overlays/dev
deploy:
  kubectl: {}
verify:
#success
- name: nginx
  container:
    name: nginx
    image: nginx
    command: ["/bin/sh"]
    args: ["-c", "echo 'Two more deliveries were not enough to rank at the top of the big run in SPL3!!!'"]

それではリリースを作成します

Plain text
gcloud deploy releases create v2 --delivery-pipeline=takada-demo --region=us-central1 --images=nginx=nginx:1.23

v2が追加されているので、承認します

失敗しないケースを見てみるの画面(1)

失敗しないケースを見てみるの画面(2)

ロールアウトの処理を再度待ってしばらくすると、Verificationが成功に変わりました!
ログも見てみます

失敗しないケースを見てみるの画面(3)

ちゃんとskaffold.yamlに指定した文字列が出力されていることを確認できていますね

失敗しないケースを見てみるの画面(4)

後片付け

デリバリーパイプラインでロールアウト情報が入っている場合--forceのオプションを含めることでパイプラインの削除が行えます(元には戻せないので注意)

Plain text
gcloud deploy delivery-pipelines delete takada-demo --region us-central1 --force

事前準備で作成したGKEのAutopilotクラスタの削除も忘れずに

所感

個人的にハマりポイントかもと思ったこと

Cloud Deployで検証に失敗した結果を受けて、その原因がCloud Delopyを構成するmanifest側にある時に
skaffold.yamlやk8sのmanifestを書き換えたもの、つまりデプロイ構成に変更を加えているので、それはCloud Deployとしては別バージョンとして準備していることと同義になる
よって別バージョンでロールアウトを作成しないといけないということになかなか気づけなかったです

失敗したverifyスタンザのみ、再試行できるので上の要素に気づかない時に
(設定変更したskaffold.yamlやoverlays側のmanifestの変更反映されないな)とか思いながら、retry-jobコマンドを何度も実行してしまいました
また、今となっては当たり前なことでエラーになっていると理解しましたが、同じリリースバージョンのgcloudコマンドを実行してた時もあり、結果は「そのバージョンは既にリリースされてるよ」と怒られたりしてました

Plain text
ERROR: (gcloud.deploy.releases.create) ALREADY_EXISTS: Resource 'projects/grasys-study/locations/us-central1/deliveryPipelines/takada-demo-app/releases/takada-v1' already exists

こんな時に便利そう

  • 例えばnginxコンテナのディレクティブをカスタムしたものを、デプロイ前にverifyスタンザで疎通確認コマンドを入れ込んで検証する

  • prometheusのミドルウェア用のexporterをサイドカーで追加した際にメトリクス取れるか確認したりする

  • 使い方次第ではカナリアデプロイできるかもしれない

試す設定はそこまで複雑ではなかったですし原因の切り分けの曖昧さも回避でき、デプロイログも確認できるので、これを機会にデプロイ処理をCloud Deployにしてみるのも良さそうです。

それでは、本日はここまで!