😶‍🌫️

ArgoCDのtracking-idを活用して通知をいい感じに分岐させる

2023/09/17に公開

1. 背景

ArgoCDにAPIサーバー、フロントエンドアプリケーションなど複数のアプリケーションに対応したargocd notificationsを実装してたのですが、ある悩みを抱えていました。APIサーバーで使われるDBのmigrationはAPIサーバーアプリケーションのInitContainer時に行うのではなく、別でマイグレーションJobを手動する形を取っており、その手動実行がcompletedであれば、通知をしたい形でいました。
よって、app.status.operationState.phase in ['Succeeded'] and app.status.sync.status == 'Synced'とは別の通知分岐が欲しい形になる。
ですが、どうやら通知の際に使うargocd-notifications-cmで使われる.appの情報がDeployment時とJobの時では内容に差異があった。
Jobの時の.appの情報でも分岐させることはできないことはなさそうだが、簡単な分岐で通知を送るようにしたい。

2. ArgoCDのtracking-idとは

ArgoCDのv2.2で追加された機能。

  1. argocd.argoproj.io/tracking-idアノテーションを使用してアプリケーションリソースを追跡できる。(ラベルとアノテーションの両方を維持する必要がない場合に使用)
  2. 他のKubernetesツールとの衝突がなくなる。
  3. クラスターに複数のArgoCDをデプロイしてもリソースとArgoCDの関係がわかるようになる。

3. tracking-idの設定方法

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: test-app
  annotations:
    argocd.argoproj.io/tracking-id: "1"
spec:
  project: default
...

4. 実際の設定

実際のmigrationのArgoCDアプリケーションに上記と同じようにannotationsを設定した後、argocd-notifications-cmに分岐を追加します。
argocd-notifications-cmの実装についてはArgoCD Notification Triggersをご覧ください。

    - description: Migration Job Notification
      send:
      - job-notification
      when: app.status.health.status == 'Healthy' and app.metadata.annotations['argocd.argoproj.io/tracking-id'] == '1'

※ちなみにカスタム的に入れたannotationsは.app.metadata.annotationsに認識されない。

5. 参考文献

ArgoCD Additional tracking methods via an annotation

Discussion