Argo CD 消息通知和 webhook
Argo CD 消息通知和 webhook
有的时候我们可能希望将应用同步的状态发送到指定的渠道,这样方便我们了解部署流水线的结果,最新版本 Argo CD
也内置了 ArgoCD Notifications
用于同步状态通知功能,同时我们也可以与第三方的系统进行集成。
- ArgoCD Notifications - Argo CD 通知系统,持续监控 Argo CD 应用程序,旨在与各种通知服务集成,例如 Slack、SMTP、Telegram、Discord 等。
- Argo Kube Notifier - 通用 Kubernetes 资源控制器,允许监控任何 Kubernetes 资源并在满足配置的规则时发送通知。
- Kube Watch - 可以向 Slack/hipchat/mattermost/flock 频道发布通知,它监视集群中的资源变更并通过 webhook 通知它们。
这里我们就以 ArgoCD Notifications
为例来说明如何使用 企业微信
来通知 Argo CD
的同步状态通知。
ArgoCD Notifications
默认已经随着 Argo CD
安装了:
$ kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-notifications-controller-5b56f6f7bb-jqpng 1/1 Running 1 (163m ago) 3d2h
然后我们企业微信群里创建一个机器人。
然后我们需要修改 install.yaml
文件中的 argocd-notifications-cm
添加相关配置才能支持企业微信机器人。
---
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
service.webhook.qywx: |
url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx-xxxx-xxxx-xxxx-xxxxxx
headers:
- name: Content-Type
value: application/json
context: |
argocdUrl: https://dev-argocd.evescn.com
template.app-sync-change: |
webhook:
qywx:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"content": "
### ArgoCD服务发版成功
> <font color=\"info\">服务名称</font>: {{.app.metadata.name}}
> <font color=\"info\">app同步状态</font>: {{.app.status.operationState.phase}}
> <font color=\"info\">app服务状态</font>: {{.app.status.health.status}}
> <font color=\"info\">时间</font>: {{.app.status.operationState.startedAt}}
> <font color=\"info\">URL</font>: [点击跳转ArgoCD]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
template.app-sync-degraded: |
webhook:
qywx:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"content": "
### ArgoCD服务发版失败
> <font color=\"warning\">服务名称</font>: {{.app.metadata.name}}
> <font color=\"warning\">app同步状态</font>: {{.app.status.operationState.phase}}
> <font color=\"warning\">app服务状态</font>: {{.app.status.health.status}}
> <font color=\"warning\">时间</font>: {{.app.status.operationState.startedAt}}
> <font color=\"warning\">URL</font>: [点击跳转ArgoCD]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
trigger.on-deployed: |
- description: Application is synced and healthy. Triggered once per commit.
send: [app-sync-change] # template names
# trigger condition
when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
trigger.on-health-degraded: |
- description: Application has degraded
send: [app-sync-degraded]
when: app.status.health.status == 'Degraded'
trigger.on-sync-failed: |
- description: Application syncing has failed
send: [app-sync-degraded] # template names
when: app.status.operationState.phase in ['Error', 'Failed']
trigger.on-sync-running: |
- description: Application is being synced
send: [app-sync-change] # template names
when: app.status.operationState.phase in ['Running']
trigger.on-sync-status-unknown: |
- description: Application status is 'Unknown'
send: [app-sync-degraded] # template names
when: app.status.sync.status == 'Unknown'
trigger.on-sync-succeeded: |
- description: Application syncing has succeeded
send: [app-sync-change] # template names
when: app.status.operationState.phase in ['Succeeded']
subscriptions: |
- recipients: [qywx] # 可能有bug,正常应该是webhook:qywx
triggers: [on-deployed, on-sync-failed, on-health-degraded]
其中 argocd-notifications-cm
中添加了一段如下所示的配置:
subscriptions: |
- recipients: [qywx] # 可能有bug,正常应该是webhook:qywx
triggers: [on-deployed, on-sync-failed, on-health-degraded]
这个是为定义的触发器添加通知订阅,当满足 [on-deployed, on-sync-failed, on-health-degraded]
这些 triggers
时,会使用 triggers
对应的 send
模版,然后使用 service.webhook
定义的信息进行消息发送。
service.webhook
提供给 subscriptions
中的 recipients
调用,用于发送消息到企业微信机器人
service.webhook.qywx: |
url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx-xxxx-xxxx-xxxx-xxxxxx
headers:
- name: Content-Type
value: application/json
然后可以根据不同的状态来配置不同的触发器,如下所示:
trigger.on-sync-status-unknown: |
- description: Application status is 'Unknown'
send: [app-sync-degraded] # template names
when: app.status.sync.status == 'Unknown'
该触发器定义包括名称、条件和通知模板引用:
- send:表示通知内容使用的模板名称
- description:当前触发器的描述信息
- when:条件表达式,如果应发送通知,则返回 true
然后下面就是配置发送的消息通知模板:
template.app-sync-change: |
webhook:
qywx:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"content": "
### ArgoCD服务发版成功
> <font color=\"info\">服务名称</font>: {{.app.metadata.name}}
> <font color=\"info\">app同步状态</font>: {{.app.status.operationState.phase}}
> <font color=\"info\">app服务状态</font>: {{.app.status.health.status}}
> <font color=\"info\">时间</font>: {{.app.status.operationState.startedAt}}
> <font color=\"info\">URL</font>: [点击跳转ArgoCD]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
template.app-sync-degraded: |
webhook:
qywx:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"content": "
### ArgoCD服务发版失败
> <font color=\"warning\">服务名称</font>: {{.app.metadata.name}}
> <font color=\"warning\">app同步状态</font>: {{.app.status.operationState.phase}}
> <font color=\"warning\">app服务状态</font>: {{.app.status.health.status}}
> <font color=\"warning\">时间</font>: {{.app.status.operationState.startedAt}}
> <font color=\"warning\">URL</font>: [点击跳转ArgoCD]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
这里我们定义了2个模版,这2个模板用于生成通知内容,并且可以由多个触发器引用。每个模板默认都可以访问以下字段:
app
:保存应用程序对象context
:是用户定义的字符串映射,可能包含任何字符串键和值notificationType
保留通知服务类型名称,该字段可用于有条件地呈现服务特定字段
context
定义,提供给 template
模版中使用,用于拼接 ArgoCD APP 服务地址,在报警信息中进行返回。
context: |
argocdUrl: https://dev-argocd.evescn.com
配置完成后我们更新整个资源清单文件:
➜ ~ kubectl -n argocd delete cm argocd-notifications-cm
➜ ~ kubectl -n argocd apply -f install.yaml
➜ ~ kubectl -n argocd delete pods argocd-notifications-controller-5b56f6f7bb-jqpng
➜ ~ kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 5d4h
argocd-dex-server-76ff776f97-ds7mm 1/1 Running 0 5d4h
argocd-notifications-controller-5c548f8dc9-dx824 1/1 Running 0 9m22s
argocd-redis-747b678f89-w99wf 1/1 Running 0 5d4h
argocd-repo-server-6fc4456c89-586zl 1/1 Running 0 5d4h
argocd-server-5cc96b75b4-zws2c 1/1 Running 0 4d22h
安装完成后重新去修改下 APP 服务的镜像版本信息,Sync
APP 服务,正常就可以在钉钉中收到如下所示的消息通知了,
关于 ArgoCD Notification
的更多使用可以参考官方文档了解更多:https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/。
ArgoCD webhook 配置
Argo CD 会自动检查到配置的应用变化,这是因为 Argo CD 会每个三分钟去轮询一次 Git 存储库来检测清单的变化,为了消除这种轮询延迟,我们也可以将 API 服务端配置为接收 webhook 事件的方式,这样就能实时获取到 Git 存储库中的变化了。Argo CD 支持来着 GitHub、GitLab、Bitbucket、Bitbucket Server 和 Gogs 的 Git webhook 事件,这里我们仍然以上面的 GitLab 为例来说明如果配置 Webhook。
进入到 GitLab 项目仓库 https://git.evescn.com/ops/argocd-apps 中配置 Webhooks:
Webhook 的地址填写 Argo CD 的 API 接口地址 https://dev-argocd.evescn.com/api/webhook, 下面的 Secret token 是可选的,建议添加上,任意定义即可。
然后需要将上面配置的 Secret token 添加到 Argo CD 的 Secret 配置中:
## 修改 install.yaml 配置文件
[root@node argocd]# vim install.yaml
---
apiVersion: v1
kind: Secret
metadata:
labels:
app.kubernetes.io/name: argocd-secret
app.kubernetes.io/part-of: argocd
name: argocd-secret
type: Opaque
stringData:
# gitlab webhook secret
webhook.gitlab.secret: evescn
[root@node argocd]# kubectl get secret argocd-secret -n argocd
---
apiVersion: v1
data:
admin.password: JDJhJxxxxxxxxxxxxxxxxxxxxalBFUQUtwSxxxxxxxxxxxxxRiTxxxxxxxxxSR0xh
admin.passwordMtime: MjAyMyxxxxxxxxxxxxxxxxDowMjo0NFo=
server.secretkey: K2tEcnhGxxxxxxxxxxxxxxxxxxxxx02UnQ5dxxxxxxxxxxxxxxx2SmgvZWJEQT0=
kind: Secret
metadata:
......
type: Opaque
保存后,更改会自动生效,我们可以在 GitLab 这边测试配置的 Webhook,查看 Argo CD 的 API 服务 Pod 日志,正常就可以收到 Push 事件了:
[root@node argocd]# kubectl -n argocd logs -f argocd-server-8544dd9f89-cz49l
time="2023-09-06T08:55:08Z" level=info msg="Received push event repo: http://git.evescn.com/ops/argocd-apps, revision: test, touchedHead: false"
time="2023-09-06T08:55:08Z" level=info msg="Requested app 'demo' refresh"