已有Prometheus和Alertmanager,如何实现K8s节点未就绪时发送Slack通知?
刚好你已经有Prometheus和Alertmanager在跑了,这俩组合起来实现K8s节点未就绪的Slack通知简直是标配,我给你一步步拆解具体怎么做:
1. 配置Prometheus告警规则:精准检测节点就绪状态
首先得让Prometheus知道什么时候该触发告警——我们需要创建告警规则文件,监控节点的Ready状态。
示例告警规则(可保存为node-readiness-rules.yaml)
groups: - name: node-readiness-alerts rules: - alert: K8sMasterNodeNotReady # 匹配Master节点且Ready状态为false的情况,这里的node_role标签根据你的集群调整 expr: kube_node_status_condition{condition="Ready",status="true"} == 0 AND kube_node_role{role="master"} == 1 for: 2m # 等待2分钟再触发,避免节点临时波动的误告警 labels: severity: critical alert_type: node_health annotations: summary: "Master节点 {{ $labels.node }} 未就绪" description: "Master节点 {{ $labels.node }} 已处于未就绪状态超过2分钟" - alert: K8sWorkerNodeNotReady expr: kube_node_status_condition{condition="Ready",status="true"} == 0 AND kube_node_role{role="worker"} == 1 for: 2m labels: severity: warning alert_type: node_health annotations: summary: "Worker节点 {{ $labels.node }} 未就绪" description: "Worker节点 {{ $labels.node }} 已处于未就绪状态超过2分钟"
注意事项
如果你的集群节点角色标签不是node_role(比如用node-role.kubernetes.io/master这种标准格式),记得调整PromQL里的匹配逻辑,比如把kube_node_role{role="master"} == 1换成kube_node_labels{label_node_role_kubernetes_io_master="true"} == 1,确保能精准匹配到对应角色的节点。
把这个规则文件通过ConfigMap挂载到Prometheus Pod中,或者更新Prometheus的配置引用这个规则,然后重启Prometheus让规则生效。
2. 配置Alertmanager:对接Slack发送通知
接下来要让Alertmanager把触发的告警转发到Slack,核心是配置Slack接收器和路由规则。
第一步:获取Slack Webhook URL
先在Slack里创建一个Incoming Webhook:打开Slack工作区的设置,找到「集成」→「Incoming Webhooks」,创建一个新的webhook,选择要接收通知的频道,复制生成的URL备用。
示例Alertmanager配置
global: resolve_timeout: 5m # 告警恢复后等待5分钟再发送恢复通知 route: group_by: ['alertname', 'node'] # 按告警名称和节点分组,避免刷屏 group_wait: 10s # 等待10秒收集同组告警再发送 group_interval: 10s # 同组告警的发送间隔 repeat_interval: 1h # 重复发送同一条告警的间隔 receiver: 'slack-node-alerts' # 默认接收器 routes: - match: alert_type: node_health # 只转发节点健康类的告警到Slack receiver: 'slack-node-alerts' receivers: - name: 'slack-node-alerts' slack_configs: - api_url: 'https://hooks.slack.com/services/XXX/XXX/XXX' # 替换成你的Slack Webhook URL channel: '#k8s-cluster-alerts' # 替换成你的目标Slack频道 send_resolved: true # 节点恢复时自动发送恢复通知 title: '{{ .CommonAnnotations.summary }}' text: >- *告警级别:* {{ .CommonLabels.severity }} *节点名称:* {{ .GroupLabels.node }} *告警详情:* {{ .CommonAnnotations.description }} {{ if .Alerts.Resolved }}*恢复时间:* {{ .Alerts.Resolved | first | .EndsAt.Format "2006-01-02 15:04:05" }}{{ end }}
把这个配置更新到Alertmanager的ConfigMap中,重启Alertmanager服务让配置生效。
3. 验证告警流程
配置完成后,你可以手动模拟一个节点未就绪的场景来验证:
- 执行
kubectl cordon <node-name>把某个节点设为不可调度(或者直接断开节点网络模拟故障) - 等待2分钟后,去Alertmanager的UI查看是否触发了对应告警
- 检查Slack目标频道,确认是否收到格式清晰的告警通知
- 恢复节点后,确认Slack能收到恢复通知
一些最佳实践
- 调整
for时长:根据你的集群稳定性,把等待时长设为1-5分钟,平衡误告警和告警及时性 - 自定义通知模板:可以把集群名称、Prometheus告警链接等信息加入Slack通知,方便快速定位问题
- 区分告警优先级:Master节点未就绪设为
critical级别,Worker节点设为warning,让团队优先处理核心故障
内容的提问来源于stack exchange,提问作者ThatChrisGuy

