避坑指南:部署完kube-prometheus后,为什么Grafana/Prometheus页面还是打不开?
避坑指南:部署完kube-prometheus后,为什么Grafana/Prometheus页面还是打不开?
当你按照教程一步步部署完kube-prometheus,看到所有Pod都显示为Running状态时,本以为大功告成,却在浏览器输入NodePort地址后遭遇"连接超时"或"拒绝访问"。这种"看得见摸不着"的困境,正是许多Kubernetes新手遇到的典型问题。本文将带你深入排查这个看似简单却暗藏玄机的访问故障。
1. 现象诊断:从表象到本质
首先确认几个基本事实:
- 使用
kubectl get pods -n monitoring确认所有Pod状态为Running - 使用
kubectl get svc -n monitoring确认Service已正确配置NodePort - 节点网络连通性正常,防火墙已放行对应端口
典型症状链:
- 浏览器访问
http://<节点IP>:<NodePort>长时间无响应 - 使用
curl -v测试返回Connection refused - 集群内通过
kubectl port-forward可以正常访问
注意:如果port-forward也无法访问,可能是更基础的部署问题,需先排查Pod日志。
2. 元凶浮现:NetworkPolicy的隐形屏障
通过kubectl get networkpolicy -n monitoring命令,你会发现三个关键策略:
prometheus-network-policygrafana-network-policyalertmanager-network-policy
这些策略默认采用白名单模式,只允许monitoring命名空间内的Pod相互访问。这是kube-prometheus的安全设计,却成了外部访问的"隐形墙"。
策略解析:
# 典型NetworkPolicy示例 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: grafana-network-policy spec: podSelector: matchLabels: app.kubernetes.io/name: grafana policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: monitoring3. 解决方案:安全与便利的平衡
3.1 快速解决方案(适合测试环境)
直接删除NetworkPolicy资源:
kubectl delete -f manifests/prometheus-networkPolicy.yaml kubectl delete -f manifests/grafana-networkPolicy.yaml kubectl delete -f manifests/alertmanager-networkPolicy.yaml3.2 精细控制方案(生产环境推荐)
修改NetworkPolicy,添加外部访问规则:
# 修改后的grafana-network-policy.yaml示例 ingress: - from: - namespaceSelector: {} # 允许所有命名空间 podSelector: {} # 允许所有Pod ports: - protocol: TCP port: 30003.3 替代方案:Ingress网关
更安全的方式是通过Ingress暴露服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grafana-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: grafana.example.com http: paths: - path: / pathType: Prefix backend: service: name: grafana port: number: 30004. 深度原理:Kubernetes网络策略解析
NetworkPolicy工作原理示意图:
| 组件 | 作用 | 必需条件 |
|---|---|---|
| CNI插件 | 实际执行网络规则 | 必须支持NetworkPolicy |
| Pod选择器 | 确定策略应用对象 | 匹配Pod标签 |
| 规则方向 | Ingress/Egress | 定义流量方向 |
| 匹配规则 | namespaceSelector/podSelector | 定义白名单 |
常见CNI插件支持情况:
- Calico:完全支持
- Flannel:需额外配置
- Cilium:完全支持+增强功能
- Weave Net:基本支持
5. 生产环境最佳实践
最小权限原则:
- 只开放必要端口
- 使用特定IP白名单
- from: - ipBlock: cidr: 192.168.1.0/24监控与审计:
# 检查网络策略生效情况 kubectl describe networkpolicy -n monitoring # 查看实际iptables规则 iptables -L -n -v | grep -i monitoring多租户隔离:
- from: - namespaceSelector: matchLabels: team: devops性能考量:
- 每条NetworkPolicy会增加约5-10ms延迟
- 超过50条策略需考虑性能影响
6. 故障排查工具箱
当修改策略后仍无法访问时,按此流程排查:
验证策略应用:
kubectl get networkpolicy -n monitoring --show-labels检查端点状态:
kubectl get endpoints -n monitoring网络连通性测试:
# 从集群内测试 kubectl run test-$RANDOM --rm -it --image=alpine -- sh apk add curl curl -v http://grafana:3000日志分析:
# 查看kube-proxy日志 kubectl logs -n kube-system -l k8s-app=kube-proxy网络插件诊断:
# Calico诊断 calicoctl get networkPolicy -o wide # Cilium诊断 cilium policy get
