メインコンテンツまでスキップ

Argo CDのResource HookでSync直前にJob(db migration)を実行する

· 約3分
ごとけん
Solutions Architect

Argo CDのResource Hookについて調べたことを整理しておきます。

  • RailsアプリケーションをKubernetesで動かしArgo CDでデプロイする時に、rails db:migrateをいつ実行するのか?
  • Syncの度に実行するのがベター。
  • これをArgo CDのResource Hookを使って実現します。

Resource Hookとは

  • 特定の処理をSyncの前や直後などに実行する為のArgo CDの機能です。
    • 通常のSyncとは異なるタイミング(Phaseと呼びます)を指定して、Kubernetesのリソース(主にJobリソースになる)を作成します。
  • 以下にあげるユースケースが想定されます。
    • DBスキーマのマイグレーションをアプリケーションデプロイ前に実行する。
    • Rollong Updateよりも複雑なデプロイを実現する。
    • Rolling Update直後にHealth Checkをおこなう。
    • Syncが失敗した時にclean-upを処理を実行する。

使い方

  • 使い方は非常に簡単でargocd.argoproj.io/hookというannotationをリソースに付与するだけです。
  • たとえばSync直前にsleep 5するJobを実行する場合は、以下のようにマニフェストを作成します。
apiVersion: batch/v1
kind: Job
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
name: pre-sync-job
spec:
template:
spec:
containers:
- command:
- sleep
- "5"
image: XXX
imagePullPolicy: Always
name: pre-sync-job

処理を実行するタイミングの指定​

  • 処理を実行する(hookする)タイミングはユースケースに合わせてargocd.argoproj.io/hookの値として指定します。
  • 具体的には、通常のSync操作の前後か最中の中から選ぶことになります。
タイミング説明
PreSyncマニフェストのapply前
SyncPreSync hookが全て正常終了したあと、マニフェストのapplyと同じタイミング
Skipマニフェストのapplyをskipすることを指示する
PostSyncSync hookが正常終了して、applyが成功して、全てのリソースがHealthyになったら
SyncFailSyncが失敗したら
  • Syncの直後にHealth Checkの為の処理を実行したい場合は、以下のようなannotationを付与することになるでしょう。
argocd.argoproj.io/hook: PostSync

Hookで作成したリソースの削除​

  • 作成したリソースを削除するポリシーはargocd.argoproj.io/hook-delete-policyで指定します。
ポリシー説明
HookSucceededhookが成功したら削除する(例えばジョブが正常終了したら削除する)
HookFailedHookが失敗したら削除する
BeforeHookCreation既に存在するリソースを、新しいリソースを作成する直前に削除する
  • 特にこだわりがなければBeforeHookCreationを指定しておけばよいと思います。