跳转至

内网访问 Prometheus/Grafana/Alertmanager 配置 SOP

文档版本:v1.0
适用环境:frp + OpenVPN 内网穿透架构(公网服务器 129.226.138.204 + K8s 内网节点 192.168.0.2)
最近更新:2026-08-15


一、背景与目标

1.1 需求描述

已有公网通过 frp 穿透访问 prometheus.rainchen.top、grafana.rainchen.top、alertmanager.rainchen.top,现需要在内网(接入 OpenVPN 的环境下)直接通过相同域名访问这三个服务,避免内外网访问域名不一致。

1.2 已踩坑备忘(⚠️ 重要)

坑 现象 根因 解决方式
不要在 192.168.0.2 上配置 Nginx 监听 80 端口 Nginx 配置正常但始终返回 404 192.168.0.2 是 K8s 节点,Traefik Pod 已通过 hostPort: 80 占用宿主机 80 端口;CNI iptables DNAT 规则把所有 80 端口流量转发到 Traefik Pod(172.16.151.186),Nginx 根本收不到流量 直接用 Traefik IngressRoute 做路由,不再启 Nginx
/etc/hosts 解析到错误 IP 内网访问跳去了别的机器 之前配了 192.168.0.8,实际 Traefik 跑在 192.168.0.2 /etc/hosts 必须指向 192.168.0.2

二、网络拓扑

┌──────────────────────────────────────────────────────────────────────────┐
│                         双链路访问拓扑(互不干扰)                          │
├──────────────────────────────────────────────────────────────────────────┤
│                                                                          │
│  【链路 A:外出公网访问】 — 原有配置,本次未修改                           │
│                                                                          │
│  用户(4G/外网)                                                            │
│       ↓ DNS 解析 prometheus.rainchen.top → 129.226.138.204               │
│       ↓ HTTP :80                                                         │
│  ┌─ 公网服务器 129.226.138.204 ─────────────────────────────────────┐    │
│  │  Nginx 监听 80,按 Host 分发 server 块                             │    │
│  │     proxy_pass http://prometheus.rainchen.top:9090                │    │
│  │       ↓ (DNS 自解析 → 129.226.138.204:9090)                       │    │
│  │  FRPS 监听 9090 / 3000 / 9093                                     │    │
│  └───────────────────────┬───────────────────────────────────────────┘    │
│                          ↓ frp 隧道 (vhostHTTPPort)                       │
│  ┌─ 内网服务器 192.168.0.2 (K8s Master) ──────────────────────────────┐  │
│  │  FRPC 客户端注册 9090/3000/9093 → 本地对应端口                      │  │
│  │      ↓                                                             │  │
│  │  K8s Service (ClusterIP / NodePort)                                │  │
│  └────────────────────────────────────────────────────────────────────┘  │
│                                                                          │
│  【链路 B:内网 / OpenVPN 访问】 — 本次新增                               │
│                                                                          │
│  用户(内网 / OpenVPN 192.168.0.x)                                         │
│       ↓ /etc/hosts 解析 prometheus.rainchen.top → 192.168.0.2            │
│       ↓ HTTP :80                                                         │
│  ┌─ 内网服务器 192.168.0.2 ──────────────────────────────────────────┐  │
│  │  Traefik Ingress Controller (hostPort: 80)  ← CNI DNAT 直接命中   │  │
│  │     ↓ IngressRoute 匹配 Host(`prometheus.rainchen.top`)           │  │
│  │  K8s ClusterIP Service                                             │  │
│  │     ├─ prometheus-kube-prometheus-prometheus :9090                 │  │
│  │     ├─ prometheus-grafana :80                                      │  │
│  │     └─ prometheus-kube-prometheus-alertmanager :9093               │  │
│  └────────────────────────────────────────────────────────────────────┘  │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

三、复现步骤(SOP)

前置条件

  • 能通过 OpenVPN 或直接内网 SSH 到 192.168.0.2
  • 192.168.0.2 上有 kubectl 命令,且有 K8s 集群管理权限
  • 3 个 K8s 服务已存在(下表)
Service Name Namespace ClusterIP Port
prometheus-kube-prometheus-prometheus monitoring 10.98.245.110 9090
prometheus-grafana monitoring 10.101.119.2 80
prometheus-kube-prometheus-alertmanager monitoring 10.105.128.32 9093

可通过 kubectl get svc -n monitoring | grep prometheus 确认。


步骤 1:确认端口 80 占用情况

