blockbox.yml 优化
powershell
modules:
http_general:
prober: http
http:
valid_status_codes: []
http_2xx:
prober: http
http:
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp
https_general_probe:
prober: http # 设置为 HTTP prober
timeout: 10s
http:
method: GET
valid_status_codes: [200]
fail_if_ssl: false # 不强制失败于非 SSL
fail_if_not_ssl: true # 强制失败于非 SSL
tls_config:
insecure_skip_verify: true # 跳过证书验证
etcd_tcp_probe:
prober: tcp
tcp:
query_response: []
http_probe_service:
prober: tcp
tcp:
query_response: []
vip_tcp_probe:
prober: http
http:
method: GET
fail_if_body_not_matches_regexp: # 检查响应体
- "ok"
Blackbox 配置表格版解释与优化建议
blackbox 配置整理成 表格版说明 ,再给出 命名问题 和 优化重构建议。
一、配置表格版解释
1)模块总览
| 模块名 | 探测类型 | 主要用途 | 成功条件 | 备注 |
|---|---|---|---|---|
http_general |
HTTP | 检查 Web 服务是否有响应 | 只要能返回 HTTP 响应即可 | 不限制状态码 |
http_2xx |
HTTP | 检查 Web/接口是否正常成功 | 返回 2xx | 默认就是 2xx 成功 |
http_post_2xx |
HTTP | 用 POST 方法检查接口 | POST 后返回 2xx | 未配置 body/headers |
tcp_connect |
TCP | 检查端口是否可连通 | TCP 建连成功 | 最基础端口探测 |
pop3s_banner |
TCP + TLS | 检查 POP3S 服务 | TLS 成功,且返回 +OK |
证书严格校验 |
ssh_banner |
TCP | 检查 SSH 服务 | 返回 SSH-2.0- 开头 |
比单纯端口探测更准确 |
irc_banner |
TCP | 检查 IRC 服务 | 完成基本握手并收到 001 |
带简单交互 |
icmp |
ICMP | 类似 ping,检查主机可达 | ICMP 探测成功 | 可能受权限/防火墙影响 |
https_general_probe |
HTTP(S) | 检查 HTTPS 页面 | 必须 HTTPS,且返回 200 | 跳过证书校验 |
etcd_tcp_probe |
TCP | 检查 etcd 端口可连接 | TCP 建连成功 | 不代表 etcd 真健康 |
http_probe_service |
TCP | 实际是检查端口可连接 | TCP 建连成功 | 名字像 HTTP,实际不是 |
vip_tcp_probe |
HTTP | 检查页面内容是否包含 ok |
HTTP 成功且 body 匹配 ok |
名字像 TCP,实际是 HTTP |
2)逐项详细解释
http_general
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | http_general |
通用 HTTP 探测 |
prober |
http |
使用 HTTP 探测器 |
valid_status_codes |
[] |
不限制响应状态码 |
通俗解释:
这个模块只关心"网页/接口有没有响应",不太关心返回的是 200、404 还是 500。
只要能拿到 HTTP 响应,一般就算服务在线。
适合:
- 粗略探活
- 只检查服务有没有挂掉
http_2xx
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | http_2xx |
标准 HTTP 成功探测 |
prober |
http |
使用 HTTP 探测器 |
http |
空 | 使用默认 HTTP 配置 |
通俗解释:
只要返回 2xx 才算成功。
这是最常见的 HTTP 健康检查方式。
适合:
- Web 页面可用性
- 接口成功性检查
http_post_2xx
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | http_post_2xx |
POST 方式的 HTTP 探测 |
prober |
http |
使用 HTTP 探测器 |
method |
POST |
用 POST 请求 |
通俗解释:
这个模块会发 POST 请求,默认仍然要求返回 2xx。
但因为没配置 body/header,所以它更像"空 POST 探测"。
适合:
- 支持空 POST 的接口
- webhook 类入口连通性检查
风险:
- 很多接口要求 JSON/body/header,不配置会失败
tcp_connect
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | tcp_connect |
基础 TCP 连通性检查 |
prober |
tcp |
使用 TCP 探测器 |
通俗解释:
只看端口能不能连上。
不检查服务协议是否正常。
适合:
- MySQL/Redis/SSH 等端口基础探活
- 网络连通性初筛
pop3s_banner
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | pop3s_banner |
POP3S 服务检查 |
prober |
tcp |
使用 TCP 探测器 |
tls |
true |
建立 TLS 连接 |
expect |
^+OK |
期望欢迎语以 +OK 开头 |
insecure_skip_verify |
false |
不跳过证书校验 |
通俗解释:
连接 POP3S 服务后,要求:
- TLS 建立成功
- 证书合法
- 服务返回
+OK
适合:
- 邮件服务严格健康检查
ssh_banner
| 项 | 配置 | 含义 |
|---||---|
| 模块名 | ssh_banner | SSH Banner 检查 |
| prober | tcp | 使用 TCP 探测器 |
| expect | ^SSH-2.0- | 返回内容要像标准 SSH 头 |
通俗解释:
不只是 22 端口通,而是真的有 SSH 服务在回应。
适合:
- SSH 服务探测
- 防止端口被别的程序占用但误判正常
irc_banner
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | irc_banner |
IRC 服务交互探测 |
prober |
tcp |
使用 TCP 探测器 |
send |
NICK prober / USER ... |
模拟客户端登录 |
expect |
PING :([^ ]+) |
期待服务器 PING |
send |
PONG ${1} |
自动回复 PONG |
expect |
^:[^ ]+ 001 |
期待登录成功欢迎码 |
通俗解释:
这个模块会模拟一个简化版 IRC 客户端,确认服务器真的能完成基本协议交互。
适合:
- IRC 服务真实性检查
icmp
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | icmp |
ICMP 可达性检查 |
prober |
icmp |
使用 ICMP 探测器 |
通俗解释:
和 ping 类似,检查主机能不能通。
注意:
- ICMP 失败不一定是主机挂了,可能只是被禁 ping
https_general_probe
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | https_general_probe |
HTTPS 专用检查 |
prober |
http |
使用 HTTP 探测器 |
timeout |
10s |
超时时间 10 秒 |
method |
GET |
GET 请求 |
valid_status_codes |
[200] |
必须返回 200 |
fail_if_ssl |
false |
使用 SSL 不会失败 |
fail_if_not_ssl |
true |
不是 HTTPS 就失败 |
insecure_skip_verify |
true |
跳过证书校验 |
通俗解释:
这是"必须走 HTTPS 的 GET 200 检查"。
但证书问题不拦截。
适合:
- 内网自签 HTTPS
- 强制要求站点启用 HTTPS
etcd_tcp_probe
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | etcd_tcp_probe |
etcd TCP 端口检查 |
prober |
tcp |
使用 TCP 探测器 |
query_response |
[] |
不发内容、不校验响应 |
通俗解释:
只是看看 etcd 端口通不通。
不能证明 etcd 本身功能正常。
适合:
- 2379/2380 端口基础监测
http_probe_service
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | http_probe_service |
名字像 HTTP,其实是 TCP |
prober |
tcp |
使用 TCP 探测器 |
query_response |
[] |
不发内容、不校验响应 |
通俗解释:
虽然名字叫 http_probe_service,但其实它根本不发 HTTP 请求,只是测端口能不能连。
问题:
- 模块名和行为不一致,容易误导别人
vip_tcp_probe
| 项 | 配置 | 含义 |
|---|---|---|
| 模块名 | vip_tcp_probe |
名字像 TCP,其实是 HTTP |
prober |
http |
使用 HTTP 探测器 |
method |
GET |
GET 请求 |
fail_if_body_not_matches_regexp |
ok |
body 必须包含 ok |
通俗解释:
访问一个页面,如果页面内容里没有 ok 就失败。
适合:
- VIP/LB 健康页检查
/health、/status这种接口
问题:
- 名字里带
tcp,但实际是 HTTP 检查
二、哪些模块命名不合理
下面是最值得指出的几个。
| 当前名称 | 实际行为 | 问题 | 建议名称 |
|---|---|---|---|
http_probe_service |
TCP 连通性探测 | 名字像 HTTP,实际不是 HTTP | tcp_service_connect / service_tcp_connect |
vip_tcp_probe |
HTTP GET + body 匹配 | 名字像 TCP,实际是 HTTP | vip_http_healthcheck / http_body_ok_probe |
https_general_probe |
HTTPS GET 200,跳过证书校验 | 名字有点泛,不突出"必须 HTTPS、忽略证书" | https_get_200_insecure |
etcd_tcp_probe |
etcd 端口连通性 | 名字没错,但容易让人误以为"检查 etcd 健康" | etcd_tcp_connect |
http_general |
HTTP 有响应即可 | 名字可以,但"general"不够具体 | http_any_status |
http_2xx |
HTTP 2xx 检查 | 比较合理 | 可保留 |
http_post_2xx |
POST 请求 2xx 检查 | 合理 | 可保留或改为 http_post_any_2xx |
三、命名优化建议
建议命名时统一规则,让别人一看就知道:
推荐格式:
协议_方法/类型_成功条件_特殊约束
例如:
http_get_2xxhttp_post_2xxhttp_any_statushttps_get_200_insecuretcp_connecttcp_ssh_bannertcp_pop3s_banner_tls_verifyhttp_get_body_oketcd_tcp_connect
这样一眼就知道:
- 用什么协议
- 做什么动作
- 判定标准是什么
四、建议怎么优化重构
方案原则
1. 名字和行为一致
避免:
- 名叫 http,实际是 tcp
- 名叫 tcp,实际是 http
2. 同类模块统一风格
比如所有 HTTP 模块都以 http_ 开头:
http_get_2xxhttp_post_2xxhttp_any_statushttp_get_body_ok
所有 TCP 模块都以 tcp_ 开头:
tcp_connecttcp_ssh_bannertcp_etcd_connect
3. 把"业务用途"和"技术方式"分开
例如 vip_tcp_probe 这种名字带有业务含义(vip)但技术协议不清晰。
更建议:
- 如果是公共模块,名字写技术含义
- 业务 target 放在 Prometheus 的 target labels 里体现
五、推荐重构后的配置命名
下面是按你的配置整理后的 更清晰版本命名建议:
| 原名称 | 建议新名称 | 原因 |
|---|---|---|
http_general |
http_any_status |
更准确表达"不限制状态码" |
http_2xx |
http_get_2xx |
明确是 HTTP GET 默认检查 |
http_post_2xx |
http_post_2xx |
可以保留 |
tcp_connect |
tcp_connect |
可以保留 |
pop3s_banner |
tcp_pop3s_banner_tls_verify |
明确 TLS 且校验证书 |
ssh_banner |
tcp_ssh_banner |
统一 tcp 前缀 |
irc_banner |
tcp_irc_login |
更贴近实际操作过程 |
icmp |
icmp_ping |
更直观 |
https_general_probe |
https_get_200_insecure |
明确 HTTPS + 200 + 跳过证书 |
etcd_tcp_probe |
tcp_etcd_connect |
明确只是 TCP connect |
http_probe_service |
tcp_service_connect |
修正误导性命名 |
vip_tcp_probe |
http_get_body_ok 或 vip_http_healthcheck |
根据你想强调技术还是业务来命名 |
六、重构后的配置示例
更容易维护的写法:
yaml
modules:
http_any_status:
prober: http
http:
valid_status_codes: []
http_get_2xx:
prober: http
http: {}
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
tcp_pop3s_banner_tls_verify:
prober: tcp
tcp:
query_response:
- expect: "^\\+OK"
tls: true
tls_config:
insecure_skip_verify: false
tcp_ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
tcp_irc_login:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp_ping:
prober: icmp
https_get_200_insecure:
prober: http
timeout: 10s
http:
method: GET
valid_status_codes: [200]
fail_if_ssl: false
fail_if_not_ssl: true
tls_config:
insecure_skip_verify: true
tcp_etcd_connect:
prober: tcp
tcp:
query_response: []
tcp_service_connect:
prober: tcp
tcp:
query_response: []
http_get_body_ok:
prober: http
http:
method: GET
fail_if_body_not_matches_regexp:
- "ok"
七、如果进一步优化,我会怎么做
优化点 1:删除没必要的空配置
比如:
tcp:
query_response: []
很多场景可以直接简化成:
prober: tcp
所以这两个:
etcd_tcp_probe
http_probe_service
其实可以写得更简洁。
例如:
tcp_etcd_connect:
prober: tcp
tcp_service_connect:
prober: tcp
优化点 2:HTTP body 检查最好加状态码限制
你现在的:
vip_tcp_probe:
prober: http
http:
method: GET
fail_if_body_not_matches_regexp:
- "ok"
建议补一个:
valid_status_codes: [200]
否则某些异常页面也可能包含 ok 这个词,造成误判。
更稳妥版本:
http_get_200_body_ok:
prober: http
http:
method: GET
valid_status_codes: [200]
fail_if_body_not_matches_regexp:
- "ok"
优化点 3:etcd 更推荐用 HTTP 健康接口
如果 etcd 开启了健康检查接口,最好用 HTTP 模块,比如:
etcd_http_health:
prober: http
http:
method: GET
valid_status_codes: [200]
fail_if_body_not_matches_regexp:
- "true"
比如探测:
/health
这样比只测 TCP 更有意义。
优化点 4:HTTPS 探测可区分"严格证书"和"忽略证书"两类
例如分成两个模块:
https_get_200_strict:
prober: http
http:
method: GET
valid_status_codes: [200]
fail_if_not_ssl: true
tls_config:
insecure_skip_verify: false
https_get_200_insecure:
prober: http
http:
method: GET
valid_status_codes: [200]
fail_if_not_ssl: true
tls_config: