K8s进阶之修改Service的NodePort的端口范围
<h2 id="概述">概述</h2><p>Kubernetes 默认的NodePort端口范围为 30000~32767。</p>
<h3 id="nodeport端口范围为什么是3000032767呢">NodePort端口范围为什么是30000~32767呢?</h3>
<ul>
<li>
<p>避免与系统保留端口冲突</p>
<ul>
<li>
<p>知名端口(0~1023)<br>
这些端口通常分配给 HTTP(80)、HTTPS(443)、SSH(22)等系统服务或标准协议,Kubernetes 不会占用。</p>
</li>
<li>
<p>注册端口(1024~49151)<br>
1024~49151 端口用于动态分配给用户进程或应用程序(如 Docker 容器、数据库等)。<br>
若 Kubernetes 使用此范围,可能与集群内其他应用的端口冲突(例如用户手动指定端口的容器)。</p>
</li>
<li>
<p>临时端口(49152~65535)<br>
该范围用于临时端口(客户端动态请求的端口),但 Kubernetes 选择了其中较高的一段(30000~32767),既避免与临时端口大量重叠,又留出了足够的端口空间。</p>
</li>
</ul>
</li>
<li>
<p>端口数量与实用性平衡</p>
<ul>
<li>
<p>范围大小:30000~32767共包含 2768 个端口,足够满足中小型集群的服务暴露需求(每个服务需要一个 NodePort)。</p>
</li>
<li>
<p>端口连续性:连续的端口范围便于管理和监控,例如通过防火墙规则一次性开放整个区间。</p>
</li>
</ul>
</li>
<li>
<p>历史原因与社区惯例</p>
<ul>
<li>
<p>Kubernetes 早期版本参考了云服务商的习惯(如 AWS ELB 默认使用高位端口),逐渐形成了这一默认配置。</p>
</li>
<li>
<p>社区实践中,高位端口(如 30000+)通常用于非标准服务,避免与常见应用(如 Web 服务器、数据库)的端口混淆。</p>
</li>
</ul>
</li>
<li>
<p>与其他技术的兼容性</p>
<ul>
<li>
<p>Docker 宿主机端口:Docker 默认使用32768~61000等高位端口映射(如-p 32768:80),Kubernetes 的30000~32767范围与之略有重叠,但通过合理规划可避免冲突。</p>
</li>
<li>
<p>云服务商限制:部分云厂商(如早期的 GCE)对节点端口有限制,30000 + 范围在多数环境中可正常使用。</p>
</li>
</ul>
</li>
<li>
<p>为什么不是更大的范围?</p>
<ul>
<li>端口耗尽风险:虽然 65535 是 TCP/UDP 端口的上限,但预留部分端口给其他服务(如运维工具、监控代理)更为合理。</li>
<li>用户习惯:过大的范围可能导致端口分配混乱,固定范围更便于用户记忆和管理。</li>
</ul>
</li>
</ul>
<h2 id="测试当nodeport不在默认范围之内会怎么样呢">测试,当NodePort不在默认范围之内会怎么样呢?</h2>
<pre><code># 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之间
# kubectl apply -f service-nodeport.yaml
The Service "tomcat-svc-nodeport" is invalid: spec.ports.nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767
</code></pre>
<h2 id="修改nodeport的端口范围">修改nodePort的端口范围</h2>
<p>Kubernetes 默认的NodePort端口范围为 30000~32767。<br>
该范围由 Kubernetes 的配置参数 <code>--service-node-port-range</code> 控制(通常在 API Server 启动时设置),该配置参数通常在<br>
<code>/etc/kubernetes/manifests/kube-apiserver.yaml</code>文件中添加或修改。</p>
<h3 id="修改kube-apiserveryaml文件">修改kube-apiserver.yaml文件</h3>
<p>master节点修改</p>
<pre><code>vim /etc/kubernetes/manifests/kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
- --service-node-port-range=1-50000# 进行添加这一行即可
...
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250516231442344-141485870.png" alt="image" loading="lazy"><br>
<strong>修改完之后保存该文件,保存之后Kubernetes 会自动重启 API Server 使配置生效。</strong></p>
<h3 id="验证配置是否生效">验证配置是否生效</h3>
<p>方式一:</p>
<pre><code># 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...
</code></pre>
<p>方式二:</p>
<pre><code># kubectl get pods -n kube-system -l component=kube-apiserver -o jsonpath='{.items.spec.containers.command}'
["kube-apiserver","--service-node-port-range=1-50000","--advertise-address=10.0.0.30",...
</code></pre>
<h3 id="创建service进行测试">创建service进行测试</h3>
<pre><code># 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端口
# kubectl apply -f service-nodeport.yaml
service/tomcat-svc-nodeport created
# 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
</code></pre>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18880778,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18880778
頁:
[1]