K8s 端口暴露:集群统一暴露 vs 单 Pod 暴露
先说本质区别
Pod 是 K8s 里最小的运行单元,IP 是临时的------Pod 重启、扩缩容,IP 就变了。直接暴露 Pod 端口,调用方每次都要重新找地址,完全不可靠。
Service 解决的就是这个问题:它是一个稳定的虚拟入口,始终指向后面一组健康的 Pod,不管 Pod 怎么变。
单个 Pod 暴露端口
适合本地调试,不适合生产。
port-forward(最常用)
bash
kubectl port-forward pod/mypod 8080:80
原理是 kubectl 在本机和 Pod 之间建了一条临时隧道,只有你本地能访问,Pod 重启就断。
hostPort(直接绑宿主机端口)
yaml
containers:
- name: myapp
ports:
- containerPort: 80
hostPort: 8080 # 绑到节点的 8080
Pod 跑在哪个节点,就只能通过那个节点的 IP:8080 访问。Pod 漂移到其他节点,地址就变了。
问题总结
- Pod IP 不固定,重启即变
- 没有负载均衡
- 没有健康检查
- 只适合临时调试,绝对不能用于生产
集群统一暴露端口
通过 Service 统一管理,这才是正确姿势。
ClusterIP(集群内部访问)
bash
kubectl expose deployment myapp --port=80 --target-port=8080 --type=ClusterIP
分配一个虚拟 IP,只在集群内部可达。微服务之间互相调用用这个,外部访问不到。
外部 ✗
集群内部 → ClusterIP:80 → Pod1:8080
→ Pod2:8080
→ Pod3:8080
NodePort(对外暴露,裸机常用)
bash
kubectl expose deployment myapp --port=80 --target-port=8080 --type=NodePort
在每个节点上开一个随机端口(默认 30000-32767),外部通过节点IP:NodePort访问。
外部 → 任意节点IP:32001 → ClusterIP:80 → Pod
缺点是端口丑、端口范围受限、节点 IP 变了又要重新配。
LoadBalancer(云上推荐)
bash
kubectl expose deployment myapp --port=80 --type=LoadBalancer
云厂商(AWS/阿里云/GCP)自动分配一个外网 IP,帮你做四层负载均衡。最简单,但要花钱------每个 Service 都会创建一个独立的负载均衡器。
外部 → 云LB外网IP:80 → NodePort → Pod
Ingress(生产首选)
上面三种都是四层(TCP),Ingress 是七层(HTTP/HTTPS),支持域名路由、路径路由、SSL 终止。
多个服务只需要一个 LoadBalancer,统一走 80/443,按域名或路径分发。
外部 → LB:80/443
→ api.example.com → api-svc → Pod
→ web.example.com → web-svc → Pod
→ web.example.com/v2 → web-v2-svc → Pod
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-svc
port:
number: 80
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port:
number: 80
四种方式横向对比
| 方式 | 访问范围 | 负载均衡 | 适用场景 |
|---|---|---|---|
| port-forward | 仅本机 | ✗ | 本地调试 |
| NodePort | 外部可达 | 基础 | 裸机测试环境 |
| LoadBalancer | 外部可达 | 云厂商LB | 云上单服务生产 |
| Ingress | 外部可达 | 七层路由 | 云上多服务生产 |
一句话选型
- 调试 →
port-forward - 裸机/自建集群 →
NodePort - 云上单服务 →
LoadBalancer - 云上多服务统一入口 →
Ingress+ 一个LoadBalancer