Repository: k8gb-io/k8gb

Issue:
dnsZones block unintentionally introduced a breaking change
#1845 introduced the possibility to configure multiple DNS zones.
The helm chart was extended with the key `dnsZones:`, and the old `dnsZone`/`edgeDNSZone` were kept for backwards compatibility. However, the old configuration no longer works since `dnsZones` is used in the default `values.yaml` and `values.schema.json` makes sure only one of them is set.

### How to reproduce
Create an additional values file, `values-abaguas.yaml`:
```
k8gb:
  dnsZone: "cloud.abaguas.com"
  edgeDNSZone: "abaguas.com"
```

Generate the manifests using:
```
hem package -u . > /dev/null && helm template k8gb k8gb-v0.14.0.tgz --include-crds -f values.yaml -f values-abaguas.yaml > manifests.yaml
```
This results in an error:
```
Error: values don't meet the specifications of the schema(s) in the following chart(s):
k8gb:
- k8gb: Must validate one and only one schema (oneOf)
```

### Fix suggestions
k8gb is on major version `0`, so it is okay to introduce a breaking change and remove completely the old option, thus forcing all users to migrate.

Alternatively, a simple fix is to enable only the old configuration options in the default `values.yaml`

Discussion:

Solution patch:
diff --git a/chart/k8gb/templates/_helpers.tpl b/chart/k8gb/templates/_helpers.tpl
index 47a783e9..9d671e4c 100644
--- a/chart/k8gb/templates/_helpers.tpl
+++ b/chart/k8gb/templates/_helpers.tpl
@@ -93,13 +93,9 @@ k8gb-{{ index (split ":" (index (split ";" (include "k8gb.dnsZonesString" .)) "_
 {{- $entries := list -}}
 {{- range .Values.k8gb.dnsZones }}
   {{- $dnsZoneNegTTL := toString (.dnsZoneNegTTL | default "300") }}
-  {{- $entry := printf "%s:%s:%s" .zone .domain $dnsZoneNegTTL }}
+  {{- $entry := printf "%s:%s:%s" .parentZone .loadBalancedZone $dnsZoneNegTTL }}
   {{- $entries = append $entries $entry }}
 {{- end }}
-{{- if and (or (not .Values.k8gb.dnsZones) (eq (len .Values.k8gb.dnsZones) 0)) .Values.k8gb.dnsZone .Values.k8gb.edgeDNSZone }}
-  {{- $extraEntry := printf "%s:%s:%s" .Values.k8gb.edgeDNSZone .Values.k8gb.dnsZone "300" }}
-  {{- $entries = append $entries $extraEntry }}
-{{- end }}
 {{- join ";" $entries }}
 {{- end }}
 
diff --git a/chart/k8gb/templates/_validators.tpl b/chart/k8gb/templates/_validators.tpl
index 227b5885..d9def048 100644
--- a/chart/k8gb/templates/_validators.tpl
+++ b/chart/k8gb/templates/_validators.tpl
@@ -12,31 +12,28 @@
 {{- end -}}
 {{- end -}}
 
-# Validates that the zones in k8gb.edgeDNSZone/k8gb.dnsZones match the zones in extdns.domainFilters
+# Validates that the zones in k8gb.dnsZones match the zones in extdns.domainFilters
 {{- define "validateDnsZones" -}}
-{{- $k8gbZones := list -}}
+{{- $parentZones := list -}}
 {{- range .Values.k8gb.dnsZones -}}
-  {{- $k8gbZones = append $k8gbZones .zone -}}
+  {{- $parentZones = append $parentZones .parentZone -}}
 {{- end -}}
-{{- if and (or (not .Values.k8gb.dnsZones) (eq (len .Values.k8gb.dnsZones) 0)) .Values.k8gb.dnsZone .Values.k8gb.edgeDNSZone }}
-  {{- $k8gbZones = append $k8gbZones .Values.k8gb.edgeDNSZone -}}
-{{- end }}
 
 {{- $extdnsZones := .Values.extdns.domainFilters -}}
 
-{{- if ne (len $k8gbZones) (len $extdnsZones) -}}
-  {{- fail (printf "Validation failed: Number of zones in k8gb.edgeDNSZone/k8gb.dnsZones (%d) does not match number of domains in extdns.domainFilters (%d)" (len $k8gbZones) (len $extdnsZones)) -}}
+{{- if ne (len $parentZones) (len $extdnsZones) -}}
+  {{- fail (printf "Validation failed: Number of zones in k8gb.dnsZones (%d) does not match number of domains in extdns.domainFilters (%d)" (len $parentZones) (len $extdnsZones)) -}}
 {{- end -}}
 
-{{- range $k8gbZone := $k8gbZones -}}
-  {{- if not (has $k8gbZone $extdnsZones) -}}
-    {{- fail (printf "Validation failed: Zone '%s' from k8gb.edgeDNSZone/k8gb.dnsZones is not present in extdns.domainFilters" $k8gbZone) -}}
+{{- range $parentZone := $parentZones -}}
+  {{- if not (has $parentZone $extdnsZones) -}}
+    {{- fail (printf "Validation failed: Zone '%s' from k8gb.dnsZones is not present in extdns.domainFilters" $parentZone) -}}
   {{- end -}}
 {{- end -}}
 
 {{- range $extdnsZone := $extdnsZones -}}
-  {{- if not (has $extdnsZone $k8gbZones) -}}
-    {{- fail (printf "Validation failed: Domain '%s' from extdns.domainFilters is not present in k8gb.edgeDNSZone/k8gb.dnsZones" $extdnsZone) -}}
+  {{- if not (has $extdnsZone $parentZones) -}}
+    {{- fail (printf "Validation failed: Domain '%s' from extdns.domainFilters is not present in k8gb.dnsZones" $extdnsZone) -}}
   {{- end -}}
 {{- end -}}
 
diff --git a/chart/k8gb/templates/coredns/cm.yaml b/chart/k8gb/templates/coredns/cm.yaml
index 00165614..c8e19c2a 100644
--- a/chart/k8gb/templates/coredns/cm.yaml
+++ b/chart/k8gb/templates/coredns/cm.yaml
@@ -12,9 +12,9 @@ data:
 {{- $dnsZones := split ";" $dnsZonesRaw }}
 {{- range $dnsZones }}
     {{- $parts := split ":" . }}
-    {{- $domain := index $parts "_1" }}
+    {{- $loadBalancedZone := index $parts "_1" }}
     {{- $dnsZoneNegTTL := index $parts "_2" }}
-    {{ $domain }}:5353 {
+    {{ $loadBalancedZone }}:5353 {
         errors
         health
 {{- if $.Values.k8gb.coredns.extra_plugins }}
diff --git a/chart/k8gb/templates/external-dns/external-dns.yaml b/chart/k8gb/templates/external-dns/external-dns.yaml
index d1d4c006..64f29dbf 100644
--- a/chart/k8gb/templates/external-dns/external-dns.yaml
+++ b/chart/k8gb/templates/external-dns/external-dns.yaml
@@ -26,8 +26,8 @@ spec:
 {{- $dnsZones := split ";" $dnsZonesRaw }}
 {{- range $dnsZones }}
         {{- $parts := split ":" . }}
-        {{- $zone := index $parts "_0" }}
-        - --domain-filter={{ $zone }} # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
+        {{- $parentZone := index $parts "_0" }}
+        - --domain-filter={{ $parentZone }} # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
 {{- end }}
         - --policy=sync # enable full synchronization including record removal
         - --log-level=debug # debug only
diff --git a/chart/k8gb/values-extdns.yaml b/chart/k8gb/values-extdns.yaml
index ca0bdaca..eb27f7a4 100644
--- a/chart/k8gb/values-extdns.yaml
+++ b/chart/k8gb/values-extdns.yaml
@@ -2,8 +2,8 @@ k8gb:
   clusterGeoTag: "us"
   extGslbClustersGeoTags: "eu"
   dnsZones:
-    - zone: "k8gb.io"
-      domain: "cloud.k8gb.io"
+    - parentZone: "k8gb.io"
+      loadBalancedZone: "cloud.k8gb.io"
       dnsZoneNegTTL: 30
 
 extdns:
diff --git a/chart/k8gb/values.schema.json b/chart/k8gb/values.schema.json
index 97d45f7a..5292fbf4 100644
--- a/chart/k8gb/values.schema.json
+++ b/chart/k8gb/values.schema.json
@@ -277,18 +277,6 @@
                         "$ref": "#/definitions/k8gbDnsZone"
                     }
                 },
-                "dnsZone": {
-                    "format": "idn-hostname",
-                    "minLength": 1
-                },
-                "dnsZoneNegTTL": {
-                    "type": "integer",
-                    "minimum": 0
-                },
-                "edgeDNSZone": {
-                    "format": "idn-hostname",
-                    "minLength": 1
-                },
                 "edgeDNSServers": {
                     "type": "array",
                     "items": {
@@ -345,24 +333,11 @@
                     "type": "object"
                 }
             },
-            "oneOf": [
-                {
-                    "required": [
-                        "clusterGeoTag",
-                        "extGslbClustersGeoTags",
-                        "edgeDNSServers",
-                        "dnsZone",
-                        "edgeDNSZone"
-                    ]
-                },
-                {
-                    "required": [
-                        "clusterGeoTag",
-                        "extGslbClustersGeoTags",
-                        "edgeDNSServers",
-                        "dnsZones"
-                    ]
-                }
+            "required": [
+                "clusterGeoTag",
+                "extGslbClustersGeoTags",
+                "edgeDNSServers",
+                "dnsZones"
             ],
             "title": "k8gb"
         },
@@ -447,11 +422,11 @@
         "k8gbDnsZone": {
             "type": "object",
             "properties": {
-                "zone": {
+                "loadBalancedZone": {
                     "type": "string",
                     "format": "idn-hostname"
                 },
-                "domain": {
+                "parentZone": {
                     "type": "string",
                     "format": "idn-hostname"
                 },
@@ -462,8 +437,8 @@
                 }
             },
             "required": [
-                "zone",
-                "domain"
+                "loadBalancedZone",
+                "parentZone"
             ]
         },
         "Ns1": {
diff --git a/chart/k8gb/values.yaml b/chart/k8gb/values.yaml
index 32e7b73e..a8cf85bf 100644
--- a/chart/k8gb/values.yaml
+++ b/chart/k8gb/values.yaml
@@ -16,18 +16,11 @@ k8gb:
   # DNSZones - For backward compatibility, the dnsZone and edgeDNSZone fields are allowed; otherwise,
   # the dnsZones array is used. For valid values, use either dnsZone and edgeDNSZone or dnsZones.
   #
-  # -- dnsZone: deprecated
-  # dnsZone: "cloud.example.com"
-  # -- edgeDNSZone: deprecated
-  # edgeDNSZone: "example.com"
-  # -- array of dns zones controlled by gslb§
+  # -- array of dns zones controlled by gslb
   dnsZones:
-    - zone: "example.com" # -- main zone which would contain gslb zone to delegate (same meaning as to edgeDNSZone)
-      domain: "cloud.example.com" # -- domain controlled by gslb (same meaning as to dnsZone)
+    - parentZone: "example.com" # -- parent zone which would contain gslb zone to delegate (same meaning as the old edgeDNSZone)
+      loadBalancedZone: "cloud.example.com" # -- zone controlled by gslb (same meaning as the old dnsZone)
       dnsZoneNegTTL: 30  # -- Negative TTL for SOA record# -- host/ip[:port] format is supported here where port defaults to 53
-#    - zone: "example.org" # -- main zone which would contain gslb zone to delegate (same meaning as to edgeDNSZone)
-#      domain: "cloud.example.org" # -- domain controlled by gslb (same meaning as to dnsZone)
-#      dnsZoneNegTTL: 50  # -- Negative TTL for SOA record# -- host/ip[:port] format is supported here where port defaults to 53
   edgeDNSServers:
     # -- use this DNS server as a main resolver to enable cross k8gb DNS based communication
     - "1.1.1.1"
diff --git a/controllers/depresolver/depresolver.go b/controllers/depresolver/depresolver.go
index d0e4a830..a528bbe7 100644
--- a/controllers/depresolver/depresolver.go
+++ b/controllers/depresolver/depresolver.go
@@ -128,11 +128,11 @@ type Config struct {
 	extClustersGeoTags []string `env:"EXT_GSLB_CLUSTERS_GEO_TAGS, default=[]"`
 	// EdgeDNSType is READONLY and is set automatically by configuration
 	EdgeDNSType EdgeDNSType
-	// EdgeDNSServers
-	EdgeDNSServers utils.DNSList
-	// to avoid breaking changes is used as fallback server for EdgeDNSServers
+	// ParentZoneDNSServers
+	ParentZoneDNSServers utils.DNSList
+	// to avoid breaking changes is used as fallback server for ParentZoneDNSServers
 	fallbackEdgeDNSServerName string `env:"EDGE_DNS_SERVER"`
-	// to avoid breaking changes is used as fallback server port for EdgeDNSServers
+	// to avoid breaking changes is used as fallback server port for ParentZoneDNSServers
 	fallbackEdgeDNSServerPort int `env:"EDGE_DNS_SERVER_PORT, default=53"`
 	// DelegationZones
 	DelegationZones DelegationZones
diff --git a/controllers/depresolver/depresolver_config.go b/controllers/depresolver/depresolver_config.go
index aa2be9a4..3a8f9bab 100644
--- a/controllers/depresolver/depresolver_config.go
+++ b/controllers/depresolver/depresolver_config.go
@@ -43,7 +43,7 @@ const (
 	CoreDNSServiceTypeKey      = "COREDNS_SERVICE_TYPE"
 	ExtClustersGeoTagsKey      = "EXT_GSLB_CLUSTERS_GEO_TAGS"
 	ExtDNSEnabledKey           = "EXTDNS_ENABLED"
-	EdgeDNSServersKey          = "EDGE_DNS_SERVERS"
+	ParentZoneDNSServersKey    = "EDGE_DNS_SERVERS"
 	DNSZonesKey                = "DNS_ZONES"
 	InfobloxGridHostKey        = "INFOBLOX_GRID_HOST"
 	InfobloxVersionKey         = "INFOBLOX_WAPI_VERSION"
@@ -95,8 +95,8 @@ func (dr *DependencyResolver) ResolveOperatorConfig() (*Config, error) {
 
 		// calculation
 		fallbackDNS := fmt.Sprintf("%s:%v", dr.config.fallbackEdgeDNSServerName, dr.config.fallbackEdgeDNSServerPort)
-		edgeDNSServerList := env.GetEnvAsArrayOfStringsOrFallback(EdgeDNSServersKey, []string{fallbackDNS})
-		dr.config.EdgeDNSServers = parseEdgeDNSServers(edgeDNSServerList)
+		edgeDNSServerList := env.GetEnvAsArrayOfStringsOrFallback(ParentZoneDNSServersKey, []string{fallbackDNS})
+		dr.config.ParentZoneDNSServers = parseParentZoneDNSServers(edgeDNSServerList)
 		dr.config.extClustersGeoTags = excludeGeoTag(dr.config.extClustersGeoTags, dr.config.ClusterGeoTag)
 		dr.config.Log.Level, _ = zerolog.ParseLevel(strings.ToLower(dr.config.Log.level))
 		dr.config.Log.Format = parseLogOutputFormat(strings.ToLower(dr.config.Log.format))
@@ -151,11 +151,11 @@ func (dr *DependencyResolver) validateConfig(config *Config, recognizedDNSTypes
 			return err
 		}
 	}
-	err = field(EdgeDNSServersKey, os.Getenv(EdgeDNSServersKey)).isNotEmpty().matchRegexp(hostNamesWithPortsRegex1).err
+	err = field(ParentZoneDNSServersKey, os.Getenv(ParentZoneDNSServersKey)).isNotEmpty().matchRegexp(hostNamesWithPortsRegex1).err
 	if err != nil {
 		return err
 	}
-	err = field(EdgeDNSServersKey, os.Getenv(EdgeDNSServersKey)).isNotEmpty().matchRegexp(hostNamesWithPortsRegex2).err
+	err = field(ParentZoneDNSServersKey, os.Getenv(ParentZoneDNSServersKey)).isNotEmpty().matchRegexp(hostNamesWithPortsRegex2).err
 	if err != nil {
 		return err
 	}
@@ -163,11 +163,11 @@ func (dr *DependencyResolver) validateConfig(config *Config, recognizedDNSTypes
 	if err != nil {
 		return err
 	}
-	err = field(EdgeDNSServersKey, config.EdgeDNSServers).isNotEmpty().matchRegexp(hostNamesWithPortsRegex1).err
+	err = field(ParentZoneDNSServersKey, config.ParentZoneDNSServers).isNotEmpty().matchRegexp(hostNamesWithPortsRegex1).err
 	if err != nil {
 		return err
 	}
-	for _, s := range config.EdgeDNSServers {
+	for _, s := range config.ParentZoneDNSServers {
 		if s.Port < 1 || s.Port > 65535 {
 			return fmt.Errorf("error for port of edge dns server(%v): it must be a positive integer between 1 and 65535", s)
 		}
@@ -205,8 +205,8 @@ func validateLocalhostNotAmongDNSServers(config *Config) error {
 		}
 		return false
 	}
-	if len(config.EdgeDNSServers) > 1 && containsLocalhost(config.EdgeDNSServers) {
-		return fmt.Errorf("invalid %s: the list can't contain 'localhost' or '127.0.0.1' on other than the first position", EdgeDNSServersKey)
+	if len(config.ParentZoneDNSServers) > 1 && containsLocalhost(config.ParentZoneDNSServers) {
+		return fmt.Errorf("invalid %s: the list can't contain 'localhost' or '127.0.0.1' on other than the first position", ParentZoneDNSServersKey)
 	}
 	return nil
 }
@@ -252,11 +252,11 @@ func (dr *DependencyResolver) GetDeprecations() (deprecations []string) {
 
 	var deprecated = map[oldVar]newVar{
 		EdgeDNSServerKey: newVar{
-			Name: EdgeDNSServersKey,
+			Name: ParentZoneDNSServersKey,
 			Msg:  "Pass the hostname or IP address as comma-separated list",
 		},
 		EdgeDNSServerPortKey: newVar{
-			Name: EdgeDNSServersKey,
+			Name: ParentZoneDNSServersKey,
 			Msg: "Port is an optional item in the comma-separated list of dns edge servers, in following form: dns1:53,dns2 (if not provided after the " +
 				"hostname and colon, it defaults to '53')",
 		},
@@ -281,7 +281,7 @@ func parseMetricsAddr(metricsAddr string) (host string, port int, err error) {
 	return
 }
 
-func parseEdgeDNSServers(serverList []string) (r []utils.DNSServer) {
+func parseParentZoneDNSServers(serverList []string) (r []utils.DNSServer) {
 	r = []utils.DNSServer{}
 	var host, portStr string
 	var err error
diff --git a/controllers/depresolver/depresolver_domaininfo.go b/controllers/depresolver/depresolver_domaininfo.go
index 53cd2da3..25798038 100644
--- a/controllers/depresolver/depresolver_domaininfo.go
+++ b/controllers/depresolver/depresolver_domaininfo.go
@@ -29,8 +29,8 @@ import (
 type DelegationZones []*DelegationZoneInfo
 
 type DelegationZoneInfo struct {
-	Domain            string // cloud.example.com
-	Zone              string // example.com
+	LoadBalancedZone  string // cloud.example.com
+	ParentZone        string // example.com
 	NegativeTTL       int
 	ClusterNSName     string
 	ExtClusterNSNames map[string]string
@@ -39,18 +39,18 @@ type DelegationZoneInfo struct {
 
 func parseDelegationZones(config *Config) ([]*DelegationZoneInfo, error) {
 	type info struct {
-		domain string
-		zone   string
-		negTTL string
+		loadBalancedZone string
+		parentZone       string
+		negTTL           string
 	}
 
 	zones := config.dnsZones
 
-	getNsName := func(tag, zone, edge string) string {
+	getNsName := func(tag, zone, parentZone string) string {
 		const prefix = "gslb-ns"
-		d := strings.TrimSuffix(zone, "."+edge)
+		d := strings.TrimSuffix(zone, "."+parentZone)
 		domainX := strings.ReplaceAll(d, ".", "-")
-		return fmt.Sprintf("%s-%s-%s.%s", prefix, tag, domainX, edge)
+		return fmt.Sprintf("%s-%s-%s.%s", prefix, tag, domainX, parentZone)
 	}
 
 	validateRFC1035 := func(zoneInfo *DelegationZoneInfo) error {
@@ -79,7 +79,12 @@ func parseDelegationZones(config *Config) ([]*DelegationZoneInfo, error) {
 			if len(touple) != 3 {
 				return tuples, fmt.Errorf("invalid format of delegation zones: %s", z)
 			}
-			tuples = append(tuples, info{zone: strings.Trim(touple[0], " "), domain: strings.Trim(touple[1], " "), negTTL: strings.Trim(touple[2], " ")})
+			tuples = append(tuples,
+				info{
+					parentZone:       strings.Trim(touple[0], " "),
+					loadBalancedZone: strings.Trim(touple[1], " "),
+					negTTL:           strings.Trim(touple[2], " "),
+				})
 		}
 		return tuples, nil
 	}
@@ -96,17 +101,17 @@ func parseDelegationZones(config *Config) ([]*DelegationZoneInfo, error) {
 			return dzi, fmt.Errorf("invalid value of delegation zones: %s", zones)
 		}
 		zoneInfo := &DelegationZoneInfo{
-			Domain:        inf.domain,
-			Zone:          inf.zone,
-			NegativeTTL:   negTTL,
-			ClusterNSName: getNsName(config.ClusterGeoTag, inf.domain, inf.zone),
+			LoadBalancedZone: inf.loadBalancedZone,
+			ParentZone:       inf.parentZone,
+			NegativeTTL:      negTTL,
+			ClusterNSName:    getNsName(config.ClusterGeoTag, inf.loadBalancedZone, inf.parentZone),
 			ExtClusterNSNames: func(zone, edge string) map[string]string {
 				m := map[string]string{}
 				for _, tag := range config.extClustersGeoTags {
 					m[tag] = getNsName(tag, zone, edge)
 				}
 				return m
-			}(inf.domain, inf.zone),
+			}(inf.loadBalancedZone, inf.parentZone),
 		}
 		dzi = append(dzi, zoneInfo)
 	}
@@ -132,7 +137,7 @@ func (z *DelegationZoneInfo) GetNSServerList() []string {
 
 // GetExternalDNSEndpointName returns name of endpoint sitting in k8gb namespace
 func (z *DelegationZoneInfo) GetExternalDNSEndpointName() string {
-	var suffix = strings.Trim(strings.ReplaceAll(z.Domain, ".", "-"), " ")
+	var suffix = strings.Trim(strings.ReplaceAll(z.LoadBalancedZone, ".", "-"), " ")
 	return fmt.Sprintf("k8gb-ns-extdns-%s", suffix)
 }
 
@@ -167,14 +172,14 @@ func (d *DelegationZones) ContainsZone(host string) bool {
 func (d *DelegationZones) ListZones() []string {
 	var zones []string
 	for _, z := range *d {
-		zones = append(zones, z.Zone)
+		zones = append(zones, z.LoadBalancedZone)
 	}
 	return zones
 }
 
 func (d *DelegationZones) getZone(host string) *DelegationZoneInfo {
 	for _, z := range *d {
-		if strings.Contains(host, z.Zone) {
+		if strings.Contains(host, z.LoadBalancedZone) {
 			return z
 		}
 	}
diff --git a/controllers/gslb_controller_reconciliation.go b/controllers/gslb_controller_reconciliation.go
index 1be4927b..075ca3b5 100644
--- a/controllers/gslb_controller_reconciliation.go
+++ b/controllers/gslb_controller_reconciliation.go
@@ -135,7 +135,7 @@ func (r *GslbReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
 	}
 	gslb.Status.Servers = servers
 
-	loadBalancerExposedIPs, err := refResolver.GetGslbExposedIPs(gslb.Annotations, r.Config.EdgeDNSServers)
+	loadBalancerExposedIPs, err := refResolver.GetGslbExposedIPs(gslb.Annotations, r.Config.ParentZoneDNSServers)
 	if err != nil {
 		m.IncrementError(gslb)
 		return result.RequeueError(fmt.Errorf("getting load balancer exposed IPs (%s)", err))
diff --git a/controllers/providers/assistant/corednssvc.go b/controllers/providers/assistant/corednssvc.go
index f3e39ffd..50653c14 100644
--- a/controllers/providers/assistant/corednssvc.go
+++ b/controllers/providers/assistant/corednssvc.go
@@ -83,7 +83,7 @@ func (r *CoreDNSService) GetExposedIPs() ([]string, *corev1.Service, error) {
 	}
 	var ipList []string
 	for _, ingressStatusIP := range coreDNSService.Status.LoadBalancer.Ingress {
-		var confirmedIPs, err = extractIPFromLB(ingressStatusIP, r.config.EdgeDNSServers)
+		var confirmedIPs, err = extractIPFromLB(ingressStatusIP, r.config.ParentZoneDNSServers)
 		if err != nil {
 			return nil, nil, err
 		}
diff --git a/controllers/providers/dns/external.go b/controllers/providers/dns/external.go
index c9adc43a..dc44b83a 100644
--- a/controllers/providers/dns/external.go
+++ b/controllers/providers/dns/external.go
@@ -66,7 +66,7 @@ func (p *ExternalDNSProvider) CreateZoneDelegation(zoneInfo *depresolver.Delegat
 }
 
 func (p *ExternalDNSProvider) Finalize(zoneInfo *depresolver.DelegationZoneInfo) error {
-	log.Info().Msgf("Domain %s will be deleted by removing delegation DNSEndpoint %s", zoneInfo.Domain, zoneInfo.GetExternalDNSEndpointName())
+	log.Info().Msgf("Domain %s will be deleted by removing delegation DNSEndpoint %s", zoneInfo.LoadBalancedZone, zoneInfo.GetExternalDNSEndpointName())
 	return nil
 }
 
diff --git a/controllers/providers/dns/infoblox.go b/controllers/providers/dns/infoblox.go
index 66f65223..7dc0957c 100644
--- a/controllers/providers/dns/infoblox.go
+++ b/controllers/providers/dns/infoblox.go
@@ -61,7 +61,7 @@ func (p *InfobloxProvider) CreateZoneDelegation(zoneInfo *depresolver.Delegation
 	if err != nil {
 		return err
 	}
-	findZone, err := p.getZoneDelegated(objMgr, zoneInfo.Domain)
+	findZone, err := p.getZoneDelegated(objMgr, zoneInfo.LoadBalancedZone)
 	if err != nil {
 		return err
 	}
@@ -74,12 +74,12 @@ func (p *InfobloxProvider) CreateZoneDelegation(zoneInfo *depresolver.Delegation
 
 	if findZone == nil {
 		log.Info().
-			Str("DNSZone", zoneInfo.Domain).
+			Str("DNSZone", zoneInfo.LoadBalancedZone).
 			Msg("Creating delegated zone")
 		log.Debug().
 			Interface("records", delegateTo).
 			Msg("Delegated records")
-		_, err = p.createZoneDelegated(objMgr, zoneInfo.Domain, delegateTo)
+		_, err = p.createZoneDelegated(objMgr, zoneInfo.LoadBalancedZone, delegateTo)
 		if err != nil {
 			return err
 		}
@@ -95,7 +95,7 @@ func (p *InfobloxProvider) CreateZoneDelegation(zoneInfo *depresolver.Delegation
 				Interface("records", findZone.DelegateTo).
 				Msg("Found delegated zone records")
 			log.Info().
-				Str("DNSZone", zoneInfo.Domain).
+				Str("DNSZone", zoneInfo.LoadBalancedZone).
 				Interface("serverList", currentList).
 				Msg("Updating delegated zone with the server list")
 			_, err = p.updateZoneDelegated(objMgr, findZone.Ref, currentList)
@@ -108,7 +108,7 @@ func (p *InfobloxProvider) CreateZoneDelegation(zoneInfo *depresolver.Delegation
 }
 
 func (p *InfobloxProvider) Finalize(zoneInfo *depresolver.DelegationZoneInfo) error {
-	log.Info().Msgf("Domain %s must deleted by manually in Infoblox", zoneInfo.Domain)
+	log.Info().Msgf("Zone %s must deleted by manually in Infoblox", zoneInfo.LoadBalancedZone)
 	return nil
 }
 
diff --git a/controllers/providers/k8gbendpoint/applicationDNSEndpoint.go b/controllers/providers/k8gbendpoint/applicationDNSEndpoint.go
index 015c70e5..d0a8b93b 100644
--- a/controllers/providers/k8gbendpoint/applicationDNSEndpoint.go
+++ b/controllers/providers/k8gbendpoint/applicationDNSEndpoint.go
@@ -192,18 +192,18 @@ func (d *ApplicationDNSEndpoint) GetExternalTargets(host string) (targets Target
 		d.logger.Info().
 			Str("cluster", cluster).
 			Msg("Adding external Gslb targets from cluster")
-		glueA, err := d.queryService.Query(cluster, d.config.EdgeDNSServers)
+		glueA, err := d.queryService.Query(cluster, d.config.ParentZoneDNSServers)
 		if err != nil {
 			d.logger.Warn().
 				Str("fqdn", cluster+".").
-				Str("nameservers", d.config.EdgeDNSServers.String()).
+				Str("nameservers", d.config.ParentZoneDNSServers.String()).
 				Err(err).
 				Msg("can't lookup GlueA record")
 			continue
 		}
 		d.logger.Info().
 			Str("nameserver", cluster).
-			Str("edgeDNSServers", d.config.EdgeDNSServers.String()).
+			Str("edgeDNSServers", d.config.ParentZoneDNSServers.String()).
 			Interface("glueARecord", glueA.Answer).
 			Msg("Resolved glue A record for NS")
 		glueARecords := d.queryService.ExtractARecords(glueA)
@@ -213,7 +213,7 @@ func (d *ApplicationDNSEndpoint) GetExternalTargets(host string) (targets Target
 		} else {
 			hostToUse = cluster
 		}
-		nameServersToUse := getNSCombinations(d.config.EdgeDNSServers, hostToUse)
+		nameServersToUse := getNSCombinations(d.config.ParentZoneDNSServers, hostToUse)
 		lHost := fmt.Sprintf("localtargets-%s", host)
 		a, err := d.queryService.Query(lHost, nameServersToUse)
 		if err != nil {
diff --git a/controllers/providers/k8gbendpoint/delegationDNSEndpoint.go b/controllers/providers/k8gbendpoint/delegationDNSEndpoint.go
index 2cb3123c..b1712350 100644
--- a/controllers/providers/k8gbendpoint/delegationDNSEndpoint.go
+++ b/controllers/providers/k8gbendpoint/delegationDNSEndpoint.go
@@ -78,7 +78,7 @@ func (d *DelegationDNSEndpoint) GetDNSEndpoint() (*externaldns.DNSEndpoint, erro
 		Spec: externaldns.DNSEndpointSpec{
 			Endpoints: []*externaldns.Endpoint{
 				{
-					DNSName:    d.info.Domain,
+					DNSName:    d.info.LoadBalancedZone,
 					RecordTTL:  ttl,
 					RecordType: "NS",
 					Targets:    d.info.GetNSServerList(),
diff --git a/controllers/refresolver/ingress/ingress.go b/controllers/refresolver/ingress/ingress.go
index c7edcc0f..dd3bdc50 100644
--- a/controllers/refresolver/ingress/ingress.go
+++ b/controllers/refresolver/ingress/ingress.go
@@ -176,7 +176,7 @@ func (rr *ReferenceResolver) GetServers() ([]*k8gbv1beta1.Server, error) {
 }
 
 // GetGslbExposedIPs retrieves the load balancer IP address of the GSLB
-func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string, edgeDNSServers utils.DNSList) ([]string, error) {
+func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string, parentZoneDNSServers utils.DNSList) ([]string, error) {
 	// fetch the IP addresses of the reverse proxy from an annotation if it exists
 	if ingressIPsFromAnnotation, ok := gslbAnnotations[ExternalIPsAnnotation]; ok {
 		return utils.ParseIPAddresses(ingressIPsFromAnnotation)
@@ -189,7 +189,7 @@ func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string
 			gslbIngressIPs = append(gslbIngressIPs, ip.IP)
 		}
 		if len(ip.Hostname) > 0 {
-			IPs, err := utils.Dig(ip.Hostname, 8, edgeDNSServers...)
+			IPs, err := utils.Dig(ip.Hostname, 8, parentZoneDNSServers...)
 			if err != nil {
 				log.Warn().Err(err).Msg("Dig error")
 				return nil, err
diff --git a/controllers/refresolver/istiovirtualservice/istiovirtualservice.go b/controllers/refresolver/istiovirtualservice/istiovirtualservice.go
index 49c3879f..7dfc183a 100644
--- a/controllers/refresolver/istiovirtualservice/istiovirtualservice.go
+++ b/controllers/refresolver/istiovirtualservice/istiovirtualservice.go
@@ -219,7 +219,7 @@ func (rr *ReferenceResolver) GetServers() ([]*k8gbv1beta1.Server, error) {
 }
 
 // GetGslbExposedIPs retrieves the load balancer IP address of the GSLB
-func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string, edgeDNSServers utils.DNSList) ([]string, error) {
+func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string, parentZoneDNSServers utils.DNSList) ([]string, error) {
 	// fetch the IP addresses of the reverse proxy from an annotation if it exists
 	if ingressIPsFromAnnotation, ok := gslbAnnotations[externalIPsAnnotation]; ok {
 		return utils.ParseIPAddresses(ingressIPsFromAnnotation)
@@ -232,7 +232,7 @@ func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string
 			gslbIngressIPs = append(gslbIngressIPs, ip.IP)
 		}
 		if len(ip.Hostname) > 0 {
-			IPs, err := utils.Dig(ip.Hostname, 8, edgeDNSServers...)
+			IPs, err := utils.Dig(ip.Hostname, 8, parentZoneDNSServers...)
 			if err != nil {
 				log.Warn().Err(err).Msg("Dig error")
 				return nil, err
diff --git a/controllers/refresolver/refresolver.go b/controllers/refresolver/refresolver.go
index 460de7f8..0b36a478 100644
--- a/controllers/refresolver/refresolver.go
+++ b/controllers/refresolver/refresolver.go
@@ -34,7 +34,7 @@ type GslbReferenceResolver interface {
 	// GetServers retrieves GSLB the server configuration
 	GetServers() ([]*k8gbv1beta1.Server, error)
 	// GetGslbExposedIPs retrieves the load balancer IP address of the GSLB
-	GetGslbExposedIPs(gslbAnnotations map[string]string, edgeDNSServers utils.DNSList) ([]string, error)
+	GetGslbExposedIPs(gslbAnnotations map[string]string, parentZoneDNSServers utils.DNSList) ([]string, error)
 }
 
 // New creates a new GSLBReferenceResolver
diff --git a/controllers/utils/dns.go b/controllers/utils/dns.go
index e318e25a..716df3a2 100644
--- a/controllers/utils/dns.go
+++ b/controllers/utils/dns.go
@@ -45,16 +45,16 @@ func (l DNSList) String() string {
 	return strings.Join(aux, ",")
 }
 
-// Dig returns a list of IP addresses for a given FQDN by using the dns servers from edgeDNSServers
-// dns servers are tried one by one from the edgeDNSServers and if there is a non-error response it is returned and the rest is not tried
-func Dig(fqdn string, maxRecursion int, edgeDNSServers ...DNSServer) (ips []string, err error) {
+// Dig returns a list of IP addresses for a given FQDN by using the dns servers from parentZoneDNSServers
+// dns servers are tried one by one from the parentZoneDNSServers and if there is a non-error response it is returned and the rest is not tried
+func Dig(fqdn string, maxRecursion int, parentZoneDNSServers ...DNSServer) (ips []string, err error) {
 	if maxRecursion < 0 {
 		return nil, fmt.Errorf("maximum recursion limit reached")
 	}
 	maxRecursion--
 
-	if len(edgeDNSServers) == 0 {
-		return nil, fmt.Errorf("empty edgeDNSServers, provide at least one")
+	if len(parentZoneDNSServers) == 0 {
+		return nil, fmt.Errorf("empty parentZoneDNSServers, provide at least one")
 	}
 	if len(fqdn) == 0 {
 		return ips, nil
@@ -65,7 +65,7 @@ func Dig(fqdn string, maxRecursion int, edgeDNSServers ...DNSServer) (ips []stri
 	}
 	msg := new(dns.Msg)
 	msg.SetQuestion(fqdn, dns.TypeA)
-	ack, err := Exchange(msg, edgeDNSServers)
+	ack, err := Exchange(msg, parentZoneDNSServers)
 	if err != nil {
 		return nil, fmt.Errorf("dig error: %s", err)
 	}
@@ -99,7 +99,7 @@ func Dig(fqdn string, maxRecursion int, edgeDNSServers ...DNSServer) (ips []stri
 	// Check for non-resolved CNAMEs
 	for _, cname := range cnameRecords {
 		if !aResolved(cname) && !cResolved(cname) {
-			cnameIPs, err := Dig(cname.Target, maxRecursion, edgeDNSServers...)
+			cnameIPs, err := Dig(cname.Target, maxRecursion, parentZoneDNSServers...)
 			if err != nil {
 				return nil, err
 			}
@@ -110,11 +110,11 @@ func Dig(fqdn string, maxRecursion int, edgeDNSServers ...DNSServer) (ips []stri
 	return ips, nil
 }
 
-func Exchange(m *dns.Msg, edgeDNSServers []DNSServer) (msg *dns.Msg, err error) {
-	if len(edgeDNSServers) == 0 {
-		return nil, fmt.Errorf("empty edgeDNSServers, provide at least one")
+func Exchange(m *dns.Msg, parentZoneDNSServers []DNSServer) (msg *dns.Msg, err error) {
+	if len(parentZoneDNSServers) == 0 {
+		return nil, fmt.Errorf("empty parentZoneDNSServers, provide at least one")
 	}
-	for _, ns := range edgeDNSServers {
+	for _, ns := range parentZoneDNSServers {
 		if ns.Host == "" {
 			return nil, fmt.Errorf("empty edgeDNSServer.Host in the list")
 		}
diff --git a/deploy/helm/next.yaml b/deploy/helm/next.yaml
index 74566466..4dbe2600 100644
--- a/deploy/helm/next.yaml
+++ b/deploy/helm/next.yaml
@@ -1,6 +1,9 @@
 k8gb:
   reconcileRequeueSeconds: 10
-  dnsZoneNegTTL: 10
+  dnsZones:
+    - dnsZoneNegTTL: 10
+      loadBalancedZone: cloud.example.com
+      parentZone: example.com
   log:
     format: simple
     level: debug
diff --git a/docs/deploy_cloudflare.md b/docs/deploy_cloudflare.md
index f55d59e4..f3d4dd97 100644
--- a/docs/deploy_cloudflare.md
+++ b/docs/deploy_cloudflare.md
@@ -30,9 +30,9 @@ Remember to change the zone-related values to point configuration to your own DN
 
 ```yaml
 k8gb:
-  dnsZone: "cloudflare-test.k8gb.io"
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+  - parentZone: "k8gb.io"
+    loadBalancedZone: "cloudflare-test.k8gb.io"
 ```
 
 ### Cloudflare-specific configuration
diff --git a/docs/deploy_infoblox.md b/docs/deploy_infoblox.md
index a8581cb9..ae20141d 100644
--- a/docs/deploy_infoblox.md
+++ b/docs/deploy_infoblox.md
@@ -17,7 +17,7 @@ cp chart/k8gb/values.yaml ~/k8gb/eu-cluster.yaml
 * Modify the example configuration. Important parameters described below:
   * `dnsZone` - this zone will be delegated to the `edgeDNS` in your environment. E.g. `yourzone.edgedns.com`
   * `edgeDNSZone` - this zone will be automatically configured by k8gb to delegate to `dnsZone` and will make k8gb controlled nodes act as authoritative server for this zone. E.g. `edgedns.com`
-  * `edgeDNSServers` stable DNS servers in your environment that is controlled by edgeDNS provider e.g. Infoblox so k8gb instances will be able to talk to each other through automatically created DNS names
+  * `parentZoneDNSServers` stable DNS servers in your environment that is controlled by edgeDNS provider e.g. Infoblox so k8gb instances will be able to talk to each other through automatically created DNS names
   * `clusterGeoTag` to geographically tag your cluster. We are operating `eu` cluster in this example
   * `extGslbClustersGeoTags` contains Geo tag of the cluster(s) to talk with when k8gb is deployed to multiple clusters. Imagine your second cluster is `us` so we tag it accordingly
   * `infoblox.enabled: true` to enable automated zone delegation configuration at edgeDNS provider. You don't need it for local testing and can optionally be skipped. Meanwhile, in this section we will cover a fully operational end-to-end scenario.
diff --git a/docs/deploy_windowsdns.md b/docs/deploy_windowsdns.md
index 102cbc43..aba0e77c 100644
--- a/docs/deploy_windowsdns.md
+++ b/docs/deploy_windowsdns.md
@@ -82,7 +82,7 @@ Before deploying K8GB and the demo workload, ensure required configurations on W
         * Ensure that the following properties are updated with your values:
             * dnsZone
             * edgeDNSZone
-            * edgeDNSServers
+            * parentZoneDNSServers
             * host - always use FQDN with GSS-TSIG, not IP address
             * kerberos-username
             * kerberos-password
diff --git a/docs/examples/azure/k8gb/aks1-helm-values.yaml b/docs/examples/azure/k8gb/aks1-helm-values.yaml
index 852a2e1d..6f51f664 100644
--- a/docs/examples/azure/k8gb/aks1-helm-values.yaml
+++ b/docs/examples/azure/k8gb/aks1-helm-values.yaml
@@ -1,15 +1,14 @@
 k8gb:
   # -- dnsZone controlled by gslb
-  dnsZone: "demo.k8gb-kubeconeu2023.com"
-  # -- Negative TTL for SOA record
-  dnsZoneNegTTL: 300
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb-kubeconeu2023.com" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "demo.k8gb-kubeconeu2023.com" # -- dnsZone controlled by gslb
+      parentZone: "k8gb-kubeconeu2023.com" # -- main zone which would contain gslb zone to delegate
+      dnsZoneNegTTL: 300 # -- Negative TTL for SOA record
   # -- host/ip[:port] format is supported here where port defaults to 53
-  edgeDNSServers:
-      # -- use these DNS server as a main resolver to enable cross k8gb DNS based communication
-      - "1.1.1.1"
-      - "8.8.8.8"
+  parentZoneDNSServers:
+    # -- use these DNS server as a main resolver to enable cross k8gb DNS based communication
+    - "1.1.1.1"
+    - "8.8.8.8"
   # -- used for places where we need to distinguish between different Gslb instances
   clusterGeoTag: "uksouth"
   # -- comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/azure/k8gb/aks2-helm-values.yaml b/docs/examples/azure/k8gb/aks2-helm-values.yaml
index 8caba904..5c039410 100644
--- a/docs/examples/azure/k8gb/aks2-helm-values.yaml
+++ b/docs/examples/azure/k8gb/aks2-helm-values.yaml
@@ -1,15 +1,13 @@
 k8gb:
-  # -- dnsZone controlled by gslb
-  dnsZone: "demo.k8gb-kubeconeu2023.com"
-  # -- Negative TTL for SOA record
-  dnsZoneNegTTL: 300
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb-kubeconeu2023.com" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "demo.k8gb-kubeconeu2023.com" # -- dnsZone controlled by gslb
+      parentZone: "k8gb-kubeconeu2023.com" # -- main zone which would contain gslb zone to delegate
+      dnsZoneNegTTL: 300 # -- Negative TTL for SOA record
   # -- host/ip[:port] format is supported here where port defaults to 53
-  edgeDNSServers:
-      # -- use these DNS server as a main resolver to enable cross k8gb DNS based communication
-      - "1.1.1.1"
-      - "8.8.8.8"
+  parentZoneDNSServers:
+    # -- use these DNS server as a main resolver to enable cross k8gb DNS based communication
+    - "1.1.1.1"
+    - "8.8.8.8"
   # -- used for places where we need to distinguish between different Gslb instances
   clusterGeoTag: "francecentral"
   # -- comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/cloudflare/k8gb-cluster-cloudflare-eu.yaml b/docs/examples/cloudflare/k8gb-cluster-cloudflare-eu.yaml
index e9792a75..5d55e9c9 100644
--- a/docs/examples/cloudflare/k8gb-cluster-cloudflare-eu.yaml
+++ b/docs/examples/cloudflare/k8gb-cluster-cloudflare-eu.yaml
@@ -1,7 +1,7 @@
 k8gb:
-  dnsZone: "cloudflare-test.k8gb.io"
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "cloudflare-test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   # -- used for places where we need to distinguish between different Gslb instances
   clusterGeoTag: "eu"
   # -- comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/cloudflare/k8gb-cluster-cloudflare-us.yaml b/docs/examples/cloudflare/k8gb-cluster-cloudflare-us.yaml
index 8ec5722d..774734f7 100644
--- a/docs/examples/cloudflare/k8gb-cluster-cloudflare-us.yaml
+++ b/docs/examples/cloudflare/k8gb-cluster-cloudflare-us.yaml
@@ -1,7 +1,7 @@
 k8gb:
-  dnsZone: "cloudflare-test.k8gb.io"
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "cloudflare-test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   # -- used for places where we need to distinguish between different Gslb instances
   clusterGeoTag: "us"
   # -- comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/ns1/k8gb-cluster-ns1-eu-west-1.yaml b/docs/examples/ns1/k8gb-cluster-ns1-eu-west-1.yaml
index a0809404..b89b2b6d 100644
--- a/docs/examples/ns1/k8gb-cluster-ns1-eu-west-1.yaml
+++ b/docs/examples/ns1/k8gb-cluster-ns1-eu-west-1.yaml
@@ -1,6 +1,7 @@
 k8gb:
-  dnsZone: "test.k8gb.io" # dnsZone controlled by gslb
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   edgeDNSServer: "169.254.169.253" # external DNS server to be used for resolution
   clusterGeoTag: "eu-west-1" # used for places where we need to distinguish between differnet Gslb instances
   extGslbClustersGeoTags: "us-east-1" # comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/ns1/k8gb-cluster-ns1-us-east-1.yaml b/docs/examples/ns1/k8gb-cluster-ns1-us-east-1.yaml
index 90a23bcc..52fb1710 100644
--- a/docs/examples/ns1/k8gb-cluster-ns1-us-east-1.yaml
+++ b/docs/examples/ns1/k8gb-cluster-ns1-us-east-1.yaml
@@ -1,6 +1,7 @@
 k8gb:
-  dnsZone: "test.k8gb.io" # dnsZone controlled by gslb
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   edgeDNSServer: "169.254.169.253" # external DNS server to be used for resolution
   clusterGeoTag: "us-east-1" # used for places where we need to distinguish between differnet Gslb instances
   extGslbClustersGeoTags: "eu-west-1" # comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/route53/k8gb/k8gb-cluster-eu-west-1.yaml b/docs/examples/route53/k8gb/k8gb-cluster-eu-west-1.yaml
index d8f171c8..633d2028 100644
--- a/docs/examples/route53/k8gb/k8gb-cluster-eu-west-1.yaml
+++ b/docs/examples/route53/k8gb/k8gb-cluster-eu-west-1.yaml
@@ -1,6 +1,7 @@
 k8gb:
-  dnsZone: "test.k8gb.io" # dnsZone controlled by gslb
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   edgeDNSServer: "169.254.169.253" # use this DNS server as a main resolver to enable cross k8gb DNS based communication
   clusterGeoTag: "eu-west-1" # used for places where we need to distinguish between differnet Gslb instances
   extGslbClustersGeoTags: "us-east-1" # comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/route53/k8gb/k8gb-cluster-us-east-1.yaml b/docs/examples/route53/k8gb/k8gb-cluster-us-east-1.yaml
index cda33d84..07f2e372 100644
--- a/docs/examples/route53/k8gb/k8gb-cluster-us-east-1.yaml
+++ b/docs/examples/route53/k8gb/k8gb-cluster-us-east-1.yaml
@@ -1,6 +1,7 @@
 k8gb:
-  dnsZone: "test.k8gb.io" # dnsZone controlled by gslb
-  edgeDNSZone: "k8gb.io" # main zone which would contain gslb zone to delegate
+  dnsZones:
+    - loadBalancedZone: "test.k8gb.io" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.io" # -- main zone which would contain gslb zone to delegate
   edgeDNSServer: "169.254.169.253" # use this DNS server as a main resolver to enable cross k8gb DNS based communication
   clusterGeoTag: "us-east-1" # used for places where we need to distinguish between differnet Gslb instances
   extGslbClustersGeoTags: "eu-west-1" # comma-separated list of external gslb geo tags to pair with
diff --git a/docs/examples/windowsdns/k8gb/aks1-helm-values.yaml b/docs/examples/windowsdns/k8gb/aks1-helm-values.yaml
index e9560354..0d0e47e6 100644
--- a/docs/examples/windowsdns/k8gb/aks1-helm-values.yaml
+++ b/docs/examples/windowsdns/k8gb/aks1-helm-values.yaml
@@ -3,13 +3,12 @@ k8gb:
   deployCrds: true
   deployRbac: true
   # -- dns zone that will be managed by CoreDNS
-  dnsZone: "global.k8gb.local"
-  # -- Negative TTL for SOA record
-  dnsZoneNegTTL: 300
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb.local"
+  dnsZones:
+    - loadBalancedZone: "global.k8gb.local" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.local" # -- main zone which would contain gslb zone to delegate
+      dnsZoneNegTTL: 300 # -- Negative TTL for SOA record
   # -- host/ip[:port] format is supported here where port defaults to 53
-  edgeDNSServers:
+  parentZoneDNSServers:
       # -- use this DNS server as a main resolver to enable cross k8gb DNS based communication
       - "10.10.0.6"
   # -- used for places where we need to distinguish between different Gslb instances
@@ -78,4 +77,4 @@ rfc2136:
       gssTsigCreds:
         - kerberos-username: k8gb
         - kerberos-password: asdfkuj#f8guh1
-        - kerberos-realm: k8gb.local
\ No newline at end of file
+        - kerberos-realm: k8gb.local
diff --git a/docs/examples/windowsdns/k8gb/aks2-helm-values.yaml b/docs/examples/windowsdns/k8gb/aks2-helm-values.yaml
index b2c37314..5d204599 100644
--- a/docs/examples/windowsdns/k8gb/aks2-helm-values.yaml
+++ b/docs/examples/windowsdns/k8gb/aks2-helm-values.yaml
@@ -3,13 +3,12 @@ k8gb:
   deployCrds: true
   deployRbac: true
   # -- dns zone that will be managed by CoreDNS
-  dnsZone: "global.k8gb.local"
-  # -- Negative TTL for SOA record
-  dnsZoneNegTTL: 300
-  # -- main zone which would contain gslb zone to delegate
-  edgeDNSZone: "k8gb.local"
+  dnsZones:
+    - loadBalancedZone: "global.k8gb.local" # -- dnsZone controlled by gslb
+      parentZone: "k8gb.local" # -- main zone which would contain gslb zone to delegate
+      dnsZoneNegTTL: 300 # -- Negative TTL for SOA record
   # -- host/ip[:port] format is supported here where port defaults to 53
-  edgeDNSServers:
+  parentZoneDNSServers:
       # -- use this DNS server as a main resolver to enable cross k8gb DNS based communication
       - "10.10.0.6"
   # -- used for places where we need to distinguish between different Gslb instances
@@ -78,4 +77,4 @@ rfc2136:
       gssTsigCreds:
         - kerberos-username: k8gb
         - kerberos-password: asdfkuj#f8guh1
-        - kerberos-realm: K8GB.LOCAL
\ No newline at end of file
+        - kerberos-realm: K8GB.LOCAL
diff --git a/docs/rancher.md b/docs/rancher.md
index dcd32113..85b50b8a 100644
--- a/docs/rancher.md
+++ b/docs/rancher.md
@@ -21,9 +21,10 @@ helm:
   releaseName: k8gb
   values:
     k8gb:
-      dnsZone: global.fleet.clusterLabels.k8gb-dnsZone
-      edgeDNSZone: "cloud.example.com"
-      edgeDNSServers:
+      dnsZones:
+        - parentZone: cloud.example.com
+          loadBalancedZone: global.fleet.clusterLabels.k8gb-dnsZone
+      parentZoneDNSServers:
         - "1.2.3.4"
         - "5.6.7.8"
       clusterGeoTag: global.fleet.clusterLabels.k8gb-clusterGeoTag



Test patch:
diff --git a/controllers/depresolver/depresolver_test.go b/controllers/depresolver/depresolver_test.go
index 18cc549b..e3d7dce8 100644
--- a/controllers/depresolver/depresolver_test.go
+++ b/controllers/depresolver/depresolver_test.go
@@ -60,7 +60,7 @@ var predefinedConfig = Config{
 	ClusterGeoTag:           "us",
 	extClustersGeoTags:      []string{"za", "eu"},
 	EdgeDNSType:             DNSTypeInfoblox,
-	EdgeDNSServers: []utils2.DNSServer{
+	ParentZoneDNSServers: []utils2.DNSServer{
 		{
 			Host: "dns.cloud.example.com",
 			Port: 53,
@@ -279,11 +279,11 @@ func TestResolveConfigWithDeprecatedEdgeDNSServerKey(t *testing.T) {
 	assert.Equal(t, expected, *config)
 }
 
-func TestResolveConfigWithMalformedEdgeDNSServersKey(t *testing.T) {
+func TestResolveConfigWithMalformedParentZoneDNSServersKey(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "dns1;dns2?")
+	_ = os.Setenv(ParentZoneDNSServersKey, "dns1;dns2?")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -342,7 +342,7 @@ func TestResolveConfigWithEmptyEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{}
+	expected.ParentZoneDNSServers = []utils2.DNSServer{}
 	// act,assert
 	arrangeVariablesAndAssert(t, expected, assert.Error)
 }
@@ -351,7 +351,7 @@ func TestResolveConfigWithTwoEdgeDnsServers(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{
+	expected.ParentZoneDNSServers = []utils2.DNSServer{
 		{
 			Host: "8.8.8.8",
 			Port: 53,
@@ -369,16 +369,16 @@ func TestResolveConfigWithNoEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{}
+	expected.ParentZoneDNSServers = []utils2.DNSServer{}
 	// act,assert
-	arrangeVariablesAndAssert(t, expected, assert.Error, EdgeDNSServersKey)
+	arrangeVariablesAndAssert(t, expected, assert.Error, ParentZoneDNSServersKey)
 }
 
 func TestResolveConfigWithEmptyIpAddressInEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{
+	expected.ParentZoneDNSServers = []utils2.DNSServer{
 		{
 			Host: defaultEdgeDNSServerIP,
 			Port: 53,
@@ -392,7 +392,7 @@ func TestResolveConfigWithHostnameEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{
+	expected.ParentZoneDNSServers = []utils2.DNSServer{
 		{
 			Host: "server-nonprod.on.domain.l3.2l.com",
 			Port: 53,
@@ -407,7 +407,7 @@ func TestResolveConfigWithInvalidIpAddressEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	expected := predefinedConfig
-	expected.EdgeDNSServers = []utils2.DNSServer{
+	expected.ParentZoneDNSServers = []utils2.DNSServer{
 		{
 			Host: fmt.Sprintf("%s.", defaultEdgeDNSServerIP),
 			Port: 53,
@@ -421,7 +421,7 @@ func TestResolveConfigWithMultipleEdgeDnsServers1(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1:53,  2.2.2.2:42")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1:53,  2.2.2.2:42")
 	resolver := NewDependencyResolver()
 	// act
 	config, err := resolver.ResolveOperatorConfig()
@@ -429,15 +429,15 @@ func TestResolveConfigWithMultipleEdgeDnsServers1(t *testing.T) {
 	// assert
 	assert.NoError(t, err)
 	assert.Empty(t, depr)
-	assert.Equal(t, 2, len(config.EdgeDNSServers))
-	assert.Equal(t, 42, config.EdgeDNSServers[1].Port)
+	assert.Equal(t, 2, len(config.ParentZoneDNSServers))
+	assert.Equal(t, 42, config.ParentZoneDNSServers[1].Port)
 }
 
 func TestResolveConfigWithMultipleEdgeDnsServers2(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1:11, 2.2.2.2:22, 3.3.3.3, somedns:1337")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1:11, 2.2.2.2:22, 3.3.3.3, somedns:1337")
 	resolver := NewDependencyResolver()
 	// act
 	config, err := resolver.ResolveOperatorConfig()
@@ -445,46 +445,46 @@ func TestResolveConfigWithMultipleEdgeDnsServers2(t *testing.T) {
 	// assert
 	assert.NoError(t, err)
 	assert.Empty(t, depr)
-	assert.Equal(t, 4, len(config.EdgeDNSServers))
-	assert.Equal(t, "1.1.1.1", config.EdgeDNSServers[0].Host)
-	assert.Equal(t, 11, config.EdgeDNSServers[0].Port)
-	assert.Equal(t, 22, config.EdgeDNSServers[1].Port)
-	assert.Equal(t, 53, config.EdgeDNSServers[2].Port)
-	assert.Equal(t, 1337, config.EdgeDNSServers[3].Port)
-	assert.Equal(t, "somedns", config.EdgeDNSServers[3].Host)
+	assert.Equal(t, 4, len(config.ParentZoneDNSServers))
+	assert.Equal(t, "1.1.1.1", config.ParentZoneDNSServers[0].Host)
+	assert.Equal(t, 11, config.ParentZoneDNSServers[0].Port)
+	assert.Equal(t, 22, config.ParentZoneDNSServers[1].Port)
+	assert.Equal(t, 53, config.ParentZoneDNSServers[2].Port)
+	assert.Equal(t, 1337, config.ParentZoneDNSServers[3].Port)
+	assert.Equal(t, "somedns", config.ParentZoneDNSServers[3].Host)
 }
 
 func TestResolveConfigWithNoEdgeDnsServerPort(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1")
 	resolver := NewDependencyResolver()
 	// act
 	config, err := resolver.ResolveOperatorConfig()
 	// assert
 	assert.NoError(t, err)
-	assert.Equal(t, 53, config.EdgeDNSServers[0].Port)
+	assert.Equal(t, 53, config.ParentZoneDNSServers[0].Port)
 }
 
 func TestResolveConfigWithEdgeDnsServerPort(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1:42")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1:42")
 	resolver := NewDependencyResolver()
 	// act
 	config, err := resolver.ResolveOperatorConfig()
 	// assert
 	assert.NoError(t, err)
-	assert.Equal(t, 42, config.EdgeDNSServers[0].Port)
+	assert.Equal(t, 42, config.ParentZoneDNSServers[0].Port)
 }
 
 func TestResolveConfigWithInvalidEdgeDnsServerPort1(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1:invalid")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1:invalid")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -499,7 +499,7 @@ func TestResolveConfigWithInvalidEdgeDnsServersValue(t *testing.T) {
 		// arrange
 		defer cleanup()
 		configureEnvVar(predefinedConfig)
-		_ = os.Setenv(EdgeDNSServersKey, invalid)
+		_ = os.Setenv(ParentZoneDNSServersKey, invalid)
 		resolver := NewDependencyResolver()
 		// act
 		_, err := resolver.ResolveOperatorConfig()
@@ -514,7 +514,7 @@ func TestResolveConfigWithMultipleEdgeDnsServersLocalhostNotFirst(t *testing.T)
 		// arrange
 		defer cleanup()
 		configureEnvVar(predefinedConfig)
-		_ = os.Setenv(EdgeDNSServersKey, invalid)
+		_ = os.Setenv(ParentZoneDNSServersKey, invalid)
 		resolver := NewDependencyResolver()
 		// act
 		_, err := resolver.ResolveOperatorConfig()
@@ -528,7 +528,7 @@ func TestResolveConfigWithMultipleEdgeDnsServersMalformed1(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "somehost:,somehost3:123:aaa.com")
+	_ = os.Setenv(ParentZoneDNSServersKey, "somehost:,somehost3:123:aaa.com")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -541,7 +541,7 @@ func TestResolveConfigWithMultipleEdgeDnsServersMalformed2(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1,")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1,")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -554,7 +554,7 @@ func TestResolveConfigWithInvalidHostnameEdgeDnsServer(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "https://server-nonprod.on.domain.l3.2l.com")
+	_ = os.Setenv(ParentZoneDNSServersKey, "https://server-nonprod.on.domain.l3.2l.com")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -567,7 +567,7 @@ func TestResolveConfigWithZeroOrNegativeEdgeDnsServerPort(t *testing.T) {
 	// arrange
 	defer cleanup()
 	configureEnvVar(predefinedConfig)
-	_ = os.Setenv(EdgeDNSServersKey, "1.1.1.1:-53")
+	_ = os.Setenv(ParentZoneDNSServersKey, "1.1.1.1:-53")
 	resolver := NewDependencyResolver()
 	// act
 	_, err := resolver.ResolveOperatorConfig()
@@ -1207,7 +1207,7 @@ func arrangeVariablesAndAssert(t *testing.T, expected Config,
 
 func cleanup() {
 	for _, s := range []string{ReconcileRequeueSecondsKey, NSRecordTTLKey, ClusterGeoTagKey, ExtClustersGeoTagsKey,
-		EdgeDNSServersKey, ExtDNSEnabledKey, InfobloxGridHostKey, InfobloxVersionKey, InfobloxPortKey, InfobloxUsernameKey,
+		ParentZoneDNSServersKey, ExtDNSEnabledKey, InfobloxGridHostKey, InfobloxVersionKey, InfobloxPortKey, InfobloxUsernameKey,
 		InfobloxPasswordKey, K8gbNamespaceKey, CoreDNSExposedKey, InfobloxHTTPRequestTimeoutKey, CoreDNSServiceTypeKey,
 		InfobloxHTTPPoolConnectionsKey, LogLevelKey, LogFormatKey, LogNoColorKey, MetricsAddressKey, TracingEnabled,
 		TracingSamplingRatio, OtelExporterOtlpEndpoint, DNSZonesKey} {
@@ -1224,7 +1224,7 @@ func configureEnvVar(config Config) {
 	_ = os.Setenv(NSRecordTTLKey, strconv.Itoa(config.NSRecordTTL))
 	_ = os.Setenv(ClusterGeoTagKey, config.ClusterGeoTag)
 	_ = os.Setenv(ExtClustersGeoTagsKey, strings.Join(config.extClustersGeoTags, ","))
-	_ = os.Setenv(EdgeDNSServersKey, config.EdgeDNSServers.String())
+	_ = os.Setenv(ParentZoneDNSServersKey, config.ParentZoneDNSServers.String())
 	_ = os.Setenv(K8gbNamespaceKey, config.K8gbNamespace)
 	_ = os.Setenv(ExtDNSEnabledKey, strconv.FormatBool(config.extDNSEnabled))
 	_ = os.Setenv(CoreDNSExposedKey, strconv.FormatBool(config.CoreDNSExposed))
@@ -1292,10 +1292,10 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "invalid negTTL",
 			config: &Config{
-				dnsZones:           "example.com:cloud.example.com:30x",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "example.com:cloud.example.com:30x",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 0,
 			assert: func(_ []*DelegationZoneInfo, err error) {
@@ -1305,19 +1305,19 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "multiple zones",
 			config: &Config{
-				dnsZones:           "example.com:cloud.example.com:30;example.io:cloud.example.io:50",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "example.com:cloud.example.com:30;example.io:cloud.example.io:50",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 2,
 			assert: func(zoneInfo []*DelegationZoneInfo, err error) {
 				assert.NoError(t, err)
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.com" && info.Domain == "cloud.example.com"
+					return info.ParentZone == "example.com" && info.LoadBalancedZone == "cloud.example.com"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.io" && info.Domain == "cloud.example.io"
+					return info.ParentZone == "example.io" && info.LoadBalancedZone == "cloud.example.io"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
 					return info.ClusterNSName == "gslb-ns-us-cloud.example.com" &&
@@ -1338,19 +1338,19 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "multiple domains",
 			config: &Config{
-				dnsZones:           "example.com:cloud.example.com:30;example.com:pair.example.com:50",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "example.com:cloud.example.com:30;example.com:pair.example.com:50",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 2,
 			assert: func(zoneInfo []*DelegationZoneInfo, err error) {
 				assert.NoError(t, err)
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.com" && info.Domain == "cloud.example.com"
+					return info.ParentZone == "example.com" && info.LoadBalancedZone == "cloud.example.com"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.com" && info.Domain == "pair.example.com"
+					return info.ParentZone == "example.com" && info.LoadBalancedZone == "pair.example.com"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
 					return info.ClusterNSName == "gslb-ns-us-cloud.example.com" &&
@@ -1371,48 +1371,48 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "ends with semicolon",
 			config: &Config{
-				dnsZones:           "example.com:cloud.example.com:30;example.io:cloud.example.io:300;",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "example.com:cloud.example.com:30;example.io:cloud.example.io:300;",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 2,
 			assert: func(zoneInfo []*DelegationZoneInfo, err error) {
 				assert.NoError(t, err)
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.com" && info.Domain == "cloud.example.com"
+					return info.ParentZone == "example.com" && info.LoadBalancedZone == "cloud.example.com"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.io" && info.Domain == "cloud.example.io"
+					return info.ParentZone == "example.io" && info.LoadBalancedZone == "cloud.example.io"
 				}))
 			},
 		},
 		{
 			name: "trimmed spaces and semicolons",
 			config: &Config{
-				dnsZones:           "example.com: cloud.example.com: 50; example.io:cloud.example.io: 30 ;",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "example.com: cloud.example.com: 50; example.io:cloud.example.io: 30 ;",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 2,
 			assert: func(zoneInfo []*DelegationZoneInfo, err error) {
 				assert.NoError(t, err)
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.com" && info.Domain == "cloud.example.com"
+					return info.ParentZone == "example.com" && info.LoadBalancedZone == "cloud.example.com"
 				}))
 				assert.True(t, contains(zoneInfo, func(info *DelegationZoneInfo) bool {
-					return info.Zone == "example.io" && info.Domain == "cloud.example.io"
+					return info.ParentZone == "example.io" && info.LoadBalancedZone == "cloud.example.io"
 				}))
 			},
 		},
 		{
 			name: "check nsNames",
 			config: &Config{
-				dnsZones:           "cloud.example.com: k8gb-test.gslb.cloud.example.com :60;",
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             "cloud.example.com: k8gb-test.gslb.cloud.example.com :60;",
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 1,
 			assert: func(zoneInfo []*DelegationZoneInfo, err error) {
@@ -1426,10 +1426,10 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "nsName exceed exceed limit 253 characters",
 			config: &Config{
-				dnsZones:           fmt.Sprintf("cloud.example.com:k8gb-test.%s.gslb.cloud.example.com:60;", str220),
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             fmt.Sprintf("cloud.example.com:k8gb-test.%s.gslb.cloud.example.com:60;", str220),
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 1,
 			assert: func(_ []*DelegationZoneInfo, err error) {
@@ -1439,10 +1439,10 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3.eee`
 		{
 			name: "nsName label exceed limit 63 characters",
 			config: &Config{
-				dnsZones:           fmt.Sprintf("cloud.example.com: %s.gslb.cloud.example.com:60;", str64),
-				EdgeDNSServers:     []utils2.DNSServer{{Host: "edge.com", Port: 53}},
-				ClusterGeoTag:      "us",
-				extClustersGeoTags: []string{"za", "eu"},
+				dnsZones:             fmt.Sprintf("cloud.example.com: %s.gslb.cloud.example.com:60;", str64),
+				ParentZoneDNSServers: []utils2.DNSServer{{Host: "edge.com", Port: 53}},
+				ClusterGeoTag:        "us",
+				extClustersGeoTags:   []string{"za", "eu"},
 			},
 			expectedLen: 1,
 			assert: func(_ []*DelegationZoneInfo, err error) {
diff --git a/controllers/providers/dns/external_test.go b/controllers/providers/dns/external_test.go
index b13d206d..5a062cbc 100644
--- a/controllers/providers/dns/external_test.go
+++ b/controllers/providers/dns/external_test.go
@@ -97,11 +97,11 @@ func TestCreateZoneDelegation(t *testing.T) {
 				NSRecordTTL:   60,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						NegativeTTL:   60,
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						ClusterNSName: "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						NegativeTTL:      60,
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						ClusterNSName:    "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-k8gb-test-gslb.cloud.example.com",
 						},
@@ -118,11 +118,11 @@ func TestCreateZoneDelegation(t *testing.T) {
 				NSRecordTTL:   60,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						NegativeTTL:   60,
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						ClusterNSName: "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						NegativeTTL:      60,
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						ClusterNSName:    "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-k8gb-test-gslb.cloud.example.com",
 						},
@@ -139,21 +139,21 @@ func TestCreateZoneDelegation(t *testing.T) {
 				NSRecordTTL:   60,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						NegativeTTL:   60,
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						ClusterNSName: "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						NegativeTTL:      60,
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						ClusterNSName:    "gslb-ns-eu-k8gb-test-gslb.cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-k8gb-test-gslb.cloud.example.com",
 						},
 					},
 					{
-						Domain:        "cloud.example.org",
-						Zone:          "example.org",
-						NegativeTTL:   60,
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						ClusterNSName: "gslb-ns-eu-k8gb-test-gslb.cloud.example.org",
+						LoadBalancedZone: "cloud.example.org",
+						ParentZone:       "example.org",
+						NegativeTTL:      60,
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						ClusterNSName:    "gslb-ns-eu-k8gb-test-gslb.cloud.example.org",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-k8gb-test-gslb.cloud.example.org",
 						},
diff --git a/controllers/providers/dns/infoblox_test.go b/controllers/providers/dns/infoblox_test.go
index 1620e105..78d3ca4e 100644
--- a/controllers/providers/dns/infoblox_test.go
+++ b/controllers/providers/dns/infoblox_test.go
@@ -46,11 +46,11 @@ func TestCreateZoneDelegationInfoblox(t *testing.T) {
 				NSRecordTTL:   30,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Zone:          "example.com",
-						Domain:        "cloud.example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						NegativeTTL:   30,
+						ParentZone:       "example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						NegativeTTL:      30,
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 						},
@@ -102,11 +102,11 @@ func TestCreateZoneDelegationInfoblox(t *testing.T) {
 				NSRecordTTL:   30,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Zone:          "example.com",
-						Domain:        "cloud.example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						NegativeTTL:   30,
+						ParentZone:       "example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						NegativeTTL:      30,
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
@@ -147,11 +147,11 @@ func TestCreateZoneDelegationInfoblox(t *testing.T) {
 				NSRecordTTL:   30,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Zone:          "example.com",
-						Domain:        "cloud.example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						NegativeTTL:   30,
+						ParentZone:       "example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						NegativeTTL:      30,
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
@@ -221,11 +221,11 @@ func TestCreateZoneDelegationInfoblox(t *testing.T) {
 				NSRecordTTL:   30,
 				DelegationZones: []*depresolver.DelegationZoneInfo{
 					{
-						Zone:          "example.com",
-						Domain:        "cloud.example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
-						IPs:           []string{"10.0.0.1", "10.0.0.2"},
-						NegativeTTL:   30,
+						ParentZone:       "example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
+						IPs:              []string{"10.0.0.1", "10.0.0.2"},
+						NegativeTTL:      30,
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
diff --git a/controllers/providers/k8gbendpoint/applicationDNSEndpoint_weight_test.go b/controllers/providers/k8gbendpoint/applicationDNSEndpoint_weight_test.go
index 25b6839f..41049fa2 100644
--- a/controllers/providers/k8gbendpoint/applicationDNSEndpoint_weight_test.go
+++ b/controllers/providers/k8gbendpoint/applicationDNSEndpoint_weight_test.go
@@ -41,7 +41,7 @@ func TestWeight(t *testing.T) {
 	// void metrics
 	metrics := func(*k8gbv1beta1.Gslb, bool, k8gbv1beta1.HealthStatus, []string) {}
 
-	edgeDNSServers := []utils.DNSServer{
+	parentZoneDNSServers := []utils.DNSServer{
 		{Host: "10.0.0.1", Port: 53},
 	}
 	type wrr struct {
@@ -63,16 +63,16 @@ func TestWeight(t *testing.T) {
 				ClusterGeoTag: "eu",
 				DelegationZones: depresolver.DelegationZones{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
 						},
 					},
 				},
-				EdgeDNSServers: edgeDNSServers,
+				ParentZoneDNSServers: parentZoneDNSServers,
 			},
 			gslb: &k8gbv1beta1.Gslb{
 				Spec: k8gbv1beta1.GslbSpec{
@@ -117,16 +117,16 @@ func TestWeight(t *testing.T) {
 				ClusterGeoTag: "eu",
 				DelegationZones: depresolver.DelegationZones{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
 						},
 					},
 				},
-				EdgeDNSServers: edgeDNSServers,
+				ParentZoneDNSServers: parentZoneDNSServers,
 			},
 			gslb: &k8gbv1beta1.Gslb{
 				Spec: k8gbv1beta1.GslbSpec{
@@ -171,16 +171,16 @@ func TestWeight(t *testing.T) {
 				ClusterGeoTag: "eu",
 				DelegationZones: depresolver.DelegationZones{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
 						},
 					},
 				},
-				EdgeDNSServers: edgeDNSServers,
+				ParentZoneDNSServers: parentZoneDNSServers,
 			},
 			gslb: &k8gbv1beta1.Gslb{
 				Spec: k8gbv1beta1.GslbSpec{
@@ -225,16 +225,16 @@ func TestWeight(t *testing.T) {
 				ClusterGeoTag: "eu",
 				DelegationZones: depresolver.DelegationZones{
 					{
-						Domain:        "cloud.example.com",
-						Zone:          "example.com",
-						ClusterNSName: "gslb-ns-eu-cloud.example.com",
+						LoadBalancedZone: "cloud.example.com",
+						ParentZone:       "example.com",
+						ClusterNSName:    "gslb-ns-eu-cloud.example.com",
 						ExtClusterNSNames: map[string]string{
 							"us": "gslb-ns-us-cloud.example.com",
 							"za": "gslb-ns-za-cloud.example.com",
 						},
 					},
 				},
-				EdgeDNSServers: edgeDNSServers,
+				ParentZoneDNSServers: parentZoneDNSServers,
 			},
 			gslb: &k8gbv1beta1.Gslb{
 				Spec: k8gbv1beta1.GslbSpec{
@@ -269,13 +269,13 @@ func TestWeight(t *testing.T) {
 				ClusterGeoTag: "eu",
 				DelegationZones: depresolver.DelegationZones{
 					{
-						Domain:            "cloud.example.com",
-						Zone:              "example.com",
+						LoadBalancedZone:  "cloud.example.com",
+						ParentZone:        "example.com",
 						ClusterNSName:     "gslb-ns-eu-cloud.example.com",
 						ExtClusterNSNames: map[string]string{},
 					},
 				},
-				EdgeDNSServers: edgeDNSServers,
+				ParentZoneDNSServers: parentZoneDNSServers,
 			},
 			gslb: &k8gbv1beta1.Gslb{
 				Spec: k8gbv1beta1.GslbSpec{
diff --git a/controllers/providers/metrics/prometheus_test.go b/controllers/providers/metrics/prometheus_test.go
index a847ff5a..2ee5247a 100644
--- a/controllers/providers/metrics/prometheus_test.go
+++ b/controllers/providers/metrics/prometheus_test.go
@@ -51,8 +51,8 @@ var (
 		K8gbNamespace: namespace,
 		DelegationZones: depresolver.DelegationZones{
 			{
-				Domain: "cloud.example.com",
-				Zone:   "example.com",
+				LoadBalancedZone: "cloud.example.com",
+				ParentZone:       "example.com",
 			},
 		},
 	}
diff --git a/controllers/utils/dns_test.go b/controllers/utils/dns_test.go
index af57e845..d702e049 100644
--- a/controllers/utils/dns_test.go
+++ b/controllers/utils/dns_test.go
@@ -131,7 +131,7 @@ func TestOneValidEdgeDNSInTheList(t *testing.T) {
 		t.Skipf("no connectivity, skipping")
 	}
 	// arrange
-	edgeDNSServers := []DNSServer{
+	parentZoneDNSServers := []DNSServer{
 		{Host: "127.1.2.3", Port: 53}, // wrong
 		{Host: "8.8.8.8", Port: 153},  // wrong
 		{Host: "8.8.8.8", Port: 53},   // ok
@@ -139,7 +139,7 @@ func TestOneValidEdgeDNSInTheList(t *testing.T) {
 	}
 	fqdn := defaultFqdn
 	// act
-	result, err := Dig(fqdn, 8, edgeDNSServers...)
+	result, err := Dig(fqdn, 8, parentZoneDNSServers...)
 	// assert
 	if err != nil && strings.HasSuffix(err.Error(), "->8.8.8.8:253: i/o timeout") {
 		// udp 8.8.8.8:253 may be blocked on some local environments
@@ -152,14 +152,14 @@ func TestOneValidEdgeDNSInTheList(t *testing.T) {
 
 func TestNoValidEdgeDNSInTheList(t *testing.T) {
 	// arrange
-	edgeDNSServers := []DNSServer{
+	parentZoneDNSServers := []DNSServer{
 		{Host: "", Port: 53},         // wrong
 		{Host: "8.8.8.8", Port: 153}, // wrong
 		{Host: "8.8.4.4", Port: 253}, // wrong
 	}
 	fqdn := defaultFqdn
 	// act
-	result, err := Dig(fqdn, 8, edgeDNSServers...)
+	result, err := Dig(fqdn, 8, parentZoneDNSServers...)
 	// assert
 	assert.Error(t, err)
 	assert.Nil(t, result)
@@ -167,14 +167,14 @@ func TestNoValidEdgeDNSInTheList(t *testing.T) {
 
 func TestEmptyEdgeDNSInTheList(t *testing.T) {
 	// arrange
-	edgeDNSServers := []DNSServer{
+	parentZoneDNSServers := []DNSServer{
 		{Host: "", Port: 53},        // wrong
 		{Host: "8.8.8.8", Port: 53}, // ok
 		{Host: "8.8.4.4", Port: 53}, // ok
 	}
 	fqdn := defaultFqdn
 	// act
-	result, err := Dig(fqdn, 8, edgeDNSServers...)
+	result, err := Dig(fqdn, 8, parentZoneDNSServers...)
 	// assert
 	assert.Error(t, err)
 	assert.Nil(t, result)
@@ -185,14 +185,14 @@ func TestMultipleValidEdgeDNSInTheList(t *testing.T) {
 		t.Skipf("no connectivity, skipping")
 	}
 	// arrange
-	edgeDNSServers := []DNSServer{
+	parentZoneDNSServers := []DNSServer{
 		{Host: "1.1.1.1", Port: 53}, // ok
 		{Host: "8.8.8.8", Port: 53}, // ok
 		{Host: "8.8.4.4", Port: 53}, // ok
 	}
 	fqdn := defaultFqdn
 	// act
-	result, err := Dig(fqdn, 8, edgeDNSServers...)
+	result, err := Dig(fqdn, 8, parentZoneDNSServers...)
 	// assert
 	assert.NoError(t, err)
 	assert.NotEmpty(t, result)