Argo CD Application間のSync Waveが効かないことへの対策
Applicationリソースのカスタムヘルスチェックは設定してある。
level-1-appという親の下に、
level-2-app-1
argocd.argoproj.io/sync-wave: '5'と設定
level-2-app-2
argocd.argoproj.io/sync-wave: '10'と設定
という子Applicationがある。
Sync Waveに差をつけているので、level-2-app-1のSyncが完了(Health StatusがHealthy)してから、level-2-app-2のSyncを開始してほしい。
しかし、実際にはlevel-2-app-1がまだProgressingなのに、level-2-app-2のSyncが開始(して完了)してしまっている。
https://scrapbox.io/files/622825b53d5cef0023a34fd5.png
level-2-app-1の状態遷移をよく観察すると
Health Status = Healthy
Sync Status = Synced
Last Sync Result = Sync OK
↓
Health Status = Healthy
Sync Status = OutOfSync ←変わる
Last Sync Result = Sync OK
↓
Health Status = Healthy
Sync Status = OutOfSync
Last Sync Result = Syncing ←変わる
↓
Health Status = Healthy
Sync Status = Synced
Last Sync Result = Sync OK
ここで一瞬、すべてが完了したかのような状態になる。が、実際には、この瞬間のHealth Statusは前回のSync時のもので、子リソースがまだProgressingなので、その状態が上に伝搬してProgressingになるのが正しい。
実際、一瞬後にはそのようになる。
↓
Health Status = Progressing ←この間、本当はSync Wave待ってほしい
Sync Status = Synced
Last Sync Result = Sync OK
「一瞬、すべてが完了したかのような状態」になったときにSync Waveが進行してしまうため、意図とは違う動きになる。
/icons/hr.icon
調べてみると、ARGOCD_SYNC_WAVE_DELAYという環境変数が見つかった。
関連するコードコメントも見つかった。
参照してみる
マニフェストを適用した後、Argo CDはリソースの状態を評価するのが速すぎるため、サードパーティのコントローラーがステータスを更新する前にwaves / PostSyncを進行する可能性があります。この問題は、ArgoCDで行われたパフォーマンスの改善によって最近明らかになったと思います。
/icons/hr.icon
ARGOCD_SYNC_WAVE_DELAYをapplication-controllerに設定して試してみると、level-2-app-1がProgressing→Healthyになるまで、level-2-app-2のSync開始を待つようになった。
https://scrapbox.io/files/62282d455b029600200ee57a.png