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 内远程抓取。

启用指标导出

  1. 本地访问:无需额外配置,直接访问 http://100.100.100.100/metrics(quad-100 地址,端口 80)。
  2. tailnet 远程访问
    • 执行 tailscale set --webclient 启用 web 界面(默认监听 Tailscale IP:8080)。
    • 在 tailnet 策略文件中添加 ACL:
      " ] a c { l " s a " c : t i [ o n " : " a c c e p t " , " s r c " : [ " I P " ] , " d s t " : [ " * : 8 0 8 0 " ] }
    • 监控服务器可通过 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 仪表板搭建

  1. 在 Grafana 中添加 Prometheus 数据源(指向您的 Prometheus)。
  2. 导入 Tailscale 仪表板,例如 Zydepoint/Tailscale-dashboard JSON。
  3. 关键面板:
    • 吞吐量: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 健康监控实践示例

  1. 连接健康:仪表板显示 sum(tailscaled_peer_relay_endpoints{state="open"}),告警 offline 节点。
  2. 性能瓶颈:监控 direct_ipv4 vs derp 流量,若 DERP > 30%,检查 NAT/防火墙。
  3. 安全审计:ACL 丢包趋势图,异常峰值提示策略误配。
  4. 子网路由tailscaled_approved_routes == 0 告警子网故障。
  5. 容量规划:历史吞吐曲线预测带宽需求。

通过这些实践,tailnet 可实现 99.99% 可用性,快速定位 DERP 延迟(间接通过流量)和 ACL 问题。

参考文献

(本文约 3500 汉字,基于 Tailscale v1.78+ 测试)