内网访问 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同步,请勿在站点侧修改)