NodePort 的暴露方式
NodePort 在每个节点的高位端口(默认 30000-32767)上开放 Service,外部通过任意节点 IP 加该端口访问,kube-proxy 负责把流量转发到后端 Pod。它的好处是不依赖负载均衡器,任何集群都能用;代价是入口地址随节点变化、端口固定容易冲突、云上还要单独放行安全组,因此更适合测试联调与应急入口。
基本信息
| 端口范围 | 默认 30000-32767,可显式指定 nodePort,也可交给系统分配 |
|---|---|
| 访问方式 | 任意节点 IP + NodePort,由 kube-proxy 转发到后端 Pod |
| externalTrafficPolicy | Cluster 默认可跨节点转发但会 SNAT;Local 保留客户端源 IP,仅本节点有后端时转发 |
| 外部依赖 | 云安全组与主机防火墙需放行该端口范围 |
| 适用场景 | 临时对外、开发联调;生产建议经 Ingress 或负载均衡 |
| 健康检查注意 | Local 策略下无后端的节点健康检查会失败,LB 需按节点维度处理 |
典型使用场景
- 没有负载均衡器的自建集群,需要临时把服务暴露给外网
- 开发联调阶段直接把地址和端口给测试同学,省去域名与证书配置
- 负载均衡或 Ingress 不可用时的应急入口
- Ingress Controller 的 Service 常用 NodePort 形态接入外部流量
- 内部工具与监控面板的固定入口,配合安全组限制来源网段
NodePort 示例
NodePort 示例
apiVersion: v1
kind: Service
metadata:
name: web-np
spec:
type: NodePort
externalTrafficPolicy: Cluster # 改为 Local 可保留客户端源 IP
selector:
app: web
ports:
- port: 80 # Service 在集群内的端口
targetPort: 8080 # 容器实际监听的端口
nodePort: 30080 # 节点暴露端口,留空则由系统分配
查看服务的字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| TYPE | 服务类型,NodePort 会显示端口映射 | 仍为 ClusterIP 说明类型修改未生效 |
| PORT(S) | 形如 80:30080/TCP,冒号后为节点端口 | 无数字说明由系统分配,需另查实际值 |
| EXTERNAL-IP | NodePort 类型通常为空,访问用节点 IP | 显示 pending 属于 LoadBalancer 未就绪的表现 |
| Endpoints | describe 中的后端地址列表 | 为空说明 selector 不匹配或 Pod 未就绪 |
| externalTrafficPolicy | Cluster 或 Local | 为 Local 时无 Pod 的节点访问会失败 |
NodePort 直接暴露节点端口:安全组放开后等于对全网开放,记得限制来源网段或叠加网络策略。需要长期对外时优先走 Ingress 或负载均衡,把 TLS 与限流统一在入口层处理。
源 IP 的取舍:externalTrafficPolicy=Cluster 会做 SNAT,后端看到的源 IP 是节点地址,按真实 IP 做限流与审计会失效;Local 能保留源 IP,但只有本节点存在后端时才转发,负载均衡效果与探活表现都要按节点维度重新验证。