NodePort 是什么
NodePort 类型的服务会在每台节点上打开同一个端口,集群外的请求只要访问任意节点的地址加这个端口,就能到达服务后端。默认端口范围是 30000 到 32767,由集群参数决定。它同时保留集群内的虚拟地址,因此内部调用与外部访问可以共用同一个服务对象。
什么时候不该用它
它的定位是简单直接而不是长期方案:每暴露一个服务就占用一个高位端口,端口规划会越来越乱;外网访问依赖节点地址,节点变动或扩缩容都要同步调整;也没有七层能力,无法按域名与路径分发。正式对外服务通常用负载均衡或入口方案,NodePort 更适合测试环境与临时验证。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,无需云厂商支持 |
|---|---|
| 端口范围 | 默认 30000 到 32767,由集群初始化参数决定 |
| 访问方式 | 任意节点地址加节点端口 |
| 同时具备 | 集群内的虚拟地址,内部仍可用服务名访问 |
| 端口分配 | 可手工指定,也可由集群自动分配 |
| 前置条件 | 节点网络可达,且安全组与主机防火墙放行该端口 |
典型使用场景
- 测试环境暴露:快速让外部访问服务,不用申请负载均衡器
- 自建集群对外服务:没有云负载均衡能力时用节点端口过渡
- 临时演示:给外部同事一个地址验证功能
- 兼容旧系统:上游只能配置地址加端口时可用节点端口承接
- 本地集群调试:在虚拟机或物理机上验证服务对外可达性
- 排查入口链路:确认问题出在入口层还是后端服务
清单与访问
清单与访问
apiVersion: v1
kind: Service
metadata:
name: web-np
spec:
type: NodePort
selector:
app: web
ports:
- port: 80 # 集群内访问端口
targetPort: 8080 # 容器真实端口
nodePort: 30080 # 节点端口,可省略由集群分配
protocol: TCP查看与验证
查看与验证
kubectl get svc web-np -o wide # 看类型与端口分配
kubectl get svc web-np -o jsonpath='{.spec.ports[0].nodePort}' # 取节点端口
kubectl get pods -o wide # 拿到节点地址
curl -s -o /dev/null -w '%{http_code}\n' http://<任一节点地址>:30080/端口字段读法
| 字段 | 含义 | 注意 |
|---|---|---|
| port | 服务在集群内暴露的端口 | 必填 |
| targetPort | 转发到容器的端口 | 默认与 port 相同 |
| nodePort | 每台节点开放的端口 | 不写则自动分配高位端口 |
| 访问地址 | 任意节点地址均可 | 节点不可用时换一个节点再试 |
手工指定节点端口时要避开已被占用的端口,且必须落在集群配置的范围内,冲突时创建直接失败。
云主机上除了放行节点端口,还要确认安全组规则;两侧都放行后仍不通时,再检查节点本身的可达性。