
💡 终极洞察: 流量转发不看“工牌” (
containerPort),只看“导航指令” (targetPort)。
targetPort == App Port targetPort != App Port 场景设定:
http://192.168.1.50:30080nodePort: 30080, port: 80, targetPort: 9090containerPort: 8080 (⚠️ 故意写错的干扰项)server.port = 9090 (✅ 真实监听)192.168.1.50 的 30080 端口。kube-proxy (iptables/IPVS) + 防火墙。kube-proxy 执行 DNAT (目标地址转换)。NodeIP:30080 <ClusterIP>:80 containerPort: 8080。targetPort: 9090。server.port=9090,正在监听。8080? containerPort 改成 9090 但 Java 还是 8080? 
为了消除认知负担,请死守以下三条铁律:
8080,YAML containerPort 也写 8080。kubectl describe pod 看到的端口,就是代码真正跑的端口。targetPort 必须死死咬住代码实际监听的端口。targetPort。# 1. Deployment (应用层) - 诚实声明
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
template:
spec:
containers:
- name: app
image: my-java-image:v1
# 【原则1】声明端口 = 代码实际监听端口 (server.port=8080)
ports:
- containerPort: 8080
env:
- name: SERVER_PORT
value: "8080"
---
# 2. Service (网络层) - 精准导航
apiVersion: v1
kind: Service
metadata:
name: my-java-svc
spec:
type: NodePort
selector:
app: my-java-app
ports:
# 【外部/内部调用端口】标准化为 80,方便内部微服务调用
- port: 80
# 【原则2 & 3】显式指定!必须等于代码实际监听端口 (8080)
targetPort: 8080
# 【外部入口端口】固定一个易记的端口 (30000-32767)
nodePort: 30080 Kubernetes 的网络流量不是“广播”,而是一场定向接力:
记住:
containerPort只是贴在运动员身上的号码牌。 裁判(kube-proxy)发球时,只看导航仪(TargetPort)指向哪里。 只有当 导航仪指向的房间 里,恰好有 人在等待,这场接力才算完美完成。
如果遇到连接问题,按顺序执行以下“三板斧”:
kubectl get svc <svc-name> -o yaml | grep targetPort
# 确认 targetPort 是多少 (例如 9090)kubectl get pods -l app=<label> -o wide
# 拿到 Pod IP
kubectl exec -it <pod-name> -- netstat -tulpn | grep <targetPort>
# 确认容器内真的有进程在监听 targetPort 吗?# 在集群内任意节点或 Pod 中测试
curl -v http://<Pod-IP>:<targetPort>
# 如果这里不通,那就是代码(App Port)的问题,与 K8s 配置无关!