You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已有Prometheus和Alertmanager,如何实现K8s节点未就绪时发送Slack通知?

实现K8s节点未就绪时的Slack告警通知(基于Prometheus+Alertmanager)

刚好你已经有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:18:12