# 在 192.168.0.2 上执行
ss -tlnp | grep ':80'

预期输出:应看到 Traefik Pod 的进程(pid 不定)通过 hostPort: 80 监听,而不是 Nginx。如果有 Nginx 占用 80,需要先停掉(systemctl stop nginx && systemctl disable nginx)。


步骤 2:创建 Traefik IngressRoute 资源

# 登录 192.168.0.2
ssh root@192.168.0.2

# 创建 3 个 IngressRoute
cat << 'EOF' | kubectl apply -f -
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: prometheus-ingress
  namespace: monitoring
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`prometheus.rainchen.top`)
    services:
    - name: prometheus-kube-prometheus-prometheus
      port: 9090
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: grafana-ingress
  namespace: monitoring
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`grafana.rainchen.top`)
    services:
    - name: prometheus-grafana
      port: 80
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: alertmanager-ingress
  namespace: monitoring
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`alertmanager.rainchen.top`)
    services:
    - name: prometheus-kube-prometheus-alertmanager
      port: 9093
EOF

预期输出:

ingressroute.traefik.containo.us/prometheus-ingress created
ingressroute.traefik.containo.us/grafana-ingress created
ingressroute.traefik.containo.us/alertmanager-ingress created

确认资源:

kubectl get ingressroutes -n monitoring
# NAME                   AGE
# alertmanager-ingress   10s
# grafana-ingress        10s
# prometheus-ingress     10s

步骤 3:服务端本机验证

# 在 192.168.0.2 上执行
echo "=== Prometheus ==="
curl -s -o /dev/null -w "HTTP: %{http_code}\n" -H "Host: prometheus.rainchen.top" http://127.0.0.1/
curl -s -w "\n/-/healthy: %{http_code}\n" -H "Host: prometheus.rainchen.top" http://127.0.0.1/-/healthy

echo "=== Grafana ==="
curl -s -o /dev/null -w "HTTP: %{http_code}\n" -H "Host: grafana.rainchen.top" http://127.0.0.1/

echo "=== Alertmanager ==="
curl -s -o /dev/null -w "HTTP: %{http_code}\n" -H "Host: alertmanager.rainchen.top" http://127.0.0.1/

预期结果: - Prometheus / 返回 302(重定向登录页),/-/healthy 返回 200 + Prometheus Server is Healthy. - Grafana / 返回 302 - Alertmanager / 返回 200


步骤 4:客户端配置(本机电脑 / OpenVPN 接入设备)

在需要内网访问的电脑本地(不是服务器)修改 hosts:

Windows:C:\Windows\System32\drivers\etc\hosts(管理员记事本打开)
macOS / Linux:/etc/hosts(sudo vi /etc/hosts)

追加以下 3 行:

192.168.0.2 prometheus.rainchen.top
192.168.0.2 grafana.rainchen.top
192.168.0.2 alertmanager.rainchen.top

⚠️ 如果 OpenVPN 给你分配的内网 IP 段不同(例如需要通过 192.168.0.8 网关访问),请改为对应的可达 IP。

生效验证:

# Windows cmd
ping prometheus.rainchen.top
# 应显示 Pinging prometheus.rainchen.top [192.168.0.2] ...

# macOS / Linux
getent hosts prometheus.rainchen.top
# 192.168.0.2   prometheus.rainchen.top

步骤 5:浏览器验证

打开浏览器分别访问: - http://prometheus.rainchen.top → 进入 Prometheus UI - http://grafana.rainchen.top → 进入 Grafana 登录页(默认 admin / prom-operator) - http://alertmanager.rainchen.top → 进入 Alertmanager UI


四、公网访问保护(确保外出时也可用)

4.1 公网链路状态验证

公网访问未做任何改动,以下是验证命令(可用于自检):

# 在公网服务器 129.226.138.204 上执行
echo "=== frps 代理端口 ==="
ss -tlnp | grep frps | grep -E "9090|3000|9093"
# 必须存在 LISTEN 状态的 9090 / 3000 / 9093

echo "=== Nginx 代理测试 ==="
curl -s -o /dev/null -w "prometheus: %{http_code}\n" -H "Host: prometheus.rainchen.top" http://127.0.0.1/
curl -s -o /dev/null -w "grafana: %{http_code}\n" -H "Host: grafana.rainchen.top" http://127.0.0.1/

4.2 公网直接请求测试(模拟外出)

从任意不在内网的机器执行:

