三个端口是什么
服务定义里会出现三个端口字段,含义各不相同:服务端口是对集群内暴露的入口,容器端口是转发到容器上的实际监听端口,节点端口是暴露在每台节点上的端口。把三者混为一谈,就会出现「端点列表正常但连接被拒」这类看起来矛盾的现象。
默认值与常见错配
容器端口不写时默认与服务端口相同,这在两者相等时很方便,一旦应用监听的不是同一个端口就会埋下隐患。容器端口还可以写成容器里声明的端口名,好处是改名时只需改一处,代价是依赖容器端口声明,两边要同步维护。
基本信息
| 适用环境 | 任何 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三个字段对照
| 字段 | 定义位置 | 写错的表现 |
|---|---|---|
| 服务端口 | 服务定义 | 调用方连不上,端点可能正常 |
| 容器端口 | 服务定义 | 端点正常但连接被拒 |
| 节点端口 | 服务定义 | 集群外访问不通或创建失败 |
| 容器声明端口 | 容器定义 | 命名端口无法解析,服务创建被拒 |
同一个服务定义多个端口时必须给每个端口命名,否则校验不通过,创建会被直接拒绝。
接口探测是确认端口最直接的方式:在容器内查看监听列表,与容器端口字段对照即可定位错配。