概述
Kubernetes 默认的NodePort端口范围为 30000~32767。
NodePort端口范围为什么是30000~32767呢?
- 避免与系统保存端口冲突
- 着名端口(0~1023)
这些端口通常分配给 HTTP(80)、HTTPS(443)、SSH(22)等系统服务或标准协议,Kubernetes 不会占用。
- 注册端口(1024~49151)
1024~49151 端口用于动态分配给用户进程或应用步伐(如 Docker 容器、数据库等)。
若 Kubernetes 利用此范围,大概与集群内其他应用的端口冲突(例如用户手动指定端口的容器)。
- 暂时端口(49152~65535)
该范围用于暂时端口(客户端动态哀求的端口),但 Kubernetes 选择了此中较高的一段(30000~32767),既避免与暂时端口大量重叠,又留出了充足的端口空间。
- 端口数量与实用性均衡
- 范围大小:30000~32767共包罗 2768 个端口,充足满足中小型集群的服务袒露需求(每个服务需要一个 NodePort)。
- 端口一连性:一连的端口范围便于管理和监控,例如通过防火墙规则一次性开放整个区间。
- 历史原因与社区惯例
- Kubernetes 早期版本参考了云服务商的习惯(如 AWS ELB 默认利用高位端口),逐渐形成了这一默认配置。
- 社区实践中,高位端口(如 30000+)通常用于非标准服务,避免与常见应用(如 Web 服务器、数据库)的端口肴杂。
- 与其他技术的兼容性
- Docker 宿主机端口:Docker 默认利用32768~61000等高位端口映射(如-p 32768:80),Kubernetes 的30000~32767范围与之略有重叠,但通过合理规划可避免冲突。
- 云服务商限制:部分云厂商(如早期的 GCE)对节点端口有限制,30000 + 范围在多数环境中可正常利用。
- 为什么不是更大的范围?
- 端口耗尽风险:虽然 65535 是 TCP/UDP 端口的上限,但预留部分端口给其他服务(如运维工具、监控代理)更为合理。
- 用户习惯:过大的范围大概导致端口分配混乱,固定范围更便于用户影象和管理。
测试,当NodePort不在默认范围之内会怎么样呢?
- [root@master01 ~/service]# cat service-nodeport.yaml
- apiVersion: v1
- kind: Service
- metadata:
- namespace: default
- name: tomcat-svc-nodeport
- spec:
- type: NodePort
- selector:
- app: tomcat
- ports:
- - name: nodeport-tomcat
- # 访问service的端口
- port: 16789
- # 容器的端口
- targetPort: 8080
- # 定义nodePort的端口为80,默认为30000-32767
- nodePort: 80
- protocol: TCP
- # 创建service,这里提示我们端口范围要在30000-32767之间
- [root@master01 ~/service]# kubectl apply -f service-nodeport.yaml
- The Service "tomcat-svc-nodeport" is invalid: spec.ports[0].nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767
复制代码 修改nodePort的端口范围
Kubernetes 默认的NodePort端口范围为 30000~32767。
该范围由 Kubernetes 的配置参数 --service-node-port-range 控制(通常在 API Server 启动时设置),该配置参数通常在
/etc/kubernetes/manifests/kube-apiserver.yaml文件中添加或修改。
修改kube-apiserver.yaml文件
master节点修改- vim /etc/kubernetes/manifests/kube-apiserver.yaml
- ...
- spec:
- containers:
- - command:
- - kube-apiserver
- - --service-node-port-range=1-50000 # 进行添加这一行即可
- ...
复制代码
修改完之后保存该文件,保存之后Kubernetes 会自动重启 API Server 使配置见效。
验证配置是否见效
方式一:- [root@master01 ~/service]# ps -ef | grep kube-apiserve
- root 1637652 1637630 24 23:16 ? 00:00:06 kube-apiserver --service-node-port-range=1-50000 --advertise-address=10.0.0.30...
复制代码 方式二:- [root@master01 ~/service]# kubectl get pods -n kube-system -l component=kube-apiserver -o jsonpath='{.items[0].spec.containers[0].command}'
- ["kube-apiserver","--service-node-port-range=1-50000","--advertise-address=10.0.0.30",...
复制代码 创建service进行测试
- [root@master01 ~/service]# cat service-nodeport.yaml
- apiVersion: v1
- kind: Service
- metadata:
- namespace: default
- name: tomcat-svc-nodeport
- spec:
- type: NodePort
- selector:
- app: tomcat
- ports:
- - name: nodeport-tomcat
- # 访问service的端口
- port: 16789
- # 容器的端口
- targetPort: 8080
- # 定义nodePort的端口为80,默认为30000-32767
- nodePort: 80
- protocol: TCP
- # 对应的80端口
- [root@master01 ~/service]# kubectl apply -f service-nodeport.yaml
- service/tomcat-svc-nodeport created
- [root@master01 ~/service]# kubectl get svc tomcat-svc-nodeport
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- tomcat-svc-nodeport NodePort 10.96.0.191 <none> 16789:80/TCP 9s
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |