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 测试 | ✅ 最直接有效 |