首页/云/Kubernetes 速查/Service 端口三件套:port/targetPort/nodePort
网络与服务55 条

Service 端口三件套:port/targetPort/nodePort

分清三个端口是写对 Service 的关键:port 是服务入口,targetPort 是容器监听,nodePort 是节点映射;targetPort 默认等于 port。

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

三个端口是什么

服务定义里会出现三个端口字段,含义各不相同:服务端口是对集群内暴露的入口,容器端口是转发到容器上的实际监听端口,节点端口是暴露在每台节点上的端口。把三者混为一谈,就会出现「端点列表正常但连接被拒」这类看起来矛盾的现象。

默认值与常见错配

容器端口不写时默认与服务端口相同,这在两者相等时很方便,一旦应用监听的不是同一个端口就会埋下隐患。容器端口还可以写成容器里声明的端口名,好处是改名时只需改一处,代价是依赖容器端口声明,两边要同步维护。

基本信息

适用环境任何 Kubernetes 发行版
服务端口必填,集群内访问服务的端口
容器端口转发目标,不写时默认等于服务端口
节点端口仅节点端口与负载均衡类型使用,不写则由集群分配
多端口要求同一服务有多个端口时必须逐个命名
端口名写法可引用容器内声明的端口名,需两端同步

典型使用场景

  • 新建服务:按应用实际监听端口填写容器端口
  • 多端口服务:同一个服务同时暴露应用端口与管理端口
  • 端口冲突排查:确认服务端口与业务端口是否被其他组件占用
  • 迁移调整:应用监听端口变更后同步修改服务定义
  • 命名端口复用:多环境下容器端口不同但名字一致,减少模板差异
  • 开放节点访问:为节点端口类型的服务指定固定的对外端口

端口定义示例

端口定义示例
spec:
  selector:
    app: web
  ports:
    - name: http                 # 多端口时必填
      port: 80                   # 集群内访问端口
      targetPort: 8080           # 容器实际监听端口
      protocol: TCP
    - name: metrics
      port: 9090
      targetPort: metrics-port   # 引用容器内声明的端口名

核对命令

核对命令
kubectl get svc web -o yaml | sed -n '/ports:/,/selector:/p'   # 看端口定义
kubectl get endpoints web                                     # 端点与端口对照
kubectl get pod -l app=web -o jsonpath='{.items[0].spec.containers[0].ports}'   # 容器声明端口
kubectl exec -it web-x -- ss -lntp 2>/dev/null || kubectl exec -it web-x -- netstat -lntp

三个字段对照

字段定义位置写错的表现
服务端口服务定义调用方连不上,端点可能正常
容器端口服务定义端点正常但连接被拒
节点端口服务定义集群外访问不通或创建失败
容器声明端口容器定义命名端口无法解析,服务创建被拒
同一个服务定义多个端口时必须给每个端口命名,否则校验不通过,创建会被直接拒绝。
接口探测是确认端口最直接的方式:在容器内查看监听列表,与容器端口字段对照即可定位错配。

易错点

  • 容器端口写错:端点列表正常但连接被拒,最容易被误判为网络故障
  • 多端口服务未命名端口:创建被直接拒绝,报错信息与端口命名相关
  • 使用命名端口但容器内没有对应声明:服务创建被拒或端点无法生成
  • 改应用监听端口后忘记同步服务定义:发布成功但服务不可用

数据来源与参考

  • Kubernetes 官方文档 · Service(端口定义)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