在k8s中Prometheus 服务的 NodePort 已经正确配置,但集群外部无法通过 NodePort 方式访问 Prometheus 的 Web UI(集群使用了网络插件Calico)。
排查一:
在集群宿主机进行测试:
kubectl describe svc prometheus-k8s -n monitoring
从输出结果来看,服务 prometheus-k8s
已经正确配置了两个端口:一个是用于 Web 端口的 9090
(NodePort 为 32148
),另一个是用于重新加载 Web 端口的 8080
(NodePort 为 31109
);
然后执行:
curl -L http://<node-ip>:<nodeport>
成功获取了Prometheus Web UI 的 HTML 页面。这表明集群内部可以通过 NodePort 访问 Prometheus 的 Web UI,可以排除 Prometheus Pod 和 Service 的基本配置问题,因为集群内部可以成功访问;
排查二:
尝试从集群的另一个一个节点使用 curl
直接访问 NodePort 服务,显示连接超时;这说明有可能是集群主机上的防火墙规则未允许外部流量到达 Prometheus 的 NodePort,需要手动添加规则以允许 TCP 流量通过端口。
解决方案一:
我的主机节点之前就已经把防火墙(firewalld)关了,需要重新开启,然后在开放防火墙端口:
########################
# master节点防火墙设置
########################
# 所有master节点开放相关防火墙端口
$ firewall-cmd --zone=public --add-port=6443/tcp --permanent
$ firewall-cmd --zone=public --add-port=2379-2380/tcp --permanent
$ firewall-cmd --zone=public --add-port=10250/tcp --permanent
$ firewall-cmd --zone=public --ad