一、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 或网关能力。