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前 |
Sync | PreSync hookが全て正常終了したあと、マニフェストのapplyと同じタイミング |
Skip | マニフェストのapplyをskipすることを指示する |
PostSync | Sync hookが正常終了して、applyが成功して、全てのリソースがHealthy になったら |
SyncFail | Syncが失敗したら |
- Syncの直後にHealth Checkの為の処理を実行したい場合は、以下のようなannotationを付与することになるでしょう。
argocd.argoproj.io/hook: PostSync
Hookで作成したリソースの削除
- 作成したリソースを削除するポリシーは
argocd.argoproj.io/hook-delete-policy
で指定します。
ポリシー | 説明 |
---|
HookSucceeded | hookが成功したら削除する(例えばジョブが正常終了したら削除する) |
HookFailed | Hookが失敗したら削除する |
BeforeHookCreation | 既に存在するリソースを、新しいリソースを作成する直前に削除する |
- 特にこだわりがなければBeforeHookCreationを指定しておけばよいと思います。