ezra-sullivan
发布于 2025-06-20 / 1 阅读
0
0

02 - Alertmanager 简介与常规部署

更新时间:2025 年 6 月

版本:alertmanager 0.28.1

组件下载地址:Download | Prometheus

⚠️ 重要配置更新说明

从 Alertmanager v0.22.0 开始,以下配置项已被标记为 DEPRECATED(过时):

  • match / match_re
  • source_match / target_match / target_match_re

新版本应该使用 matcherssource_matcherstarget_matchers 语法

简介

Alertmanager 是 Prometheus 官方生态中的告警管理组件,专门用于接收来自 Prometheus 服务端的告警,并对其进行分类、去重、分组、抑制(抑制重复或相关告警)以及最终的通知发送

Alertmanager 支持将告警推送到多个通知渠道,包括:

  • Email
  • Webhook
  • Slack
  • PagerDuty
  • 微信、钉钉等自定义 webhook

它允许灵活配置告警的接收人、告警级别(如 critical、warning)、静默时间窗口等,是构建稳定、高效告警系统的核心工具

与 Prometheus 的关系

  • Prometheus 负责生成告警(Alert)
    通过配置 alerting rules(告警规则),Prometheus 根据监控指标判断是否满足触发条件
  • Alertmanager 负责处理告警(Alert management)
    Prometheus 将告警推送给 Alertmanager,后者进行分组、抑制、路由,然后发送到指定的通知端
  • 两者解耦
    Prometheus 专注于数据采集与告警生成;Alertmanager 专注于告警的后续处理与通知分发

主要功能

分组(Grouping)

作用

分组可以将相似或相关的警报合并为单个通知

这在大规模故障期间非常有用,当时许多系统同时失败,可能同时触发数百到数千个警报。分组可以避免警报洪泛,提升处理效率

警报的分组、分组通知的时间以及接收者由配置文件中的路由树进行配置

原理

  • 标签匹配:根据 group_by 配置的标签(如 alertname, cluster, service)对警报分组。例如,同一服务的多个实例故障会被合并
  • 时间窗口控制
    • group_wait:等待时间,用于收集初始触发的警报(如:30秒内收到的同类警报合并)
    • group_interval:同一组发送新警报的最小间隔(如:5分钟)
    • repeat_interval:重复发送相同警报的间隔(如:3小时)

示例

group_by 指定按照 alertnamecluster 标签进行分组

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'email'

receivers:
- name: 'email'
  email_configs:
  - to: 'admin@example.com'

抑制(Inhibition)

作用

抑制用于在特定其他警报已触发时,抑制其他某些警报的提醒

