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

Posted on
Argo CD

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を指定しておけばよいと思います。