为什么NodePort类型的service在 node节点上 netstat看不到其nodeport端口?

image.png
image.png
NodePort类型的service 的nodePort为31002


apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
 type: NodePort
 ports:
  - port: 8080
    nodePort: 31002
 selector:
    tier: frontend

问题: 虽然curl localhost:31002 能返回html数据,但是为什么 netstat -tlp |grep 31002 没有数据?

阅读 1.2k
avatarAI BotBETA

NodePort 是 Kubernetes 的一种 Service 类型,它允许你将 Service 暴露到集群外部的节点上,通过指定的 NodePort 来访问这个 Service。但是,NodePort 并不是在节点上运行的一个实际的服务进程,因此你无法直接使用 netstat 命令在节点上看到它。

实际上,当你创建一个 NodePort 类型的 Service 时,Kubernetes 会在每个节点上配置 iptables 规则,将这些流量转发到 Service 的 ClusterIP 和端口上。因此,当你尝试通过 curl localhost:31002 访问 NodePort 时,你实际上是在访问节点的 IP 地址和 NodePort,然后由 iptables 规则将流量转发到 Service 的 ClusterIP 和端口上。

由于 NodePort 并不是在节点上运行的一个实际的服务进程,因此 netstat 命令无法显示它。要查看 iptables 规则,你可以使用 iptables -t nat -L 命令。你应该能够看到一条规则,它将流量从 NodePort 转发到 Service 的 ClusterIP 和端口上。

总之,虽然你可以通过 NodePort 访问 Kubernetes Service,但它并不是在节点上运行的一个实际的服务进程,因此你无法在节点上使用 netstat 命令看到它。

1 个回答

这个端口是通过 iptable 规则转发到实际的服务 pod ip/端口 上去的,并没有一个进程在这个端口上监听。所以 netstat 自然就看不到。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题