diff --git a/api/v3beta1/emqx_types_spec.go b/api/v3beta1/emqx_types_spec.go
index 24d62f36..70c1081f 100644
--- a/api/v3beta1/emqx_types_spec.go
+++ b/api/v3beta1/emqx_types_spec.go
@@ -200,6 +200,11 @@ type EMQXReplicantTemplateSpec struct {
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
// Specifies how to spread matching pods among the given topology.
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
+ // Specifies the DNS parameters of a pod.
+ // Parameters specified here will be merged to the generated DNS
+ // configuration based on DNSPolicy (always ClusterFirst).
+ // More info: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config
+ DNSConfig *corev1.PodDNSConfig `json:"dnsConfig,omitempty"`
// Desired number of instances.
// In case of core nodes, each instance has a consistent identity.
diff --git a/api/v3beta1/zz_generated.deepcopy.go b/api/v3beta1/zz_generated.deepcopy.go
index ba7b0444..a1e8ed17 100644
--- a/api/v3beta1/zz_generated.deepcopy.go
+++ b/api/v3beta1/zz_generated.deepcopy.go
@@ -246,6 +246,11 @@ func (in *EMQXReplicantTemplateSpec) DeepCopyInto(out *EMQXReplicantTemplateSpec
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.DNSConfig != nil {
+ in, out := &in.DNSConfig, &out.DNSConfig
+ *out = new(v1.PodDNSConfig)
+ (*in).DeepCopyInto(*out)
+ }
if in.Replicas != nil {
in, out := &in.Replicas, &out.Replicas
*out = new(int32)
diff --git a/config/crd/bases/apps.emqx.io_emqxes.yaml b/config/crd/bases/apps.emqx.io_emqxes.yaml
index 6ccf360f..8093a723 100644
--- a/config/crd/bases/apps.emqx.io_emqxes.yaml
+++ b/config/crd/bases/apps.emqx.io_emqxes.yaml
@@ -1270,6 +1270,50 @@ spec:
type: string
type: object
type: object
+ dnsConfig:
+ description: |-
+ Specifies the DNS parameters of a pod.
+ Parameters specified here will be merged to the generated DNS
+ configuration based on DNSPolicy (always ClusterFirst).
+ More info: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config
+ properties:
+ nameservers:
+ description: |-
+ A list of DNS name server IP addresses.
+ This will be appended to the base nameservers generated from DNSPolicy.
+ Duplicated nameservers will be removed.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ options:
+ description: |-
+ A list of DNS resolver options.
+ This will be merged with the base options generated from DNSPolicy.
+ Duplicated entries will be removed. Resolution options given in Options
+ will override those that appear in the base DNSPolicy.
+ items:
+ description: PodDNSConfigOption defines DNS resolver
+ options of a pod.
+ properties:
+ name:
+ description: Required.
+ type: string
+ value:
+ type: string
+ type: object
+ type: array
+ x-kubernetes-list-type: atomic
+ searches:
+ description: |-
+ A list of DNS search domains for host-name lookup.
+ This will be appended to the base search paths generated from DNSPolicy.
+ Duplicated search paths will be removed.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ type: object
env:
description: List of environment variables to set in the container.
items:
@@ -9671,6 +9715,50 @@ spec:
type: string
type: object
type: object
+ dnsConfig:
+ description: |-
+ Specifies the DNS parameters of a pod.
+ Parameters specified here will be merged to the generated DNS
+ configuration based on DNSPolicy (always ClusterFirst).
+ More info: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config
+ properties:
+ nameservers:
+ description: |-
+ A list of DNS name server IP addresses.
+ This will be appended to the base nameservers generated from DNSPolicy.
+ Duplicated nameservers will be removed.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ options:
+ description: |-
+ A list of DNS resolver options.
+ This will be merged with the base options generated from DNSPolicy.
+ Duplicated entries will be removed. Resolution options given in Options
+ will override those that appear in the base DNSPolicy.
+ items:
+ description: PodDNSConfigOption defines DNS resolver
+ options of a pod.
+ properties:
+ name:
+ description: Required.
+ type: string
+ value:
+ type: string
+ type: object
+ type: array
+ x-kubernetes-list-type: atomic
+ searches:
+ description: |-
+ A list of DNS search domains for host-name lookup.
+ This will be appended to the base search paths generated from DNSPolicy.
+ Duplicated search paths will be removed.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ type: object
env:
description: List of environment variables to set in the container.
items:
diff --git a/docs/en_US/reference/v3beta1-reference.md b/docs/en_US/reference/v3beta1-reference.md
index 4bfad6ef..2a847106 100644
--- a/docs/en_US/reference/v3beta1-reference.md
+++ b/docs/en_US/reference/v3beta1-reference.md
@@ -140,6 +140,7 @@ _Appears in:_
| `affinity` _[Affinity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#affinity-v1-core)_ | Affinity for pod assignment
ref: https://kubernetes.io/docs/concepts/config/assign-pod-node/#affinity-and-anti-affinity | | |
| `tolerations` _[Toleration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#toleration-v1-core) array_ | Pod tolerations.
If specified, Pod tolerates any taint that matches the triple using the matching operator. | | |
| `topologySpreadConstraints` _[TopologySpreadConstraint](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#topologyspreadconstraint-v1-core) array_ | Specifies how to spread matching pods among the given topology. | | |
+| `dnsConfig` _[PodDNSConfig](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#poddnsconfig-v1-core)_ | Specifies the DNS parameters of a pod.
Parameters specified here will be merged to the generated DNS
configuration based on DNSPolicy (always ClusterFirst).
More info: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config | | |
| `replicas` _integer_ | Desired number of instances.
In case of core nodes, each instance has a consistent identity. | 2 | Minimum: 0
|
| `minAvailable` _[IntOrString](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#intorstring-intstr-util)_ | An eviction is allowed if at least "minAvailable" pods selected by
"selector" will still be available after the eviction, i.e. even in the
absence of the evicted pod. So for example you can prevent all voluntary
evictions by specifying "100%". | | XIntOrString: \{\}
|
| `maxUnavailable` _[IntOrString](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#intorstring-intstr-util)_ | An eviction is allowed if at most "maxUnavailable" pods selected by
"selector" are unavailable after the eviction, i.e. even in absence of
the evicted pod. For example, one can prevent all voluntary evictions
by specifying 0. This is a mutually exclusive setting with "minAvailable". | | XIntOrString: \{\}
|
@@ -222,6 +223,7 @@ _Appears in:_
| `affinity` _[Affinity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#affinity-v1-core)_ | Affinity for pod assignment
ref: https://kubernetes.io/docs/concepts/config/assign-pod-node/#affinity-and-anti-affinity | | |
| `tolerations` _[Toleration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#toleration-v1-core) array_ | Pod tolerations.
If specified, Pod tolerates any taint that matches the triple using the matching operator. | | |
| `topologySpreadConstraints` _[TopologySpreadConstraint](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#topologyspreadconstraint-v1-core) array_ | Specifies how to spread matching pods among the given topology. | | |
+| `dnsConfig` _[PodDNSConfig](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#poddnsconfig-v1-core)_ | Specifies the DNS parameters of a pod.
Parameters specified here will be merged to the generated DNS
configuration based on DNSPolicy (always ClusterFirst).
More info: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config | | |
| `replicas` _integer_ | Desired number of instances.
In case of core nodes, each instance has a consistent identity. | 2 | Minimum: 0
|
| `minAvailable` _[IntOrString](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#intorstring-intstr-util)_ | An eviction is allowed if at least "minAvailable" pods selected by
"selector" will still be available after the eviction, i.e. even in the
absence of the evicted pod. So for example you can prevent all voluntary
evictions by specifying "100%". | | XIntOrString: \{\}
|
| `maxUnavailable` _[IntOrString](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#intorstring-intstr-util)_ | An eviction is allowed if at most "maxUnavailable" pods selected by
"selector" are unavailable after the eviction, i.e. even in absence of
the evicted pod. For example, one can prevent all voluntary evictions
by specifying 0. This is a mutually exclusive setting with "minAvailable". | | XIntOrString: \{\}
|
diff --git a/internal/controller/add_core_set.go b/internal/controller/add_core_set.go
index c73fc1dc..40b49bf7 100644
--- a/internal/controller/add_core_set.go
+++ b/internal/controller/add_core_set.go
@@ -151,6 +151,7 @@ func generateStatefulSet(instance *crd.EMQX) *appsv1.StatefulSet {
TopologySpreadConstraints: template.Spec.TopologySpreadConstraints,
NodeName: template.Spec.NodeName,
NodeSelector: template.Spec.NodeSelector,
+ DNSConfig: template.Spec.DNSConfig,
InitContainers: template.Spec.InitContainers,
Containers: append([]corev1.Container{
{
diff --git a/internal/controller/add_core_set_test.go b/internal/controller/add_core_set_test.go
index c90c47fc..4eb889e3 100644
--- a/internal/controller/add_core_set_test.go
+++ b/internal/controller/add_core_set_test.go
@@ -160,6 +160,18 @@ func TestGetNewStatefulSet(t *testing.T) {
)
})
+ t.Run("check dnsConfig propagation", func(t *testing.T) {
+ emqx := instance.DeepCopy()
+ emqx.Spec.CoreTemplate.Spec.DNSConfig = &corev1.PodDNSConfig{
+ Nameservers: []string{"1.1.1.1"},
+ Options: []corev1.PodDNSConfigOption{
+ {Name: "ndots", Value: ptr.To("3")},
+ },
+ }
+ got := generateStatefulSet(emqx)
+ assert.Equal(t, emqx.Spec.CoreTemplate.Spec.DNSConfig, got.Spec.Template.Spec.DNSConfig)
+ })
+
t.Run("check default volume claim templates", func(t *testing.T) {
emqx := instance.DeepCopy()
diff --git a/internal/controller/add_replicant_set.go b/internal/controller/add_replicant_set.go
index af047d77..705ccf8e 100644
--- a/internal/controller/add_replicant_set.go
+++ b/internal/controller/add_replicant_set.go
@@ -208,6 +208,7 @@ func generateReplicaSet(instance *crd.EMQX) *appsv1.ReplicaSet {
TopologySpreadConstraints: template.Spec.TopologySpreadConstraints,
NodeName: template.Spec.NodeName,
NodeSelector: template.Spec.NodeSelector,
+ DNSConfig: template.Spec.DNSConfig,
InitContainers: template.Spec.InitContainers,
Containers: append([]corev1.Container{
{
diff --git a/internal/controller/add_replicant_set_test.go b/internal/controller/add_replicant_set_test.go
index c4e9375b..eae05765 100644
--- a/internal/controller/add_replicant_set_test.go
+++ b/internal/controller/add_replicant_set_test.go
@@ -83,6 +83,19 @@ func TestGetNewReplicaSet(t *testing.T) {
}, got.Spec.Selector.MatchLabels)
})
+ t.Run("check dnsConfig propagation", func(t *testing.T) {
+ emqx := instance.DeepCopy()
+ emqx.Spec.ReplicantTemplate.Spec.DNSConfig = &corev1.PodDNSConfig{
+ Nameservers: []string{"1.1.1.1"},
+ Options: []corev1.PodDNSConfigOption{
+ {Name: "ndots", Value: ptr.To("3")},
+ },
+ }
+ conf, _ := config.EMQXConfigWithDefaults(emqx.Spec.Config.Data)
+ got := newReplicaSet(emqx, conf)
+ assert.Equal(t, emqx.Spec.ReplicantTemplate.Spec.DNSConfig, got.Spec.Template.Spec.DNSConfig)
+ })
+
t.Run("check no bootstrap API keys", func(t *testing.T) {
emqx := instance.DeepCopy()
conf, _ := config.EMQXConfigWithDefaults(emqx.Spec.Config.Data)