原理

  • 条件匹配

    • source_match:定义触发抑制的源警报(如 severity=critical
    • target_match:定义被抑制的目标警报(如 severity=warning
    • equal:要求源和目标警报的某些标签必须一致(如 cluster
  • 逻辑:若源警报存在,则符合条件的目标警报会被静默

示例

severity=criticalClusterDown 警报触发时,抑制同一集群内所有 severity=warning 的节点级警报

inhibit_rules:
  - source_matchers:
      - name: severity
        value: 'critical'
      - name: alertname
        value: 'ClusterDown'
    target_matchers:
      - name: severity
        value: 'warning'
    equal: ['cluster']  # 要求集群标签相同

静默(Silences)

作用

手动临时屏蔽特定警报的通知,适用于计划维护或已知问题

原理

  • 匹配规则:基于标签(如 alertname, instance)设置静默条件
  • 时间范围:指定静默的起始时间和持续时间
  • 管理方式:通过 Alertmanager 的 Web UI 或 API 创建/管理

高可用

Alertmanager 支持配置集群以实现高可用性。通过集群部署,可以确保在单个节点故障时警报系统仍然可用,并且通过分布式状态同步避免重复告警。

安装主机准备

主机准备

主机名操作系统架构IP安装软件
alertmanager-01.monitor.localAlmaLinux 9.6x86_64192.168.111.198alertmanager

时间设置

设置时区

timedatectl set-timezone Asia/Shanghai

设置主机名

hostnamectl set-hostname alertmanager-01.monitor.local

防火墙及 SELinux

安装后配置

内核模块设置(Docker 需要)

加载 br_netfilter 模块

modprobe br_netfilter

echo 'br_netfilter' > /etc/modules-load.d/br_netfilter.conf

系统参数

资源限制

PAM 模块

PAM 模块 pam_limits 对用户会话中可以获得的系统资源设置了限制,可以使用 ulimit 命令进行修改,或者直接将修改的值写入配置文件 /etc/security/limits.conf/etc/security/limits.d/*.conf

# 备份原有的设置
find /etc/security/limits.d -type f -name *.conf  -exec mv {} {}.bak.`date +"%Y%m%d"` \;

# 设置限制
cat > /etc/security/limits.d/sys.conf <<EOF
*            -    core            unlimited
*            -    nproc           unlimited
*            -    nofile          1048576
*            -    memlock         unlimited
*            -    msgqueue        unlimited
*            -    stack           unlimited	
EOF

systemd

systemd 有独立于 PAM 的资源限制(setrlimit),若服务通过 systemd 启动也需要设置

###### 修改用户级默认配置 ######
# 备份原有的文件或创建目录
[ -f /etc/systemd/user.conf.d/ ] && find /etc/systemd/user.conf.d/ -type f -name *.conf  -exec mv {} {}.bak.`date +"%Y%m%d"` \; || mkdir -p /etc/systemd/user.conf.d

# 修改配置
cat > /etc/systemd/user.conf.d/sys.conf << EOF
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNPROC=infinity
DefaultLimitNOFILE=1048576
DefaultLimitMEMLOCK=infinity
DefaultLimitMSGQUEUE=infinity
EOF

###### 修改系统级默认配置 ######
# 备份原有的配置
cp /etc/systemd/system.conf /etc/systemd/system.conf.bak`date +"%Y%m%d"`


# 修改配置
grep -q '^#* *DefaultLimitCORE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitCORE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitCORE=infinity" >> /etc/systemd/system.conf

grep -q '^#* *DefaultLimitNPROC.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNPROC).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitNPROC=infinity" >> /etc/systemd/system.conf

grep -q '^#* *DefaultLimitNOFILE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNOFILE).*@\1=1048576@' /etc/systemd/system.conf || echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf

grep -q '^#* *DefaultLimitMEMLOCK.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMEMLOCK).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMEMLOCK=infinity" >> /etc/systemd/system.conf

grep -q '^#* *DefaultLimitMSGQUEUE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMSGQUEUE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMSGQUEUE=infinity" >> /etc/systemd/system.conf


# 重启 systemd 生效
systemctl daemon-reexec

内核参数

cat >/etc/sysctl.d/99-sysctl.conf  <<EOF
######  TCP 连接快速释放设置  ######
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3



######  TIME_WAIT 过多时设置   ######
net.ipv4.tcp_tw_reuse = 1
#net.ipv4.tcp_tw_recycle = 0
# 限制 TIME_WAIT 最大值,默认 8192
net.ipv4.tcp_max_tw_buckets=5000


######  端口相关设置  ######
# 设定允许系统主动打开的端口范围,根据需要设置,默认 32768	60999
net.ipv4.ip_local_port_range = 32768	65530


######  防 SYNC 攻击设置  ######
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_max_syn_backlog=8192
# 配置 TCP 重传的最大次数减少到 5 次,超时时间约为 6 秒,方便及时发现节点故障
# net.ipv4.tcp_retries2=5

######  其他 TCP 设置  ######
# 系统当前因后台进程无法处理的新连接而溢出,则允许系统重置新连接
net.ipv4.tcp_abort_on_overflow=1


#######  nf_conntrack 相关设置(k8s、docker 防火墙的 nat)  #######
net.netfilter.nf_conntrack_max = 262144
net.nf_conntrack_max = 262144

net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 3600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120


####### socket 相关设置 ######
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768




######  其他设置  #######
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
#
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1


######  内存相关设置 #######
vm.swappiness = 0
vm.max_map_count = 655360
vm.overcommit_memory = 0
# vm.min_free_kbytes = 1048576

###### 文件相关 #######
fs.file-max = 6573688
fs.nr_open = 1048576
fs.aio-max-nr = 1048576


#######  K8S 相关设置 ######
# 必须先加载 br_netfilter 模块
# 二层的网桥在转发包时也会被 arptables/ip6tables/iptables 的 FORWARD 规则所过滤
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

###### 进程相关 #######
# 最大进程 id,默认值为 32768,最大值根据发行版有所不同
kernel.pid_max = 132768
kernel.threads-max = 123342

EOF


sysctl --system

单机安装

二进制方式

部署

基础变量设置

ALERTMANAGER_VERSION=0.28.1
ALERTMANAGER_OS=linux
ALERTMANAGER_ARCH=amd64

ALERTMANAGER_HOME=/opt/alertmanager
ALERTMANAGER_CONF=/etc/alertmanager
ALERTMANAGER_DATA=/data/alertmanager




ALERTMANAGER_USER=alertmanager
ALERTMANAGER_USER_GROUP=alertmanager

# 创建目录
mkdir -p ${ALERTMANAGER_HOME}/bin
mkdir -p ${ALERTMANAGER_CONF}/template
mkdir -p ${ALERTMANAGER_DATA}

# 创建用户和组
groupadd --system ${ALERTMANAGER_USER}
useradd -s /sbin/nologin --system -g ${ALERTMANAGER_USER_GROUP} ${ALERTMANAGER_USER}

下载解压

下载地址:Download | Prometheus

# 下载
curl -x http://192.168.111.1:10811 \
    -o /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz \
    -L https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz
    
    
# 解压
tar -xf /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz \
    -C /usr/local/src/
    
    
# 复制到对应目录
\cp /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}/{alertmanager,amtool} ${ALERTMANAGER_HOME}/bin

\cp /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}/alertmanager.yml ${ALERTMANAGER_CONF}

授权

chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP}  ${ALERTMANAGER_HOME}

chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP}  ${ALERTMANAGER_CONF}

chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP}  ${ALERTMANAGER_DATA}

配置

配置程序

参考:Configuration | Prometheus

默认配置

$ cat ${ALERTMANAGER_CONF}/alertmanager.yml

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_matchers:
      - name: severity
        value: 'critical'
    target_matchers:
      - name: severity
        value: 'warning'
    equal: ['alertname', 'dev', 'instance']

配置环境变量

cat > /etc/profile.d/alertmanager.sh << EOF

export ALERTMANAGER_HOME=${ALERTMANAGER_HOME}
export ALERTMANAGER_CONF=${ALERTMANAGER_CONF}
export ALERTMANAGER_DATA=${ALERTMANAGER_DATA}
export ALERTMANAGER_USER=${ALERTMANAGER_USER}
export ALERTMANAGER_USER_GROUP=${ALERTMANAGER_USER_GROUP}

export PATH=\${PATH}:\${ALERTMANAGER_HOME}/bin

EOF

source /etc/profile

配置 systemd 管理

cat > /usr/lib/systemd/system/alertmanager.service << EOF

[Unit]
Description=Alertmanager Server
Documentation=https://prometheus.io/docs/alerting/latest/overview/
After=network.target


[Service]
User=${ALERTMANAGER_USER}
Group=${ALERTMANAGER_USER_GROUP}
WorkingDirectory=${ALERTMANAGER_DATA}
Type=simple

ExecStart=${ALERTMANAGER_HOME}/bin/alertmanager \
  --config.file=${ALERTMANAGER_CONF}/alertmanager.yml \
  --storage.path=${ALERTMANAGER_DATA} \
  --web.listen-address=0.0.0.0:9093 \
  --log.level=info

Restart=on-failure
RestartSec=5s
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

EOF


systemctl daemon-reload

配置 firewalld 和 SELinux

# 临时禁止 SELinux
setenforce 0

# 永久禁止 SELinux
sed -ri 's/^(SELINUX).*/\1=disabled/g' /etc/selinux/config && sed -ri 's/^SELINUX(.*)/\1=disabled/g' /etc/sysconfig/selinux


firewall-cmd --permanent --new-service=alertmanager

firewall-cmd --permanent --service=alertmanager --add-port=9093/tcp

firewall-cmd --permanent --zone=public --add-service=alertmanager

firewall-cmd --reload

启动

测试启动

cd ${ALERTMANAGER_DATA}

sudo -u ${ALERTMANAGER_USER} \
${ALERTMANAGER_HOME}/bin/alertmanager \
  --config.file=${ALERTMANAGER_CONF}/alertmanager.yml \
  --storage.path=${ALERTMANAGER_DATA} \
  --web.listen-address=0.0.0.0:9093 \
  --log.level=info

启动并设置开机启动

systemctl enable --now alertmanager

测试

curl http://localhost:9093

Docker 方式

dockerhub 地址:prom/alertmanager - Docker Image | Docker Hub

基础变量设置

ALERTMANAGER_VERSION=v0.28.1


ALERTMANAGER_CONF=/etc/prometheus
ALERTMANAGER_DATA=/data/prometheus



# 创建目录
mkdir -p ${ALERTMANAGER_CONF}/templates
mkdir -p ${ALERTMANAGER_DATA}

# 注:如果不想用 root 用户启动容器,需要将数据目录权限给到 nobody
chown -R nobody:nobody ${ALERTMANAGER_DATA}

# 配置环境变量
cat > /etc/profile.d/prometheus.sh << EOF
export ALERTMANAGER_VERSION=${ALERTMANAGER_VERSION}
export ALERTMANAGER_CONF=${ALERTMANAGER_CONF}
export ALERTMANAGER_DATA=${ALERTMANAGER_DATA}
EOF

source /etc/profile

复制配置文件

docker run -d --name tmp_alertmanager prom/alertmanager:${ALERTMANAGER_VERSION}

# 默认镜像中只有一个配置文件
docker cp tmp_alertmanager:/etc/alertmanager/alertmanager.yml ${ALERTMANAGER_CONF}/alertmanager.yml


docker rm -f tmp_prometheus

修改配置

vim ${ALERTMANAGER_CONF}/alertmanager.yml

启动

$ docker run -d --name=alertmanager --restart=always  \
    -p 9093:9093  \
    -v ${ALERTMANAGER_CONF}:/etc/alertmanager  \
    -v ${ALERTMANAGER_DATA}:/alertmanager  \
    --restart=always  \
    --cpus 0.5  \
    --memory 500M  \
    prom/alertmanager:${ALERTMANAGER_VERSION}  \
    --config.file=/etc/alertmanager/alertmanager.yml  \
    --storage.path=/alertmanager  \
    --web.listen-address=0.0.0.0:9093  \
    --log.level=info
    

防火墙设置

停止 Docker

systemctl stop docker

重建 iptables 的 DOCKER-USER 链

firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER

添加 iptables 规则

# 序号越小,优先级越高
# 允许已建立的连接(ESTABLISHED/RELATED),优先级 1
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -m conntrack \
  --ctstate RELATED,ESTABLISHED -j RETURN \
  -m comment --comment 'Allow pre-existing connections (do not break active streams)'



# 允许容器相互访问,优先级 1
# 172.17.0.0/16 为 Docker 容器的 CIDR
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -j RETURN \
  -s 172.17.0.0/16 \
  -m comment --comment 'allow docker-container internal communication'
  

# 默认拒绝所有其他流量,优先级 999
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 999 \
  -j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'

允许某端口暴露

注:永久配置需要加 --permanent 选项

注:此处的 80 端口应该是容器侧的端口,例如 8080 端口映射到容器 80 端口,此处应该写 80 端口(-p 8080:80)。原因:iptablesPREROUTING 链的 nat 表在 filter 表之前,nat 表已经完成了 DNAT 转换。查看 nat 表:iptables -nvL -t nat

# 暴露给指定 IP
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
  -p tcp -m multiport --dports 9093 \
  -s 192.168.111.1/32 -j RETURN
  
  
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
  -p tcp -m multiport --dports 9093 \
  -s 192.168.111.197/32 -j RETURN  


# 暴露给指定网段
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
  -p tcp -m multiport --dports 9093 \
  -s 172.17.0.0/16 -j RETURN

加载永久配置

firewall-cmd --reload

启动 Docker

systemctl enable --now docker

测试

浏览器访问:http://192.168.111.198:9093/

Prometheus 配置

Prometheus 需要配置连接 Alertmanager,才能将告警正常发送到 Alertmanager

$ vim ${PROMETHEUS_CONF}/prometheus.yml

......

##### Alertmanager 配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # alertmanager 的 IP 或者域名,如果是集群需要配置每个节点
          - 192.168.111.198:9093

......
#

附录

管理 API

参考:Management API | Prometheus

健康检查

GET /-/healthy
HEAD /-/healthy

此端点始终返回 200,并应用于检查 Alertmanager 的健康状态

就绪检查

GET /-/ready
HEAD /-/ready

当 Alertmanager 准备服务流量(即响应查询)时,此端点返回 200

重新加载

POST /-/reload

此端点触发 Alertmanager 配置文件的重新加载

触发配置重新加载的另一种方式是将 SIGHUP 发送到 Alertmanager 进程


评论