Argo CD Notifications入門
これは何?
Argo CDのNotificationsを導入する際に調べた関する簡単なまとめです。ほとんど公式に書いてありますので、1次情報を追いたい方はそちらを参照ください。
Argo CD Notifications is 何?
- みんな大好きArgo CDが持つ機能の1つ
- 元々はArgo CD Notifications単体で別管理されていたが、Argo CDに統合された
- helm chart的にはargocdのhelm内に追加されている
- ArgoCDのApplicationの状態に応じていい感じに通知(email, slackなど)できる機能
概念
Triggers
通知条件と通知の際に利用するtemplatesを argocd-notifications-cm
ConfigMapに定義する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
trigger.on-sync-status-unknown: |
- when: app.status.sync.status == 'Unknown' # trigger condition
send: [app-sync-status, github-commit-status] # template names
trigger.sync-operation-change: |
- when: app.status.operationState.phase in ['Error', 'Failed'] # `in` も使える
send: [app-sync-failed, github-commit-status]
# Optional 'oncePer' property ensure that notification is sent only once per specified field value
# E.g. following is triggered once per sync revision
trigger.on-deployed: |
when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
oncePer: app.status.sync.revision
send: [app-sync-succeeded]
whenでは when: time.Now().Sub(time.Parse(app.status.operationState.startedAt)).Minutes() >=
5 のように関数も使える
Templates
通知内容の雛形であり、 argocd-notifications-cm
のConfigMapに定義する。
ここで定義したものをtriggersから参照する。
templateでは以下の値を使って任意の値を取得できる。
-
app
holds the application object. -
context
is user defined string map and might include any string keys and values. -
serviceType
holds the notification service type name. The field can be used to conditionally render service specific fields. -
recipient
holds the recipient name.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
template.my-custom-template-slack-template: |
message: |
Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
以下のように context
を定義することでグローバルに引き回せるvalueを作れる
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
context: |
region: east
environmentName: staging
template.a-slack-template-with-context: |
message: "Something happened in {{ .context.environmentName }} in the {{ .context.region }} data center!"
triggersと同様にtemplates側にもFunctionsがある。
Subscriptions
Triggers
と Templates
を組み合わせて実際に通知が飛ぶようにする。以下のように設定することでApplicationに対するsubscriptionができるようになる。
notifications.argoproj.io/subscribe.<trigger>.<service>: <recipient>のannotation
を付与する(keyの意味は以下の通り)。
-
on-sync-succeeded
- trigger name -
slack
- notification service name -
my-channel1;my-channel2
- a semicolon separated list of recipients
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my-channel1;my-channel2
ArgoProject単位でsubscribeすることも可能。
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
annotations:
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my-channel1;my-channel2
また argocd-notifications-cm
CofigMapに定義することで全てのApplicationに対して設定することもできる(この定義が全てのApplicationに対して適応される)。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
# Contains centrally managed global application subscriptions
subscriptions: |
# subscription for on-sync-status-unknown trigger notifications
- recipients:
- slack:test2
- email:test@gmail.com
triggers:
- on-sync-status-unknown
# subscription restricted to applications with matching labels only
- recipients:
- slack:test3
selector: test=true
triggers:
- on-sync-status-unknown
Services
argocd-notifications-cm
ConfigMapに対してslackなどのtokenを突っ込むことでSlackやemailなどの通知サービスの設定を行える。
なお、機密情報に関しては以下のように設定すること。
Sensitive data like authentication tokens should be stored in argocd-notifications-secret Secret and can be referenced in service configuration using $<secret-key> format. For example $slack-token referencing value of key slack-token in argocd-notifications-secret Secret.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
service.slack: |
token: $slack-token
slack連携に関する具体的なセットアップ手順はこちら(他にもある)。
Triggers/Templatesのサンプル集
ArgoCD公式が雛形やサンプルを出しているので、およそのことはここをみるとできそう。
NotificationsのMetrics
Argo CDからPrometheusに対して以下のMetricsを投げている
argocd_notifications_deliveries_total
Number of delivered notifications. Labels:
-
template
- notification template name -
notifier
- notification service name -
succeeded
- flag that indicates if notification was successfully sent or failed.
argocd_notifications_trigger_eval_total
Number of trigger evaluations. Labels:
-
name
- trigger name -
triggered
- flag that indicates if trigger condition returned true of false.
Discussion