首页/云/Kubernetes 速查/Service NodePort 节点端口暴露
网络与服务55 条

Service NodePort 节点端口暴露

在每个节点上打开同一端口(默认 30000-32767),集群外可通过「任意节点 IP:端口」访问服务;便于测试与小型环境,端口管理成本较高。

Kubernetes 速查云更新于 2026-10-13

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每台节点开放的端口不写则自动分配高位端口
访问地址任意节点地址均可节点不可用时换一个节点再试
手工指定节点端口时要避开已被占用的端口,且必须落在集群配置的范围内,冲突时创建直接失败。
云主机上除了放行节点端口,还要确认安全组规则;两侧都放行后仍不通时,再检查节点本身的可达性。

易错点

  • 只改安全组不改主机防火墙:云侧放行但主机拒绝,外部依旧不通,排查要两头都看
  • 手工指定的节点端口已被占用或超出范围:服务创建直接失败,报错信息里会写明范围
  • 以为节点端口固定不变:未指定时由集群自动分配,删除重建后可能改变,上游配置会失效
  • 用节点端口长期对外提供服务:端口规划混乱且没有七层能力,后续迁移到入口方案成本更高

数据来源与参考

  • Kubernetes 官方文档 · Service(NodePort)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