在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节点
版本基于下面文章安装
kubeadm 搭建Kubernetes 1.18集群
新闻联播老司机
修改配置文件
[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
访问测试
相关文章:
- Kubernetes 1.14 二进制集群安装
- Kuerbernetes 1.11 集群二进制安装
- Kubenetes 1.13.5 集群二进制安装
- CentOS 7 ETCD集群配置大全