Alertmanager 高可用集群 TLS 传输配置实战:从证书签发到静默同步验证
Alertmanager 高可用集群 TLS 传输配置实战从证书签发到静默同步验证【免费下载链接】alertmanagerPrometheus Alertmanager项目地址: https://gitcode.com/GitHub_Trending/al/alertmanagerAlertmanager 通过 gossip 协议将多个实例互联成高可用集群用于成员管理、静默silence与通知日志的复制。本指南以仓库中 examples/ha/tls/README.md 为主线完整讲解如何用 cfssl 签发集群证书、编写--cluster.tls-config传输配置、借助 goreman 一键拉起 6 节点 TLS 集群并验证静默数据在实例间的加密同步。读完你将掌握在真实网络环境中安全部署 Alertmanager HA 集群的完整实操链路并理解其底层 TLS 传输的实现原理。背景与设计动机为什么集群流量需要 TLSAlertmanager 高可用依赖多个实例组成集群实例间通过 Hashicorp memberlist 明确指出早期版本实例间通信是明文传输的集群内每条消息都暴露在网络上无法保证机密性confidentiality、完整性integrity与客户端真实性client authenticity。该设计文档给出的目标方案是用 TLS over TCP 承载全部 gossip 流量这一方案最终落地为--cluster.tls-config参数与cluster包中的TLSTransport实现。TLS 化带来两个直接收益设计文档原文佐证单端口通信memberlist 默认使用 TCP可靠 UDP尽力而为双通道而 TLS 传输只开一个 TCP 端口便于防火墙策略管理API 端口不受影响仍是独立的 TCP 端口。统一的 Prometheus 生态安全基线Prometheus 生态偏好 mutual TLSmTLSAlertmanager 采用同一机制可降低与栈内其他组件联合部署的复杂度。示例目录全景examples/ha/tls 中的文件与职责先浏览示例目录的文件布局理解每份文件的角色文件仓库根目录相对路径职责examples/ha/tls/README.md使用说明安装依赖、构建、启动、验证examples/ha/tls/Makefilemake startgoreman 启动集群、make gen-certscfssl 签发证书examples/ha/tls/Procfile定义 6 个 Alertmanager 节点 1 个 webhook 回声服务examples/ha/tls/tls_config_node1.yml节点 1 的集群 TLS 传输配置examples/ha/tls/tls_config_node2.yml节点 2 的集群 TLS 传输配置examples/ha/tls/certs/已生成的 CA 与节点证书ca.pem、node1.pem、node2.pem等examples/ha/alertmanager.yml集群各节点共用的 Alertmanager 主配置路由/接收者/抑制规则证书目录下的ca-config.json、ca-csr.json、node1-csr.json、node2-csr.json是 cfssl 的请求与签名配置用于make gen-certs重新生成证书。第一步安装依赖与构建 AlertmanagerREADME 要求两个 Go 命令行工具与一次仓库根目录构建# 1. 安装依赖 go install github.com/cloudflare/cfssl/cmd/cfssl go install github.com/mattn/goreman # 2. 在仓库根目录构建 Alertmanager go mod download make build # 3. 进入示例目录启动集群 cd examples/ha/tls make start其中 cfssl 负责证书签发cfssl gencertgoreman 是一个 Go 版 foreman按 Procfile 中声明的进程并行拉起全部节点。注意make build要在仓库根目录执行产物alertmanager二进制位于根目录Procfile 中正是以./../../../alertmanager引用它。第二步签发集群证书cfssl 工作流证书已随仓库提交在 examples/ha/tls/certs/ 中直接make start即可使用若要重新签发运行make gen-certs。其签发流程由 Makefile 定义核心三步签发 CA 自签根证书cd certs; cfssl gencert -initca ca-csr.json | cfssljson -bare caca-csr.json 定义 CA 主体信息CNmasslRSA 2048组织信息为 AU/Melbourne/massl。生成ca.pemCA 公钥与ca-key.pemCA 私钥。为每个节点签发服务器/客户端双用途证书以 node1 为例cd certs; cfssl gencert \ -caca.pem \ -ca-keyca-key.pem \ -configca-config.json \ -hostnamelocalhost,127.0.0.1 \ -profilemassl node1-csr.json | cfssljson -bare node1关键点是-hostnamelocalhost,127.0.0.1SANSubject Alternative Name必须覆盖集群内实际访问的地址否则 TLS 握手时主机名校验会失败。node2 同理会话生成node2.pem/node2-key.pem。签名配置ca-config.json 定义masslprofile其usages同时包含server auth与client auth这正是 mTLS 的关键——同一张证书既用于服务端身份也用于客户端身份且有效期 876000 小时约 100 年演示场景足够。node1-csr.json 以CN: system:server、O: system:node1标识节点身份。签发完成后目录中的证书文件为ca.pem、ca-key.pem、node1.pem、node1-key.pem、node2.pem、node2-key.pem。第三步理解 TLS 传输配置文件每个节点的--cluster.tls-config指向一份 YAML示例中 node1 与 node2 各一份内容结构相同、证书不同。以 tls_config_node1.yml 为例tls_server_config: cert_file: certs/node1.pem key_file: certs/node1-key.pem client_ca_file: certs/ca.pem client_auth_type: VerifyClientCertIfGiven tls_client_config: cert_file: certs/node1.pem key_file: certs/node1-key.pem ca_file: certs/ca.pem该格式对应 cluster/tls_config.go 中的TLSTransportConfig结构体两个必填段字段说明tls_server_config服务端监听侧TLS 配置映射到web.TLSConfig来自 exporter-toolkittls_client_config客户端拨号侧TLS 配置映射到prometheus/common/config.TLSConfigtls_server_config中各子项含义cert_file/key_file本节点证书与私钥TLS 握手时向对端出示client_ca_file用于校验对端客户端证书的 CA 证书即信任锚client_auth_type客户端证书校验策略VerifyClientCertIfGiven表示若对端出示证书则必须通过 CA 校验可推断该值来自 exporter-toolkit 支持的取值集合其余可选值还包括NoClientCert、RequireAndVerifyClientCert等。若希望强制双向认证可改为RequireAndVerifyClientCert。tls_client_config中ca_file指定验证服务端证书的 CAcert_file/key_file则作为客户端身份。注意示例中所有路径均为相对路径源码 cluster/tls_config.go 通过SetDirectory(filepath.Dir(configPath))将相对路径解析为相对于配置文件所在目录因此certs/node1.pem实际指向examples/ha/tls/certs/node1.pem。从源码结构看加载流程为GetTLSTransportConfig(configPath)读取 YAMLyaml.UnmarshalStrict严格解析校验tls_server_config与tls_client_config均非空缺失任一即报错见 cluster/tls_config.go。该函数被cluster.New调用并存入tlsTransportConfig *TLSTransportConfig字段见 cluster/cluster.go。第四步使用 goreman 一键拉起 6 节点 TLS 集群Procfile 声明了 6 个 Alertmanager 实例与 1 个 webhook 服务make start即goreman start会并发启动全部进程。各节点参数归纳如下进程Web 端口集群端口peerTLS 配置a19093127.0.0.1:8001—种子节点node1a29094127.0.0.1:8002127.0.0.1:8001node2a39095127.0.0.1:8003127.0.0.1:8001node1a49096127.0.0.1:8004127.0.0.1:8001node2a59097127.0.0.1:8005127.0.0.1:8001node1a69098127.0.0.1:8006127.0.0.1:8001node2wh———webhook 回声服务:5001以 a2 的完整命令行为例./../../../alertmanager \ --log.leveldebug \ --storage.path$TMPDIR/a2 \ --web.listen-address:9094 \ --cluster.listen-address127.0.0.1:8002 \ --cluster.peer127.0.0.1:8001 \ --config.file../alertmanager.yml \ --cluster.tls-config./tls_config_node2.yml参数含义--cluster.tls-config启用集群 TLS 传输并指定上述传输配置文件未指定时集群回落到明文 TCP/UDP 通信--cluster.listen-address本节点 gossip 监听地址TLS 模式下即 TLS over TCP 监听端口--cluster.peer加入集群时联络的已知节点a1 作为种子节点不配置 peer--web.listen-addressHTTP API 端口不受 TLS 集群传输影响--storage.path本地数据目录各节点相互独立--config.file共用同一份 examples/ha/alertmanager.yml。注意 node1/node2 两种证书是交替分配给节点的——a1/a3/a5 用 node1 证书、a2/a4/a6 用 node2 证书这样集群同时包含两种身份恰好验证了 mTLS 下不同证书实体之间的互认互信。webhook 进程wh: go run ../../webhook/echo.go启动 examples/webhook/echo.go它在:5001上监听并把收到的告警 JSON 格式化打印到日志对应 alertmanager.yml 中 webhook 接收者的http://127.0.0.1:5001/。启动后 6 个实例均以--log.leveldebug运行可在 goreman 输出中观察到节点加入、gossip 同步等调试日志。第五步验证 TLS 集群的静默同步README 给出了一条端到端验证流程用于证明 TLS 加密的 gossip 通道正常工作按上文启动集群浏览器访问第一个实例localhost:9093在该实例上创建一个静默silence再访问另一个实例localhost:9094观察在 9094 上能看到 9093 创建的静默已被同步过来反向重复同样操作验证双向同步。静默能够跨实例出现说明 memberlist gossip 层通过 TLS 传输完成了静默的创建/更新/删除复制。这背后正是 cluster/tls_transport.go 中TLSTransport的作用——它实现 memberlist 的Transport接口将 packet尽力而为与 stream可靠两类操作全部承载在 TLS over TCP 之上并维护连接池复用长连接。同步机制上设计文档确认 gossip 层至少承担三件事成员关系维护、静默复制、通知日志nflog复制。集群主配置与告警联动集群各节点共用的 examples/ha/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: [severitycritical] target_matchers: [severitywarning] equal: [alertname, dev, instance]route按alertname分组group_wait: 30s等待组内首条告警group_interval: 5m为组内新告警的发送间隔repeat_interval: 1h控制重复告警重发周期统一投递到web.hook接收者receiverswebhook 接收者指向本机:5001的 echo 服务便于直接观察告警内容inhibit_rules演示抑制规则——当severitycritical告警存在时抑制同组的severitywarning告警equal列表中的标签alertname、dev、instance在源与目标告警中一致时才生效配置注释特别提醒若equal中列出的标签在源/目标告警中全部缺失抑制规则同样会生效需谨慎使用。想要向集群注入真实告警可参考同目录下的 examples/ha/send_alerts.sh 向实例的/api/v2/alerts推送告警配合 webhook 日志即可看到完整的告警路由链路。源码级原理TLSTransport 如何承载 Gossip从源码深入一层可更清楚理解示例配置最终如何生效。TLSTransport的关键初始化逻辑见 cluster/tls_transport.go服务端web.ConfigToTLSConfig(cfg.TLSServerConfig)将 YAML 中的tls_server_config转换为tls.Config随后tls.Listen(network, addr, tlsServerCfg)创建 TLS 监听器——network固定为tcp见 cluster/tls_transport.go印证了单 TCP 端口承载全部 gossip 流量的设计客户端common.NewTLSConfig(cfg.TLSClientConfig)基于tls_client_config构建出站连接配置newConnectionPool(tlsClientCfg)建立连接池以复用长连接、降低握手开销通道抽象packetCh与streamCh分别模拟 memberlist 的 packet/stream 语义两个通道底层都是同一 TLS TCP 连接池因此防火墙只需放行一个端口。该实现来自对 mxinden/memberlist-tls-transport 注释正是设计文档中memberlist 支持自定义 Transport 层方案的工程落地。对应的单元测试位于 cluster/tls_transport_test.go使用与示例同构的testdata/tls_config_node1.yml验证双向 TLS 握手cluster/cluster_test.go 则验证了带 TLS 配置的集群初始化路径。常见问题与注意事项证书 SAN 必须匹配地址签发证书时-hostnamelocalhost,127.0.0.1决定了握手时主机名校验的合法地址若节点以其他主机名/IP 互访需在-hostname中补充。双向认证强度可调client_auth_type设为VerifyClientCertIfGiven时仅校验出示的证书生产环境建议评估RequireAndVerifyClientCert以强制所有节点必须携带合法客户端证书。相对路径解析TLS 配置文件中的证书路径相对于配置文件所在目录解析源码SetDirectory行为拷贝配置到其他位置时需同步调整路径或改用绝对路径。只开一个端口启用 TLS 传输后集群仅需放行--cluster.listen-address指定的 TCP 端口UDP 通道不再使用Web/API 端口独立于集群端口。证书重签修改任何 CSR/配置后运行make gen-certs重新生成并确保ca.pem在所有节点的client_ca_file/ca_file中保持一致否则将因信任链不一致导致握手失败。综上examples/ha/tls 提供了一套可直接复用的证书签发 → 传输配置 → 多节点编排 → 功能验证完整闭环。将它作为模板替换为自己的 CA 与节点证书即可在任意网络环境部署加密的 Alertmanager HA 集群。【免费下载链接】alertmanagerPrometheus Alertmanager项目地址: https://gitcode.com/GitHub_Trending/al/alertmanager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考