generic 类型的 Provider,Flux 把每条事件以 JSON 推送到 Flashduty。每个 Flux 对象对应一条 Flashduty 告警:对账出错(error 事件)时触发,之后该对象再发出成功类的 info 事件时自动关闭。
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。
使用专属集成
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 Flux CD,点击 保存
- 打开生成的集成卡片,复制 推送地址
使用共享集成
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 Flux CD,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
在 Flux 中配置
以下操作需要能在集群中创建 Secret 以及 Flux
Provider、Alert 对象的 kubectl 权限。示例使用 notification.toolkit.fluxcd.io/v1beta3 API 和 flux-system 命名空间;Provider、Alert 和 Secret 必须位于同一命名空间。集群需要能访问 Flashduty 推送地址所在的域名。
1
把推送地址存入 Secret
推送地址中的 Secret 中存在
integration_key 相当于密码,放在 Secret 的 address 键中,而不是直接写在 Provider 里:address 键时,Flux 使用它作为 Provider 的地址。2
创建 Provider
type 必须是 generic。不要使用 pagerduty 类型:它只取地址中的协议和域名,会丢掉 integration_key 参数。3
创建 Alert
eventSeverity设为info(或不填):Flux 同时转发error和info事件,Flashduty 靠info事件关闭告警。设为error时告警不会自动恢复,见 告警生命周期eventSources中未写namespace时只匹配 Alert 所在命名空间的对象。其他命名空间的 Flux 对象需要为每个命名空间再加一组条目并填写namespace,或在该命名空间中另建 AlerteventMetadata中的键值会出现在告警标签中,建议至少填写集群名称,以便区分多个集群推送的告警
kubectl apply -f 创建 Provider 和 Alert,执行 kubectl -n flux-system get providers,alerts 确认两者已创建。4
验证生命周期
Flux 没有发送测试消息的按钮。可以用一个临时 Kustomization 验证:
- 创建一个
spec.path指向 Git 仓库中不存在目录的 Kustomization(源使用已有的 GitRepository),等待对账失败,确认 Flashduty 收到一条告警,标题形如Kustomization flux-system/<名称>: ArtifactFailed,描述为kustomization path not found: ... - 把
spec.path改成存在的目录,执行flux reconcile kustomization <名称>,确认对账成功后原告警关闭 - 删除临时 Kustomization
Alert Key
Flashduty 使用
involvedObject.uid(Flux 对象在 Kubernetes 中的 UID)作为 Alert Key。Flux 自带的 pagerduty Provider 也使用这个 UID 作为触发和恢复的去重键。同一个 Flux 对象的所有失败事件落在同一条 Flashduty 告警上,失败原因(reason)、消息、版本(revision)的变化都不会改变 Alert Key。
- 删除后重新创建的同名对象会得到新的 UID,对应一条新告警
- 删除 Flux 对象不一定会发出成功事件,对象删除后仍处于活动状态的告警需要手动关闭
involvedObject.uid 时,Flashduty 会拒绝该请求。
告警生命周期
Flashduty 按事件的
severity 和 reason 字段处理:
规则与 Flux
pagerduty Provider 相同:error 触发,其他事件恢复,跳过 Progressing。Flux 只转发 info 和 error 两种事件;其他 severity 值会被拒绝。
同一对象的 message 和 metadata 都相同的事件,Flux 默认 5 分钟内只推送一次。
只转发 error 事件时:如果 Alert 的 eventSeverity 设为 error,或 exclusionList 过滤掉了成功事件,Flashduty 收不到恢复事件,告警不会自动关闭。此时请在协作空间中开启 超时自动关闭,超时计时起点选择 故障触发,建议超时时长 12 小时:对象仍然失败时,下一次对账失败会重新触发告警。
告警等级
Flux 的失败事件只有
error 一个等级,所有告警默认为 Critical。如需其他等级,在推送地址后追加 &severity=Warning(或 Info)。恢复事件保留原告警的等级。
告警内容
- 标题:
<Kind> <命名空间>/<名称>: <reason>,例如Kustomization apps/webapp: ValidationFailed - 描述:事件的
message - 标签:
resource(<Kind>/<命名空间>/<名称>)、kind、namespace、name、uid、api_version、reason、vendor_severity(error或info)、reporting_controller(发出事件的控制器,例如kustomize-controller),以及事件metadata中的键值(例如revision,以及 AlerteventMetadata中配置的cluster)
metadata 键名中 a-z、A-Z、0-9、_ 以外的字符会被替换为 _(例如旧版 Flux 发送的 kustomize.toolkit.fluxcd.io/revision 变为 kustomize_toolkit_fluxcd_io_revision),与内置标签同名的键不会覆盖内置标签。值为空的字段不会写入标签。
排查问题
- 没有收到告警:执行
kubectl -n flux-system logs deploy/notification-controller,查找failed to dispatch notification等错误;执行kubectl -n flux-system get events --field-selector involvedObject.kind=Alert查看 Alert 上的告警事件 - 只收到部分对象的告警:确认对象的
kind列在eventSources中,且对象与 Alert 在同一命名空间或已填写namespace - 告警没有恢复:确认 Alert 的
eventSeverity为info或未填写,且exclusionList没有过滤掉成功事件 - 请求被拒绝:确认 Provider 的
type是generic,且 Secret 中的address是完整的推送地址,包含integration_key参数