【Kubernetes】ArgoCD NotificationsのTriggersの使い方まとめ
内容
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']
...
例えば、一番最後に定義されている 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を利用することをおすすめします!
参照・引用・参考
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion