NodePort 类型的 Service 分配一个集群范围的端口,并通过符合配置的节点地址转发流量。它适用于外部负载均衡、开发环境及有明确用途的服务暴露,但不保证每台机器的每个地址都能访问,也不保证每台节点都有一个普通应用监听套接字。路由、防火墙、代理实现与流量策略仍然决定真实访问路径,不能从 Service 类型推断全部网络条件。

一次分配,多种转发路径

默认分配范围为 30000–32767,管理员可以配置其他范围。请求指定 nodePort 时,只有分配与校验允许才会成功;端口冲突会拒绝 API 事务,通常不是先创建一个对象,再悄悄留下不可用端口。应分别核对命令退出状态与实际保存的对象,不能把创建失败解释成运行期网络故障。

Service port、targetPort 与 nodePort 各有职责:前者是虚拟服务入口,中间值指定后端端口,最后一个是节点侧入口。多端口 Service 可以占用多个号码。LoadBalancer 类型也可能分配 NodePort,除非配置与实现允许省略。因此,仅统计类型为 NodePort 的对象,会漏掉地址池的部分实际使用者,第一端口也不代表整份清单。

转发可能由 iptables、IPVS、nftables 或其他实现完成。规则可以引导数据包,而不需要普通用户态程序在该端口接收连接。所以,套接字列表不能证明 NodePort 数据路径健康,也不能凭列表为空宣布服务失效。节点地址筛选同样重要:主地址可达,不代表次要地址或回环地址具有相同行为,具体范围要看代理配置。

流量策略改变候选端点

externalTrafficPolicy 为 Cluster 时,可以选择其他节点上的合适端点。常见 kube-proxy 路径可能执行源地址转换,因此不能假定后端一定看到最初客户端地址。Local 则为外部流量选择本地合适端点,并在这段路径保留源地址。但上游代理或负载均衡可能已经改写过来源,Local 不会自动恢复之前丢失的信息。

没有合适本地端点的节点,无法处理普通 Local 策略流量。外部均衡必须考虑副本分布,不能长期平均发送到全部节点,再期待平台补回缺失的本地副本。终止中端点的处理和代理版本还有额外细节。单副本、三节点只能说明一种放置场景,不能替完整可用性模型,更不能省略真实数据路径测试。

暴露范围取决于实际后端

NodePort 本身提供传输层转发,不提供 HTTP 授权或 TLS 终止。如果它直接选择应用 Pod,确实可能绕过 Ingress 的认证、路由和 WAF;如果选择的就是 Ingress 控制器,那么经过该端口的流量并没有天然绕开控制器。必须先画清真实链路,再判断每项安全控制是否仍处于请求路径中。

应限制哪些调用方能到达节点地址,并记录暴露目的与责任人。NodePort 可以是长期受支持的基础设施组成部分,随意设定到期日不能代替访问控制与监控。节点具有公网地址,既不证明端口已经开放,也不证明应用已经受到保护。检查对象配置与检查外部可达性,是需要分别完成的事情。

坏掉的样子

端口分配失败、没有端点与节点不可达,是不同阶段的问题。空端点集合可能导致拒绝或丢弃,具体取决于实现与策略。仅凭超时或拒绝,不能锁定端口冲突;HTTP 200 也只有在应用明确提供该响应时才是正确预期。后端返回其他业务状态,并不自动意味着 NodePort 失效。

修改暴露方式之前,应核对选择器范围、就绪状态、targetPort、地址筛选、防火墙及流量策略。当前端点条件应优先查看 EndpointSlice;旧 Endpoints API 已弃用,而且后端很多时可能截断。Service 对象看起来正常,并不能认证从调用方到应用的整条网络路径。

快速验证

以下保留的诊断命令要求明确选择临时集群,并准备 kubectl、jq 与 Linux 网络工具。本轮没有重新执行。最后一条请求还假设终端位于目标节点,且第一个地址属于允许的 NodePort 地址,运行前必须核实。它们查看状态并发起一次 HTTP 请求,不构成完整集成测试,也不应该直接复制到未知上下文。

kubectl get svc web -o jsonpath='{.spec.type} {.spec.ports[0].nodePort}{"\n"}'
kubectl get endpoints web
kubectl get svc -A -o json | jq -r '.items[] | select(.spec.type=="NodePort") | "\(.spec.ports[0].nodePort) \(.metadata.namespace)/\(.metadata.name)"' | sort -n | uniq -D -w5
ss -lnt | grep -E ':3[0-9]{4}\b'
curl -sS -o /dev/null -w '%{http_code}\n' "http://$(hostname -I | awk '{print $1}'):$(kubectl get svc web -o jsonpath='{.spec.ports[0].nodePort}')/"

第一条只显示首个端口。重复检查只覆盖 NodePort 类型的首端口,正常 API 分配下本就应为空,不能用于完整容量审计。套接字过滤范围为 30000–39999,无法识别代理转发健康,也没有显示进程归属。需要另行比较 EndpointSlice,并在获准测试网络中对明确节点地址分别测试 Cluster 与 Local,保留响应、端点和源地址证据。

来源

  • Kubernetes Service,NodePort 类型、30000-32767 默认范围与集群级端口分配,已核验 2026-10-15。
  • Virtual IPs and Service Proxies,kube-proxy 的 iptables/IPVS 规则编程与 externalTrafficPolicy,已核验 2026-10-15。
  • Using Source IP,NodePort 的 SNAT 与客户端地址后果,已核验 2026-10-15。