WEBKT

Argo CD 通知进阶:精准定制健康状态告警,告别无效提醒!

36 0 0 0

在GitOps盛行的今天,Argo CD已成为Kubernetes应用部署和管理的核心工具。然而,如何有效地管理Argo CD的通知,避免“告警疲劳”,同时确保关键信息不会遗漏,是许多团队面临的挑战。特别是对于应用健康状态的监控,我们通常只关心服务出现问题时(如DegradedMissing)的告警,而不是每次状态变化都通知。

本文将详细指导你如何在argocd-notificationsConfigMap中,精准定义TriggerTemplate,以实现仅当应用健康度变为DegradedMissing时才触发Webhook通知。

1. 理解 argocd-notifications 的核心组件

在深入配置之前,我们先回顾一下argocd-notifications的三个核心概念:

  • Service(服务): 定义通知发送的目标,例如Slack、Email、Webhook等。
  • Trigger(触发器): 定义何时发送通知。它包含一个when条件,当该条件满足时,就会触发通知。
  • Template(模板): 定义通知的内容和格式。它通常引用Service和Trigger,并使用Go模板语法来渲染应用信息。

我们的目标就是通过Triggerwhen条件来筛选健康状态,并通过Template来定制Webhook的JSON payload。

2. 定义 Webhook 服务

首先,你需要在argocd-notifications-cm或者argocd-notifications-secret中定义你的Webhook服务。这里以argocd-notifications-cm为例,定义一个通用的Webhook服务:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd # 你的Argo CD部署的命名空间
data:
  service.webhook.my-webhook: |
    url: https://your-webhook-endpoint.com/receive
    headers:
      - name: Content-Type
        value: application/json
    # 如果需要自定义HTTP方法,默认为POST
    # method: POST

注意: 实际的Webhook URL如果包含敏感信息,建议将其放入argocd-notifications-secret中。

3. 精准定义 Trigger:只关注 DegradedMissing 健康状态

这是实现我们目标的关键一步。我们将创建一个名为on-app-health-issue的触发器,其when条件将严格筛选出健康状态为DegradedMissing的应用。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  # ... 其他配置
  trigger.on-app-health-issue: |
    - when: app.status.health.status in ['Degraded', 'Missing']
    - send: [app-health-webhook] # 这里会指向下面定义的template名称

解释:

  • when: app.status.health.status in ['Degraded', 'Missing']:这个条件非常关键。它使用Argo CD应用对象的status.health.status字段来判断当前应用的健康状态是否在DegradedMissing这两个列表中。只有满足这个条件的应用状态变化才会触发此告警。
  • send: [app-health-webhook]:指定当此触发器被满足时,应该发送哪个模板定义的通知。我们将在下一步定义app-health-webhook这个模板。

你还可以根据需要添加其他条件,例如,如果希望只在同步成功后健康状态变为Degraded时才通知,可以组合条件:
when: app.status.sync.status == 'Synced' and app.status.health.status in ['Degraded', 'Missing']。但通常,我们更关心健康状态本身。

4. 创建 Webhook 通知模板

现在,我们需要定义app-health-webhook模板,它将把应用的相关信息格式化为Webhook接收方能够解析的JSON payload。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  # ... 其他配置
  template.app-health-webhook: |
    webhook:
      my-webhook:
        json: |
          {
            "text": "🚨 Argo CD 告警:应用 {{.app.metadata.name}} 健康状态异常!",
            "attachments": [
              {
                "title": "{{.app.metadata.name}}",
                "title_link": "{{.app.status.operationState.syncResult.revision.repoURL | buildRepoURL}}/tree/{{.app.status.operationState.syncResult.revision.revision}}",
                "color": "#FF0000",
                "fields": [
                  {
                    "title": "当前状态",
                    "value": "{{.app.status.health.status}}",
                    "short": true
                  },
                  {
                    "title": "同步状态",
                    "value": "{{.app.status.sync.status}}",
                    "short": true
                  },
                  {
                    "title": "命名空间",
                    "value": "{{.app.spec.destination.namespace}}",
                    "short": true
                  },
                  {
                    "title": "Argo CD 链接",
                    "value": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}",
                    "short": false
                  },
                  {
                    "title": "上次操作",
                    "value": "{{if .app.status.operationState}}{{.app.status.operationState.phase}}于{{.app.status.operationState.finishedAt | parseRFC3339 | formatDate "2006-01-02 15:04:05"}}{{else}}无{{end}}",
                    "short": false
                  }
                ]
              }
            ]
          }