curl -s -w "HTTP: %{http_code}\n" http://prometheus.rainchen.top/-/healthy
# 预期 200 + Prometheus Server is Healthy.

五、故障排查手册

问题 1:内网浏览器访问返回 404 / 连接拒绝

现象定位 ──→ 抓日志 ──→ 根因分析 ──→ 修复 ──→ 验证
排查步骤 命令(在 192.168.0.2 上) 正常输出 / 异常处理
1. DNS 解析是否正确 getent hosts prometheus.rainchen.top 应返回 192.168.0.2,否则检查本地 /etc/hosts
2. 80 端口能否到达 curl -v telnet://192.168.0.2:80 或 nc -zv 192.168.0.2 80 Connected,否则检查防火墙、OpenVPN 路由
3. Traefik 是否监听 80 ss -tlnp | grep ':80' 应显示 Traefik Pod PID,若显示 nginx → 停掉 nginx
4. IngressRoute 是否存在 kubectl get ingressroutes -n monitoring 3 条路由都应存在,若缺失重做步骤 2
5. Traefik Pod 日志 kubectl logs -n default -l app=traefik --tail=100 搜索域名看是否有 404 / 502
6. 后端服务是否存活 kubectl get svc -n monitoring prometheus-kube-prometheus-prometheus 确认 ClusterIP 和端口
7. iptables DNAT 是否正确 iptables -t nat -L CNI-DN-b26a5503aa8307dafc438 -n 2>/dev/null | grep dpt:80 应存在 DNAT tcp ... dpt:80 to:172.16.151.xxx:80(Traefik Pod IP)

问题 2:公网访问正常,内网突然访问不了

优先怀疑: 1. OpenVPN 断开 → 重连 VPN 2. Traefik Pod 重启后 IP 变化 → CNI 会自动更新 DNAT,等待 1 分钟再试 3. 本地 DNS 缓存 → ipconfig /flushdns(Windows)或 sudo dscacheutil -flushcache(mac)

问题 3:公网访问挂了

和本次变更无关。排查顺序: 1. systemctl status frps → 挂了就 systemctl restart frps 2. systemctl status nginx → systemctl restart nginx 3. 内网 frpc 是否在线 → 192.168.0.2 上 ps aux | grep frpc


六、回滚方案

如果本次配置引发问题(理论上不会,因为公网链路完全独立),按以下顺序回滚:

方式 A:仅删除 IngressRoute(推荐)

# 在 192.168.0.2 上执行
kubectl delete ingressroute prometheus-ingress grafana-ingress alertmanager-ingress -n monitoring

回滚后效果:内网访问域名会 Connection refused(因为 Traefik 不再有对应路由),公网访问完全不受影响。再把本地 hosts 注释掉即可。

方式 B:完整回滚(本地 hosts)

编辑本地 hosts 文件,删除或注释掉 3 行:

# 192.168.0.2 prometheus.rainchen.top
# 192.168.0.2 grafana.rainchen.top
# 192.168.0.2 alertmanager.rainchen.top

七、相关配置文件速查

机器 路径 作用 是否需要改
129.226.138.204 /etc/nginx/nginx.conf 公网 nginx server 块(proxy_pass 到 frp 端口) ❌ 本次未动
129.226.138.204 /usr/local/frps/frps.toml frps 配置(bindPort=7000, vhostHTTPSPort=9443, webServer.port=6443) ❌ 上次修了端口冲突,本次未动
192.168.0.2 K8s IngressRoute CRD 内网 Traefik 路由 ✅ 本次新增
192.168.0.2 /etc/nginx/ 之前踩坑装过,已清空还原 ❌ 恢复备份了
你本地电脑 /etc/hosts 域名指向 192.168.0.2 ✅ 按需添加

八、变更记录

日期 操作 操作人 备注
2026-08-15 修复 frps 端口冲突(6443 重复绑定 → 6444/9443/6443) Rain 公网 frps 不再报错
2026-08-15 尝试 Nginx 反代 → 失败(发现 Traefik hostPort 占用 80) Rain 根因:CNI iptables DNAT 截流
2026-08-15 创建 3 条 Traefik IngressRoute,配置本地 hosts,双链路验证通过 Rain 内外网同域名访问正式启用

来源:/home/rain/Documents/trae_for_om/prometheus_grafana_internal_access/SOP-内网访问Prometheus-Grafana配置.md | 最后更新:2026-08-15 00:46(由 build/sync.py 同步,请勿在站点侧修改)