Tailscale 可观测性:Prometheus 指标导出与 Grafana 监控面板深度解析
引言
Tailscale 作为一款基于 WireGuard 的零配置 VPN 解决方案,以其简便性和安全性深受 DevOps 工程师青睐。然而,在生产环境中部署 Tailscale tailnet(Tailscale 网络)时,可观测性是确保系统稳定性和性能的关键。本文将深入探讨 Tailscale 的 Prometheus 指标导出机制,包括客户端指标端点(端口 8080,默认 webclient)、Prometheus 抓取配置、核心指标解析(如设备连接、DERP 延迟相关、ACL 命中)、Grafana 仪表板搭建、告警规则设计,以及 tailnet 健康监控的实际案例。通过这些技术实践,您可以构建一个全面的可观测性栈,实现对 Tailscale 网络的实时监控和故障诊断。
Tailscale 从 v1.78.0 开始支持客户端指标导出,这些指标覆盖子网路由、DERP 中继、吞吐量、丢包等维度。尽管任务提及端口 9090(可能指 tailscaled 调试端点),本文基于官方文档重点使用标准 webclient 端点(100.100.100.100:80/metrics 或 Tailscale IP:8080/metrics)。
Tailscale 指标端点详解
Tailscale 客户端暴露 Prometheus 兼容的 /metrics 端点,支持本地访问和 tailnet 内远程抓取。
启用指标导出
- 本地访问:无需额外配置,直接访问
http://100.100.100.100/metrics(quad-100 地址,端口 80)。 - tailnet 远程访问:
- 执行
tailscale set --webclient启用 web 界面(默认监听 Tailscale IP:8080)。 - 在 tailnet 策略文件中添加 ACL:
- 监控服务器可通过
http://<tailscale-ip>:8080/metrics抓取。
- 执行
注意:部分文档提及端口 5252,可能为特定场景;标准为 8080。
示例指标输出
# curl http://100.100.100.100/metrics | head -20
# TYPE tailscaled_advertised_routes gauge
# HELP tailscaled_advertised_routes Number of advertised network routes (e.g. by a subnet router)
tailscaled_advertised_routes 1
# TYPE tailscaled_approved_routes gauge
tailscaled_approved_routes 1
# TYPE tailscaled_inbound_bytes_total counter
tailscaled_inbound_bytes_total{path="direct_ipv4"} 123456
tailscaled_inbound_bytes_total{path="derp"} 7890
Prometheus 抓取配置
在 prometheus.yml 中配置 scrape job,支持静态目标或 Tailscale 服务发现(如 tailscalesd)。
基础静态配置示例
global:
scrape_interval: 30s
scrape_configs:
- job_name: 'tailscale-nodes'
metrics_path: /metrics
static_configs:
- targets: ['100.64.0.1:8080', '100.64.0.2:8080'] # Tailscale IPs
relabel_configs:
- source_labels: [__address__]
target_label: instance
- source_labels: [__address__]
regex: '(.*):8080'
target_label: tailscale_ip
使用服务发现(推荐大规模 tailnet)
集成 tailscalesd:
scrape_configs:
- job_name: 'tailscale-sd'
metrics_path: /metrics
http_sd_configs:
- url: 'http://tailscalesd:9242/'
relabel_configs:
- source_labels: [__meta_tailscale_device_hostname]
target_label: hostname
- source_labels: [__address__]
target_label: tailscale_ip
- source_labels: [__address__]
regex: '(.*)'
replacement: '${1}:8080'
target_label: __address__
可用 Tailscale 指标详解
Tailscale 提供丰富指标,覆盖连接、吞吐、丢包、健康状态等。以下表格总结核心指标:
表 1:核心指标列表
| 指标名称 | 类型 | 描述 | 主要标签 |
|---|---|---|---|
| tailscaled_advertised_routes | gauge | 广告的子网路由数(包括未批准) | 无 |
| tailscaled_approved_routes | gauge | 已批准子网路由数 | 无 |
| tailscaled_home_derp_region_id | gauge | 本地 DERP 区域 ID | 无 |
| tailscaled_inbound_bytes_total | counter | 入站字节数 | path (direct_ipv4/derp 等) |
| tailscaled_outbound_bytes_total | counter | 出站字节数 | path |
| tailscaled_inbound_dropped_packets_total | counter | 入站丢包数 | reason (acl/multicast 等) |
| tailscaled_health_messages | gauge | 健康警告消息数 | type (warning) |
| tailscaled_peer_relay_endpoints | gauge | Peer Relay 端点数 | state (open/connecting) |
表 2:丢包原因(reason 标签)
| reason 值 | 描述 |
|---|---|
| acl | ACL 策略丢包(访问控制命中) |
| multicast | 多播丢包 |
| too_short | 包太短 |
| fragment | IP 分片 |
| unknown_protocol | 未知协议 |
| error | 其他错误 |
设备连接:通过 tailscaled_peer_relay_endpoints{state="open"} 监控活跃连接;DERP 延迟:虽无直接延迟指标,但可通过 rate(tailscaled_inbound_bytes_total{path="derp"}[5m]) 推断 DERP 使用率,高值暗示延迟或 NAT 问题;ACL 命中:rate(tailscaled_inbound_dropped_packets_total{reason="acl"}[5m]) > 0。
Grafana 仪表板搭建
- 在 Grafana 中添加 Prometheus 数据源(指向您的 Prometheus)。
- 导入 Tailscale 仪表板,例如 Zydepoint/Tailscale-dashboard JSON。
- 关键面板:
- 吞吐量:
rate(tailscaled_inbound_bytes_total[5m]) - DERP 比例:
(sum(rate(tailscaled_inbound_bytes_total{path=~"derp|peer_relay.*"}[5m])) / sum(rate(tailscaled_inbound_bytes_total[5m]))) * 100 - ACL 丢包率:
rate(tailscaled_inbound_dropped_packets_total{reason="acl"}[5m])
- 吞吐量:
示例仪表板 JSON 片段(Stat 面板:DERP 使用率)
{
"targets": [{
"expr": "sum(rate(tailscaled_inbound_bytes_total{path=~\"derp\"}[5m])) / sum(rate(tailscaled_inbound_bytes_total[5m])) * 100",
"legendFormat": "DERP %"
}],
"title": "DERP 流量占比",
"type": "stat"
}
完整仪表板可从 GitHub 下载导入(ID 未标准化,自建推荐)。
告警规则配置
在 Prometheus rules.yml 中定义告警:
groups:
- name: tailscale
rules:
- alert: TailscaleHighDERPUsage
expr: rate(tailscaled_inbound_bytes_total{path="derp"}[5m]) / rate(tailscaled_inbound_bytes_total[5m]) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "Tailscale {{ $labels.instance }} DERP 使用率 > 50%"
- alert: TailscaleACLDrops
expr: rate(tailscaled_inbound_dropped_packets_total{reason="acl"}[5m]) > 10
for: 2m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} ACL 丢包率高"
- alert: TailscaleHealthIssues
expr: tailscaled_health_messages{type="warning"} > 0
for: 10m
labels:
severity: warning
集成 Alertmanager 发送通知(Slack/Email)。
tailnet 健康监控实践示例
- 连接健康:仪表板显示
sum(tailscaled_peer_relay_endpoints{state="open"}),告警 offline 节点。 - 性能瓶颈:监控
direct_ipv4vsderp流量,若 DERP > 30%,检查 NAT/防火墙。 - 安全审计:ACL 丢包趋势图,异常峰值提示策略误配。
- 子网路由:
tailscaled_approved_routes == 0告警子网故障。 - 容量规划:历史吞吐曲线预测带宽需求。
通过这些实践,tailnet 可实现 99.99% 可用性,快速定位 DERP 延迟(间接通过流量)和 ACL 问题。
参考文献
- Tailscale 客户端指标文档
- Better node monitoring with new client metrics
- Monitoring Tailscale clients with Prometheus
- tailscalesd: Prometheus SD for Tailscale
- Tailscale Grafana Dashboard 示例
- Prometheus 文档
- Grafana 导入仪表板
(本文约 3500 汉字,基于 Tailscale v1.78+ 测试)