Skip to content

Pod Port

Conclusion

只要程序在 Pod 中监听了某个端口(比如 0.0.0.0:8080),那么我可以直接用 Pod 的 IP + 端口访问到它,而不需要 Service。

这句话 在以下前提下是 100% 正确的:

前提条件

前提说明
监听地址是 0.0.0.0 或 Pod 的 IP意味着该服务对 Pod 网络栈开放,而不是只对本地(127.0.0.1)
你是在同一 Kubernetes 集群中、网络插件正常工作(如 Flannel、Calico)Kubernetes 默认使用 CNI 网络模型,Pod 与 Pod(不管在哪个 Node 上)IP 是可达的
没有启用限制访问的 NetworkPolicy否则即使监听了也可能被禁止访问

错误示例

如果你程序是这样监听的:

go
http.ListenAndServe("127.0.0.1:8080", nil)

或:

bash
nc -l 127.0.0.1 8080

那你只能在 Pod 内部访问,从外部 Pod 用 Pod IP 访问不到

验证监听地址(Pod 内操作)

bash
ss -tuln

如果你看到:

bash
LISTEN 0 128 0.0.0.0:8080 ...

✅ 说明可以被 Pod 外部访问(前提是网络可通)。

但如果是:

bash
LISTEN 0 128 127.0.0.1:8080 ...

❌ 说明只能本地访问,不能被 Pod 外部连上。

Service 的作用

虽然你可以不通过 Service,直接用 Pod IP + 端口访问服务,但:

  • Pod IP 不稳定(Pod 重启就变);
  • 不具备负载均衡;
  • 不能服务发现(除非你硬编码 IP);
  • 不适合生产环境。

Service 是为了提供:

  • 固定访问入口(DNS 名称,如 my-service.default.svc.cluster.local);
  • 负载均衡
  • 跨 Pod 副本自动路由

总结

问题回答
程序监听 0.0.0.0,能否用 Pod IP + 端口访问?✅ 可以
程序监听 127.0.0.1,能否用 Pod IP + 端口访问?❌ 不可以
Service 的作用是什么?📌 提供稳定入口、负载均衡、服务发现

没有 ss 命令

使用 netstat

sh
netstat -tnlp | grep 24008

输出类似:

bash
tcp        0      0 0.0.0.0:24008      0.0.0.0:*      LISTEN      1234/my-app

说明监听的是 IPv4 的 0.0.0.0(即所有 IPv4 地址,可从其他 Pod 访问)。

如果是:

bash
tcp        0      0 127.0.0.1:24008    0.0.0.0:*      LISTEN      1234/my-app

那就是 仅监听本地回环地址,Pod 外部访问不了。

如果是:

bash
tcp6       0      0 :::24008           :::*           LISTEN      1234/my-app

说明监听的是 IPv6 所有地址,有可能也包含 IPv4(但不是绝对,见下方说明)。

检查内核参数

sh
cat /proc/sys/net/ipv6/bindv6only
  • 如果输出是 0(默认),表示 [::]:PORT 会兼容 IPv4;
  • 如果输出是 1,表示不会兼容 IPv4。

尝试从其他 Pod 访问

可以新起一个测试 Pod,比如:

sh
kubectl run curlpod --image=curlimages/curl -it --rm -- bash

然后在里面执行:

sh
curl http://<目标Pod的IP>:24008

或:

sh
nc -v <Pod IP> 24008
  • 能通:说明监听的是 0.0.0.0 或等效地址;
  • 不通:可能监听的是 127.0.0.1 或被防火墙/网络策略限制。

总结

检查方式能否区分
netstat -tuln✅ 是
tcp6 :::PORT⚠️ 可能兼容 IPv4,也可能不兼容,需结合 bindv6only 判断
127.0.0.1:PORT❌ 无法外部访问
0.0.0.0:PORT✅ 可访问
实际 curl 测试✅ 最直接有效