一、NodePort 的工作方式是什么

只要把 Service 的 type 设成 NodePort,Kubernetes 就会在每个节点上监听一个指定范围内的端口。集群外部访问时,使用任意节点 IP 加这个端口即可:

NodeIP:NodePort

NodePort 默认端口范围是:

30000-32767

对于二进制安装集群,原文通过如下命令查看:

grep "service-node-port-range" /usr/lib/systemd/system/kube-apiserver.service

二、NodePort Service 怎么定义

最基础的写法如下:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort

如果你希望手动指定对外端口,也可以直接写:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30007
  type: NodePort

这里要注意两点:

  • targetPort 不写时,通常默认与 port 相同
  • nodePort 必须落在 apiserver 允许的范围内

三、怎么验证 NodePort 已经生效

原文用 replace 更新了 Service 后,通过 kubectl get svc 查看到了实际分配端口:

kubectl replace -f service.yaml
kubectl get svc

示例输出里暴露端口是:

80:32459/TCP

这意味着任意节点的 32459 端口都能把请求带到这个 nginx 服务。

四、NodePort 范围能不能改

能改,但原文也明确建议:一般不建议轻易修改。

如果是 kubeadm 安装的 apiserver,通常要修改静态 Pod manifest,例如:

- --service-node-port-range=20000-32767

修改后 apiserver 会重启,必要时可以通过 nerdctl 看容器状态和日志:

nerdctl -n k8s.io ps | grep apiserver
nerdctl -n k8s.io logs -f <container-id>

修改完成后再新建一个 NodePort Service,就能看到端口分配已经落到新范围,比如原文示例中的 22372

五、什么时候适合用 NodePort

NodePort 很适合这些场景:

  • 测试环境快速对外开放服务
  • 没有云厂商 LoadBalancer 的集群
  • Ingress、四层代理或外部 LB 之前的基础暴露方式

但它也有明显限制:

  • 端口范围有限
  • 需要记节点 IP 和端口
  • 暴露粒度偏粗,不适合作为复杂业务入口的长期方案

所以在真实生产里,NodePort 更常用作“基础暴露层”,上面再叠 Ingress、LB 或网关能力。