👻

【Kubernetes】ArgoCD NotificationsのTriggersの使い方まとめ

2023/01/17に公開約4,500字

内容

KubernetesのGitOpsを代表するツールArgoCD。そのArgoCDの状態変化をSlack等に通知してくれるArgoCD NotificationsのTrigger機能の使い方をまとめます。

Triggerとは

ArgoCD NotificationsのTrigger機能は、Slack等に通知を送る際に、どういう条件が発生した時にどのTemplateを通知で送るか?を設定できる機能です。

設定場所

argocd-notifications-cm ConfigMapにて設定が可能です。

用意されているTriggers

ArgoCD Notificationsでは最初から以下のような通知が用意されています。

最初から用意されているTriggers

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  trigger.on-deployed: |
    - description: Application is synced and healthy. Triggered once per commit.
      oncePer: app.status.sync.revision
      send:
      - app-deployed
      when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
  trigger.on-health-degraded: |
    - description: Application has degraded
      send:
      - app-health-degraded
      when: app.status.health.status == 'Degraded'
  trigger.on-sync-failed: |
    - description: Application syncing has failed
      send:
      - app-sync-failed
      when: app.status.operationState.phase in ['Error', 'Failed']
  trigger.on-sync-running: |
    - description: Application is being synced
      send:
      - app-sync-running
      when: app.status.operationState.phase in ['Running']
  trigger.on-sync-status-unknown: |
    - description: Application status is 'Unknown'
      send:
      - app-sync-status-unknown
      when: app.status.sync.status == 'Unknown'
  trigger.on-sync-succeeded: |
    - description: Application syncing has succeeded
      send:
      - app-sync-succeeded
      when: app.status.operationState.phase in ['Succeeded']
...

※( https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/catalog/install.yaml ) 参照

例えば、一番最後に定義されている trigger.on-sync-succeeded の場合、以下のコマンドで取得できるApplicationの.status.operationState.phase が、Succeed になった時に、app-sync-succeeded templateで定義されているフォーマットで通知先に通知されます。

$ kubectl get application <Application Name> -n argocd -o=jsonpath='{.status.operationState.phase}'

Triggerを作成する

試しに独自でTriggerを作成して、発火してみます。以下のTriggerとTemplateを argocd-notifications-cm に追加します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  template.trigger-test: |
    slack:
      attachments: |-
        [{
          "title": "{{ .app.metadata.name}}",
          "title_link":"{{.context.argocdUrl}}/applications/{{.app.metadata.name}}",
          "color": "#000000",
          "fields": [
          {
            "title": "Sync Status",
            "value": "{{.app.status.sync.status}}",
            "short": true
          },
          {
            "title": "Repository",
            "value": "{{.app.spec.source.repoURL}}",
            "short": true
          }
          ]
        }]
  trigger.test-trigger: |
    - description: Test Trigger
      send:
      - trigger-test
      when: app.status.sourceType == 'Kustomize' and app.status.operationState.phase in ['Succeeded']

※Syncが正常に終わったかつ、そのリソースがKustomizeによって作られていた場合にSlackに通知するTriggerです。

そして、上記のTriggerをArgoCD Applicationに設定します。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: service-a
  namespace: argocd
  annotations:
    notifications.argoproj.io/subscribe.test-trigger.slack: slack-channel-name
...

notifications.argoproj.io/subscribe.test-trigger.slack: slack-channel-name;aslack-channel-name-2 みたいに、; 区切りで複数チャンネルに投稿することも可能です。

設定後、対象のApplicationのmanifestsファイルを更新し、ArgoCDが正常にファイルをSyncすると、Templateに沿ったメッセージがSlackに投稿されます。

複数のTriggerをbundleする

条件に応じて、複数のTemplateを出し分けることも可能です。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  trigger.sync-operation-change: |
    - when: app.status.operationState.phase in ['Succeeded']
      send: [app-sync-succeeded]
    - when: app.status.operationState.phase in ['Running']
      send: [app-sync-runnig]
    - when: app.status.operationState.phase in ['Error']
      send: [app-sync-error]
    - when: app.status.operationState.phase in ['Failed']
      send: [app-sync-failed]

上記のTriggerは、app.status.operationState.phase のステータスが変更されるたびに、その変更された内容に沿った通知が送られるようなTriggerです。
ArgoCD NotificationsはSlackだけでなく、Github Commentにも通知を送ることができるため、

  • Syncがはじまったら、github commentに通知
  • 失敗したら、slackのアラートチャンネルに通知
  • 成功したら、slackのデプロイ報告チャンネルへ通知

といった具合に、通知条件と通知先を組み合わせることが可能です。

  

ArgoCDはGitOpsアプローチを採用しているため、常に状態を監視し変更を行います。そのため、正しく通知の運用を行うことは重要なため、ArgoCD Notificationsを利用することをおすすめします!

参照・引用・参考

https://argocd-notifications.readthedocs.io/en/stable/triggers/

Discussion

ログインするとコメントできます