在Kubernetes环境中,Service NodePort模式默认的端口范围为30000-65535随机端口。例如我们的机器可能运行了很多应用,不太希望端口占用率这么大。我们可以给NodePort指定一个范围
环境信息
本次集群版本
安装方式为kubeadm,实际上参数添加方法大同小异,如果有问题可以联系我!
[root@k8s-01 test]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-01 Ready master 181d v1.18.3
k8s-02 Ready master 181d v1.18.3
k8s-03 Ready master 181d v1.18.3
k8s-04 Ready <none> 181d v1.18.3
k8s-05 Ready <none> 181d v1.18.3
这里我的k8s-01 k8s-02 k8s-03为master节点,同时master节点运行Node节点
测试前我们创建的nginx默认指定的端口为30000往上,效果如下
[root@k8s-01 test]# kubectl apply -f test.yaml
deployment.apps/nginx-svc-test created
service/nginx-svc-test created
[root@k8s-01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 181d
nginx-svc-test NodePort 10.111.249.101 <none> 80:32549/TCP 3s
并且我们是无法指定30000以下的端口
[root@k8s-01 test]# kubectl apply -f test.yaml
deployment.apps/nginx-svc-test created
The Service "nginx-svc-test" is invalid: spec.ports[0].nodePort: Invalid value: 20001: provided port is not in the valid range. The range of valid ports is 30000-32767
nginx测试文件
cat >>test.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-svc-test
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:alpine
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc-test
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
EOF
解决办法
接下来我们需要修改三台kube-apiserver节点
版本基于下面文章安装
修改配置文件
[root@k8s-01 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
添加参数
- --service-node-port-range=20000-21998
端口范围根据我们实际上情况修改,不建议端口设置20000以下

为了保证不出问题,我们先修改一台kube-apiserver。启动没有问题在修改其它节点
[root@k8s-01 ~]# kubectl get pod -n kube-system |grep apiserver
kube-apiserver-k8s-01 1/1 Running 0 9s
kube-apiserver-k8s-02 1/1 Running 22 181d
kube-apiserver-k8s-03 1/1 Running 28 181d
#修改完成后kube-apiserver是会自动重启,静态pod是实时生效
修改完成后,集群恢复正常
[root@k8s-01 test]# kubectl get pod -n kube-system |grep api
kube-apiserver-k8s-01 1/1 Running 0 5m11s
kube-apiserver-k8s-02 1/1 Running 0 35s
kube-apiserver-k8s-03 1/1 Running 0 13s
[root@k8s-01 test]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-01 Ready master 181d v1.18.3
k8s-02 Ready master 181d v1.18.3
k8s-03 Ready master 181d v1.18.3
k8s-04 Ready <none> 181d v1.18.3
k8s-05 Ready <none> 181d v1.18.3
接下来我们继续创建nginx
#文件复制上面的nginx测试文件
[root@k8s-01 test]# kubectl apply -f test.yaml
deployment.apps/nginx-svc-test created
service/nginx-svc-test created
[root@k8s-01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 181d
nginx-svc-test NodePort 10.100.43.24 <none> 80:21831/TCP 3s
访问测试
接下来我们手动指定2000-21998中间的端口测试
[root@k8s-01 test]# kubectl delete -f test.yaml #删除原来的文件
deployment.apps "nginx-svc-test" deleted
service "nginx-svc-test" deleted
添加nodePort = 20001

访问测试


您好~我是腾讯云+社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。