🔊

Argo CD Notifications入門

2022/04/12に公開

これは何?

Argo CDのNotificationsを導入する際に調べた関する簡単なまとめです。ほとんど公式に書いてありますので、1次情報を追いたい方はそちらを参照ください。

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

Argo CD Notifications is 何?

概念

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 のように関数も使える

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

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がある。

https://argocd-notifications.readthedocs.io/en/stable/templates/#functions

Subscriptions

TriggersTemplates を組み合わせて実際に通知が飛ぶようにする。以下のように設定することで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

https://argocd-notifications.readthedocs.io/en/stable/services/overview/

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連携に関する具体的なセットアップ手順はこちら(他にもある)。

https://argocd-notifications.readthedocs.io/en/stable/services/slack/

Triggers/Templatesのサンプル集

ArgoCD公式が雛形やサンプルを出しているので、およそのことはここをみるとできそう。

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

NotificationsのMetrics

Argo CDからPrometheusに対して以下のMetricsを投げている

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

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