Is there way to specify a custom NodePort port in a kubernetes service YAML definition? I need to be able to define the port explicitly in my configuration file.
5 Answers
You can set the type NodePort
in your Service
Deployment. Note that there is a Node Port Range
configured for your API server with the option --service-node-port-range
(by default 30000-32767
). You can also specify a port in that range specifically by setting the nodePort
attribute under the Port
object, or the system will chose a port in that range for you.
So a Service
example with specified NodePort
would look like this:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
name: nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
name: http
- port: 443
nodePort: 30443
name: https
selector:
name: nginx
For more information on NodePort, see this doc. For configuring API Server Node Port range please see this.

- 9,166
- 1
- 33
- 46
-
2Hi, is it a bad practice to specify a fixed nodeport? – ch271828n Oct 26 '20 at 03:06
-
@ch271828n I would say that depends on your architecture. If your scenario is somewhat simple and you use cluster external load balancing and gateways it would not be uncommon to work with fixed nodeports. However, it can get hard to manage with complex deployments and they become a scarce resource/source of conflict. Additionally if your security setup requires cluster internal rules, Nodeports may allow bypassing those and give you additional headaches. – Oswin Noetzelmann Nov 05 '22 at 02:16
-
Thanks for your reply (after 2years) :) – ch271828n Nov 05 '22 at 03:55
You can define static NodePort using nodeport in service.yaml file
spec:
type: NodePort
ports:
- port: 3000
nodePort: 31001
name: http

- 907
- 13
- 22
Yeah you can define all those three port by your own
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- name: posts
protocol: TCP
port: 4000
targetPort: 4000
nodePort: 31515

- 135
- 1
- 5
you can actually run this command to see how you can achieve that in yaml.
kubectl create service hello-svc --tcp=80:80 --type NodePort --node-port 30080 -o yaml --dry-run > hello-svc.yaml
https://pachehra.blogspot.com/2019/11/kubernetes-imperative-commands-with.html

- 822
- 9
- 11
For those who need to use kubectl commands without creating a yaml file, you can create a NodePort service with a specified port:
kubectl create nodeport NAME [--tcp=port:targetPort] [--dry-run=server|client|none]
For example:
kubectl create service nodeport myservice --node-port=31000 --tcp=3000:80
You can check Kubectl reference for more:

- 10,486
- 4
- 39
- 44