解释:

  • webhook.my-webhook: 指明这个模板是为名为my-webhook的服务准备的。
  • json: 这里定义了Webhook的JSON payload。你可以根据你的Webhook接收方(例如Slack、Microsoft Teams、自定义HTTP服务)的要求调整JSON结构。
  • Go模板语法:
    • {{.app.metadata.name}}: 获取应用名称。
    • {{.app.status.health.status}}: 获取应用健康状态。
    • {{.context.argocdUrl}}: 获取Argo CD的URL,方便直接跳转到应用页面。
    • 其他字段可以根据Application CRD的结构自由引用。

5. 完整 ConfigMap 示例

将上述Trigger、Template和Service合并到一个完整的argocd-notifications-cm中:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  service.webhook.my-webhook: |
    url: https://your-webhook-endpoint.com/receive
    headers:
      - name: Content-Type
        value: application/json

  trigger.on-app-health-issue: |
    - when: app.status.health.status in ['Degraded', 'Missing']
    - send: [app-health-webhook]

  template.app-health-webhook: |
    webhook:
      my-webhook:
        json: |
          {
            "text": "🚨 Argo CD 告警:应用 {{.app.metadata.name}} 健康状态异常!",
            "attachments": [
              {
                "title": "{{.app.metadata.name}}",
                "title_link": "{{.app.status.operationState.syncResult.revision.repoURL | buildRepoURL}}/tree/{{.app.status.operationState.syncResult.revision.revision}}",
                "color": "#FF0000",
                "fields": [
                  {
                    "title": "当前状态",
                    "value": "{{.app.status.health.status}}",
                    "short": true
                  },
                  {
                    "title": "同步状态",
                    "value": "{{.app.status.sync.status}}",
                    "short": true
                  },
                  {
                    "title": "命名空间",
                    "value": "{{.app.spec.destination.namespace}}",
                    "short": true
                  },
                  {
                    "title": "Argo CD 链接",
                    "value": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}",
                    "short": false
                  },
                  {
                    "title": "上次操作",
                    "value": "{{if .app.status.operationState}}{{.app.status.operationState.phase}}于{{.app.status.operationState.finishedAt | parseRFC3339 | formatDate "2006-01-02 15:04:05"}}{{else}}无{{end}}",
                    "short": false
                  }
                ]
              }
            ]
          }

6. 应用配置并测试

  1. 保存上述YAML配置为文件,例如argocd-notifications-config.yaml
  2. 应用配置到你的Kubernetes集群:
    kubectl apply -f argocd-notifications-config.yaml -n argocd
    
  3. 重启argocd-notifications-controller Pod以确保配置生效:
    kubectl rollout restart deployment/argocd-notifications-controller -n argocd
    
  4. 测试
    • 部署一个正常运行的应用。
    • 故意引入一个会导致应用健康状态变为Degraded的改动(例如,部署一个不存在的镜像,或者修改Deployment的Readiness/Liveness Probe使其失败)。
    • 观察你的Webhook接收端(例如Slack频道或自定义HTTP服务日志),确认是否收到了预期的通知,并且通知内容是否正确。
    • 尝试部署一个健康的应用,确认不会收到不必要的通知。

通过以上配置,你的Argo CD通知系统将变得更加智能和高效,只在应用健康出现真正问题时发出告警,极大减少告警噪音,让团队能更专注于解决实际问题。

DevOps老王 Argo CDGitOpsWebhook通知

评论点评