Skip to content

Commit 3bd8572

Browse files
committed
feat: Support ExternalName Services
Problem: NGF does not support routing to services outside the cluster Solution: Add support for ExternalName type Services
1 parent 9d7d164 commit 3bd8572

35 files changed

+1877
-130
lines changed

apis/v1alpha2/nginxproxy_types.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ type NginxProxySpec struct {
9494
// +kubebuilder:validation:Minimum=1
9595
// +kubebuilder:validation:Maximum=65535
9696
WorkerConnections *int32 `json:"workerConnections,omitempty"`
97+
// DNSResolver specifies the DNS resolver configuration for external name resolution.
98+
// This enables support for routing to ExternalName Services.
99+
//
100+
// +optional
101+
DNSResolver *DNSResolver `json:"dnsResolver,omitempty"`
97102
}
98103

99104
// Telemetry specifies the OpenTelemetry configuration.
@@ -355,6 +360,59 @@ type NginxPlus struct {
355360
AllowedAddresses []NginxPlusAllowAddress `json:"allowedAddresses,omitempty"`
356361
}
357362

363+
// DNSResolver specifies the DNS resolver configuration for NGINX.
364+
// This enables dynamic DNS resolution for ExternalName Services.
365+
// Corresponds to the NGINX resolver directive: https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
366+
type DNSResolver struct {
367+
// Timeout specifies the timeout for name resolution.
368+
// Default: 30s.
369+
//
370+
// +optional
371+
Timeout *v1alpha1.Duration `json:"timeout,omitempty"`
372+
373+
// CacheTTL specifies how long to cache DNS responses.
374+
// Default: 30s.
375+
//
376+
// +optional
377+
CacheTTL *v1alpha1.Duration `json:"cacheTTL,omitempty"`
378+
379+
// IPv6 enables IPv6 lookups.
380+
// Default: true.
381+
//
382+
// +optional
383+
IPv6 *bool `json:"ipv6,omitempty"`
384+
385+
// Addresses specifies the list of DNS server addresses.
386+
// Each address can be an IP address or hostname.
387+
// Example: [{"type": "IPAddress", "value": "8.8.8.8"}, {"type": "Hostname", "value": "dns.google"}]
388+
//
389+
// +kubebuilder:validation:MinItems=1
390+
// +kubebuilder:validation:MaxItems=16
391+
// +listType=set
392+
Addresses []DNSResolverAddress `json:"addresses"`
393+
}
394+
395+
// DNSResolverAddress specifies the address type and value for a DNS resolver address.
396+
type DNSResolverAddress struct {
397+
// Type specifies the type of address.
398+
Type DNSResolverAddressType `json:"type"`
399+
400+
// Value specifies the address value.
401+
Value string `json:"value"`
402+
}
403+
404+
// DNSResolverAddressType specifies the type of DNS resolver address.
405+
// +kubebuilder:validation:Enum=IPAddress;Hostname
406+
type DNSResolverAddressType string
407+
408+
const (
409+
// DNSResolverIPAddressType specifies that the address is an IP address.
410+
DNSResolverIPAddressType DNSResolverAddressType = "IPAddress"
411+
412+
// DNSResolverHostnameType specifies that the address is a hostname.
413+
DNSResolverHostnameType DNSResolverAddressType = "Hostname"
414+
)
415+
358416
// NginxPlusAllowAddress specifies the address type and value for an NginxPlus allow address.
359417
type NginxPlusAllowAddress struct {
360418
// Type specifies the type of address.

apis/v1alpha2/zz_generated.deepcopy.go

Lines changed: 55 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

charts/nginx-gateway-fabric/values.schema.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,59 @@
126126
"required": [],
127127
"type": "boolean"
128128
},
129+
"dnsResolver": {
130+
"description": "DNSResolver specifies the DNS resolver configuration for external name resolution. This enables support for routing to ExternalName Services.",
131+
"properties": {
132+
"addresses": {
133+
"description": "List of DNS server addresses. Each address specifies a type and value.",
134+
"items": {
135+
"properties": {
136+
"type": {
137+
"description": "Type specifies the type of address.",
138+
"enum": [
139+
"IPAddress",
140+
"Hostname"
141+
],
142+
"required": [],
143+
"type": "string"
144+
},
145+
"value": {
146+
"description": "Value specifies the address value.",
147+
"required": [],
148+
"type": "string"
149+
}
150+
},
151+
"required": [
152+
"type",
153+
"value"
154+
],
155+
"type": "object"
156+
},
157+
"minItems": 1,
158+
"required": [],
159+
"type": "array"
160+
},
161+
"cacheTTL": {
162+
"description": "CacheTTL specifies how long to cache DNS responses. Default is 30s.",
163+
"pattern": "^\\d+[smhd]?$",
164+
"required": [],
165+
"type": "string"
166+
},
167+
"ipv6": {
168+
"description": "IPv6 enables IPv6 lookups. Default is true.",
169+
"required": [],
170+
"type": "boolean"
171+
},
172+
"timeout": {
173+
"description": "Timeout specifies the timeout for name resolution. Default is 30s.",
174+
"pattern": "^\\d+[smhd]?$",
175+
"required": [],
176+
"type": "string"
177+
}
178+
},
179+
"required": [],
180+
"type": "object"
181+
},
129182
"ipFamily": {
130183
"description": "IPFamily specifies the IP family to be used by the NGINX.",
131184
"enum": [

charts/nginx-gateway-fabric/values.yaml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,40 @@ nginx:
462462
# minimum: 1
463463
# maximum: 65535
464464
# description: The number of worker connections for NGINX. Default is 1024.
465+
# dnsResolver:
466+
# type: object
467+
# description: DNSResolver specifies the DNS resolver configuration for external name resolution. This enables support for routing to ExternalName Services.
468+
# properties:
469+
# addresses:
470+
# type: array
471+
# description: List of DNS server addresses. Each address specifies a type and value.
472+
# items:
473+
# type: object
474+
# properties:
475+
# type:
476+
# type: string
477+
# enum:
478+
# - IPAddress
479+
# - Hostname
480+
# description: Type specifies the type of address.
481+
# value:
482+
# type: string
483+
# description: Value specifies the address value.
484+
# required:
485+
# - type
486+
# - value
487+
# minItems: 1
488+
# timeout:
489+
# type: string
490+
# description: Timeout specifies the timeout for name resolution. Default is 30s.
491+
# pattern: ^\d+[smhd]?$
492+
# cacheTTL:
493+
# type: string
494+
# description: CacheTTL specifies how long to cache DNS responses. Default is 30s.
495+
# pattern: ^\d+[smhd]?$
496+
# ipv6:
497+
# type: boolean
498+
# description: IPv6 enables IPv6 lookups. Default is true.
465499
# @schema
466500
# -- The configuration for the data plane that is contained in the NginxProxy resource. This is applied globally to all Gateways
467501
# managed by this instance of NGINX Gateway Fabric.

config/crd/bases/gateway.nginx.org_nginxproxies.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,57 @@ spec:
6565
introduces security risks as described in Gateway API GEP-3567.
6666
If not specified, defaults to false (validation enabled).
6767
type: boolean
68+
dnsResolver:
69+
description: |-
70+
DNSResolver specifies the DNS resolver configuration for external name resolution.
71+
This enables support for routing to ExternalName Services.
72+
properties:
73+
addresses:
74+
description: |-
75+
Addresses specifies the list of DNS server addresses.
76+
Each address can be an IP address or hostname.
77+
Example: [{"type": "IPAddress", "value": "8.8.8.8"}, {"type": "Hostname", "value": "dns.google"}]
78+
items:
79+
description: DNSResolverAddress specifies the address type and
80+
value for a DNS resolver address.
81+
properties:
82+
type:
83+
description: Type specifies the type of address.
84+
enum:
85+
- IPAddress
86+
- Hostname
87+
type: string
88+
value:
89+
description: Value specifies the address value.
90+
type: string
91+
required:
92+
- type
93+
- value
94+
type: object
95+
maxItems: 16
96+
minItems: 1
97+
type: array
98+
x-kubernetes-list-type: set
99+
cacheTTL:
100+
description: |-
101+
CacheTTL specifies how long to cache DNS responses.
102+
Default: 30s.
103+
pattern: ^[0-9]{1,4}(ms|s|m|h)?$
104+
type: string
105+
ipv6:
106+
description: |-
107+
IPv6 enables IPv6 lookups.
108+
Default: true.
109+
type: boolean
110+
timeout:
111+
description: |-
112+
Timeout specifies the timeout for name resolution.
113+
Default: 30s.
114+
pattern: ^[0-9]{1,4}(ms|s|m|h)?$
115+
type: string
116+
required:
117+
- addresses
118+
type: object
68119
ipFamily:
69120
default: dual
70121
description: |-

deploy/crds.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,57 @@ spec:
650650
introduces security risks as described in Gateway API GEP-3567.
651651
If not specified, defaults to false (validation enabled).
652652
type: boolean
653+
dnsResolver:
654+
description: |-
655+
DNSResolver specifies the DNS resolver configuration for external name resolution.
656+
This enables support for routing to ExternalName Services.
657+
properties:
658+
addresses:
659+
description: |-
660+
Addresses specifies the list of DNS server addresses.
661+
Each address can be an IP address or hostname.
662+
Example: [{"type": "IPAddress", "value": "8.8.8.8"}, {"type": "Hostname", "value": "dns.google"}]
663+
items:
664+
description: DNSResolverAddress specifies the address type and
665+
value for a DNS resolver address.
666+
properties:
667+
type:
668+
description: Type specifies the type of address.
669+
enum:
670+
- IPAddress
671+
- Hostname
672+
type: string
673+
value:
674+
description: Value specifies the address value.
675+
type: string
676+
required:
677+
- type
678+
- value
679+
type: object
680+
maxItems: 16
681+
minItems: 1
682+
type: array
683+
x-kubernetes-list-type: set
684+
cacheTTL:
685+
description: |-
686+
CacheTTL specifies how long to cache DNS responses.
687+
Default: 30s.
688+
pattern: ^[0-9]{1,4}(ms|s|m|h)?$
689+
type: string
690+
ipv6:
691+
description: |-
692+
IPv6 enables IPv6 lookups.
693+
Default: true.
694+
type: boolean
695+
timeout:
696+
description: |-
697+
Timeout specifies the timeout for name resolution.
698+
Default: 30s.
699+
pattern: ^[0-9]{1,4}(ms|s|m|h)?$
700+
type: string
701+
required:
702+
- addresses
703+
type: object
653704
ipFamily:
654705
default: dual
655706
description: |-

0 commit comments

Comments
 (0)