File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
77
88## Unreleased
99
10+ ### Added
11+
12+ - ** netbird** : Add ` server.stunService.nodePort ` value to allow specifying a
13+ fixed NodePort number when ` server.stunService.type ` is ` NodePort ` .
14+
1015## [ 0.4.2] — 2026-04-21
1116
1217### Added
Original file line number Diff line number Diff line change @@ -369,6 +369,16 @@ server:
369369 port: 3478
370370` ` `
371371
372+ To pin a specific NodePort instead of letting Kubernetes assign one automatically :
373+
374+ ` ` ` yaml
375+ server:
376+ stunService:
377+ type: NodePort
378+ port: 3478
379+ nodePort: 30478
380+ ` ` `
381+
372382Point DNS at one or more node IPs. Clients will connect on the allocated
373383NodePort (check `kubectl get svc` for the assigned port).
374384
@@ -737,6 +747,7 @@ ADFS) can be tested manually:
737747| `server.service.port` | int | `80` | Server service port |
738748| `server.stunService.type` | string | `"LoadBalancer"` | STUN service type |
739749| `server.stunService.port` | int | `3478` | STUN service port |
750+ | `server.stunService.nodePort` | int | `null` | Fixed NodePort number |
740751| `server.stunService.annotations` | object | `{}` | STUN service annotations |
741752
742753# ### Server Ingress
Original file line number Diff line number Diff line change 1616 port : {{ .Values.server.stunService.port }}
1717 targetPort : stun
1818 protocol : UDP
19+ {{- if and (eq .Values.server.stunService.type "NodePort") (not (kindIs "invalid" .Values.server.stunService.nodePort)) }}
20+ nodePort : {{ .Values.server.stunService.nodePort }}
21+ {{- end }}
1922 selector :
2023 {{- include "netbird.server.selectorLabels" . | nindent 4 }}
2124
Original file line number Diff line number Diff line change @@ -43,6 +43,35 @@ tests:
4343 path : spec.type
4444 value : NodePort
4545
46+ - it : should set nodePort when type is NodePort and nodePort is specified
47+ set :
48+ server.stunService.type : NodePort
49+ server.stunService.nodePort : 30478
50+ asserts :
51+ - contains :
52+ path : spec.ports
53+ content :
54+ name : stun
55+ port : 3478
56+ targetPort : stun
57+ protocol : UDP
58+ nodePort : 30478
59+
60+ - it : should not set nodePort for LoadBalancer type even if nodePort is specified
61+ set :
62+ server.stunService.type : LoadBalancer
63+ server.stunService.nodePort : 30478
64+ asserts :
65+ - isNull :
66+ path : spec.ports[0].nodePort
67+
68+ - it : should not set nodePort for NodePort type when nodePort is not specified
69+ set :
70+ server.stunService.type : NodePort
71+ asserts :
72+ - isNull :
73+ path : spec.ports[0].nodePort
74+
4675 - it : should include selector labels
4776 asserts :
4877 - isSubset :
Original file line number Diff line number Diff line change @@ -421,6 +421,9 @@ server:
421421 stunService :
422422 type : LoadBalancer
423423 port : 3478
424+ # -- Optional nodePort for NodePort service type (valid range: 30000–32767).
425+ # Omit or set to null to let Kubernetes allocate automatically.
426+ nodePort : null
424427 annotations : {}
425428
426429 # -- Ingress for HTTP routes (API + OAuth2).
You can’t perform that action at this time.
0 commit comments