argo-rollouts-notification-configmap 配置,包含一个 Webhook 服务、四个请求体模板和四个触发器。Rollout 每一次 Pod 模板变更(新的发布版本)对应一条 Flashduty 变更:新版本开始发布时记录为 Processing,发布完成时更新为 Done,被中止时更新为 Failed。
金丝雀(Canary)和蓝绿(BlueGreen)两种策略都会记录。Rollout 的分析(AnalysisRun)失败、Pod 副本数变化等事件不属于变更,不会记录。
在 Flashduty On-call
- 进入 Flashduty 控制台,选择 集成中心 → 变更事件
- 选择 Argo Rollouts,填写集成名称
- 如需把变更分派到指定协作空间,在集成的 路由 中按标签(例如
rollout、namespace、strategy)配置规则 - 点击 保存,复制生成的 推送地址
在 Argo Rollouts 中配置
以下操作需要能修改 Argo Rollouts 控制器所在命名空间(默认
argo-rollouts)中 ConfigMap 的 Kubernetes 权限,以及修改 Rollout 注解的权限。Argo Rollouts 控制器需要能访问推送地址所在的域名。
1
写入 Webhook 服务、模板和触发器
把下面的内容保存为 合并到 如果这个 ConfigMap 还不存在,先执行
flashduty-change.yaml,将 url 替换为上一步复制的推送地址(包含 ?integration_key=...):argo-rollouts-notification-configmap(--type merge 只增改上面这些键,不影响已有配置):kubectl create configmap argo-rollouts-notification-configmap -n argo-rollouts。如果 Argo Rollouts 通过 Helm Chart 安装,请把同样的服务、模板和触发器写到 Chart 的 notifications 配置中,否则下次升级会覆盖手动修改。配置说明:- Argo Rollouts 的触发器名称由 Kubernetes 事件原因决定,
on-rollout-updated、on-rollout-completed、on-rollout-aborted和on-skip-steps分别在对应事件发生时触发,所以这里的触发器名称不能修改,也没有when条件 - 每个模板的
event值固定,Flashduty 靠它判断发生了什么,不要修改 - 模板中的每个值都经过
toJson转义,请不要去掉。字段名不要修改,event、event_time、rollout_uid和revision必须保留 event_time是控制器发送通知时的时间(Unix 秒),用于按先后顺序更新变更状态- 服务名
flashduty-change可以改成其他名称,但订阅注解、模板中webhook:下的键名必须与它一致
如果已经安装了 Argo Rollouts 的
notifications-install.yaml,on-rollout-updated、on-rollout-completed 和 on-rollout-aborted 这三个触发器已经存在(内容为 - send: [rollout-updated] 这样的一行),上面的写法会覆盖它们,原有的 Slack、邮件订阅会收不到通知。请保留原有模板,把触发器写成下面的形式,两个模板会合并发送,各通知渠道只使用自己的部分:on-skip-steps 不是内置触发器,直接使用上面的写法。2
订阅通知
触发器需要被订阅后才会发送。按需要的范围选择一种方式:
-
单个 Rollout:在 Rollout 上添加四条注解
-
所有 Rollout:在
argo-rollouts-notification-configmap的subscriptions中添加一项。如果已有subscriptions,请在原列表中追加,不要用上一步的 merge 命令整体覆盖
3
验证发布记录
Argo Rollouts 没有发送测试消息的功能。修改一个已订阅的 Rollout 的镜像(例如
kubectl argo rollouts set image <Rollout 名称> <容器名>=<新镜像>),确认 Flashduty 的变更列表中出现一条 Processing 的变更,发布完成(或手动 promote 到最后一步)后更新为 Done。一条变更是什么
一条变更对应一个 Rollout 的一个发布版本,变更标识(change_key)为
<rollout_uid>/<revision>:
rollout_uid是 Rollout 的metadata.uid。Kubernetes 为每个对象分配的 UID 在集群的整个生命周期内唯一,不同集群中同名的 Rollout、删除后重建的 Rollout 都是不同的 Rolloutrevision是 Rollout 的rollout.argoproj.io/revision注解。每次 Pod 模板变更,包括回滚到旧版本,修订号都会加 1
event、rollout_uid、revision 或 event_time 时,Flashduty 会拒绝该请求。
状态映射
Done 和 Failed 是结束状态,Flashduty 会记录变更结束时间。
event 的取值区分大小写,其他值会被拒绝。
- 回滚到稳定版本时 Argo Rollouts 只发出
SkipSteps事件,不会发出RolloutCompleted,所以on-skip-steps也记为 Done - 蓝绿发布等待手动 promote、或金丝雀发布停在暂停步骤时,变更保持 Processing
- 中止后执行
kubectl argo rollouts retry,发布最终完成时同一条变更会从 Failed 更新为 Done
变更内容
- 标题:
<命名空间>/<Rollout 名称>: rollout revision <修订号> (<镜像>),多个容器的镜像用逗号分隔,没有镜像时省略括号部分 - 链接:Argo Rollouts 没有对应每次发布的网页,变更没有链接
常见问题
为什么没有收到变更?
为什么没有收到变更?
- 查看 Argo Rollouts 控制器的日志(
kubectl logs -n argo-rollouts deploy/argo-rollouts),确认 Rollout 上有notifications.argoproj.io/subscribe.<触发器>.flashduty-change注解,或subscriptions中包含对应触发器 - 日志中出现
template 'flashduty-change-updated' is not supported时,确认配置已写入argo-rollouts-notification-configmap,Helm 安装请检查对应的 values - Rollout 的 Pod 模板没有变化时不会产生新的版本,也就没有通知
变更一直停在 Processing?
变更一直停在 Processing?
四个触发器没有同时订阅,或者发布还没有结束(蓝绿发布等待 promote、金丝雀停在暂停步骤)。Rollout 被删除不会更新变更。
重复发送同一条通知会重复记录吗?
重复发送同一条通知会重复记录吗?
不会。同一事件、同一时间的通知只记录一次。
日志中出现 failed with error code 400?
日志中出现 failed with error code 400?
确认模板与本文一致。响应内容会指出缺少或不支持的字段,例如
rollout_uid is missing、revision is missing、unsupported event。Rollout 没有 rollout.argoproj.io/revision 注解(控制器还没有处理过它)时,revision 为空,稍后的通知会带上。