节点端口是集群级资源
NodePort 型 Service 会在每个节点上开放同一个端口,外部流量从任意节点进入后被转发到后端 Pod。这个端口从集群配置的范围内分配,常见默认范围是 30000 到 32767,由 apiserver 参数控制。端口属于集群级资源:两个 Service 争抢同一端口时,后创建的会失败。因此固定端口要列入台账管理,外部防火墙与负载均衡的配置才能长期稳定。
基本信息
| 适用对象 | 各版本的 NodePort 与 LoadBalancer 型 Service |
|---|---|
| 默认范围 | 30000 到 32767,由 apiserver 的端口范围参数控制 |
| 分配方式 | 自动分配,或在清单中显式指定 |
| 固定端口用途 | 便于防火墙白名单与外部负载均衡配置 |
| 查看方式 | 控制面进程参数或 kubeadm 的 apiserver 清单文件 |
典型使用场景
- 对外暴露服务:在没有云负载均衡的环境里用节点端口对外发布
- 白名单配置:固定端口便于安全组与防火墙规则长期稳定
- 外部负载均衡后端:把节点端口作为后端端口注册到硬件或软件 LB
- 排障核对:确认端口是否在范围内、是否与其他服务冲突
- 端口治理:建立端口分配台账,避免多个团队互相抢占
查看范围与固定端口
查看范围与固定端口
ps -ef | grep kube-apiserver | grep -o -- '--service-node-port-range=[0-9-]*'
# kubeadm 集群也可查看 /etc/kubernetes/manifests/kube-apiserver.yaml 中的参数
kubectl get svc -A -o custom-columns='NS:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,NODEPORT:.spec.ports[*].nodePort'
kubectl get svc -A -o jsonpath='{range .items[*]}{.spec.ports[*].nodePort}{"\n"}{end}' | sort -n | uniq -d固定端口示例
固定端口示例
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
namespace: prod
spec:
type: NodePort
selector:
app: web
ports:
- port: 443
targetPort: 8443
nodePort: 30443 # 必须在集群允许的范围内且未被占用相关概念与注意点
| 概念 | 说明 | 注意 |
|---|---|---|
| 默认范围 | 30000 到 32767 | 可被集群参数修改,以实际配置为准 |
| 指定端口 | 在清单里写 nodePort | 必须在范围内且未被占用 |
| 端口冲突 | 两个 Service 用同一端口 | 后创建的失败 |
| 范围调整 | 属于控制面变更 | 需重启 apiserver 相关组件生效 |
固定端口通常比自动分配更好管理:外部防火墙与负载均衡的配置不必随端口变化调整,故障恢复时路径也更可预期。
范围被修改过的老集群要按实际配置判断:拿默认值去推断可用端口,会得到与集群行为不符的结论。