aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chris O'Haver <cohaver@infoblox.com> 2022-03-07 12:18:23 -0500
committerGravatar GitHub <noreply@github.com> 2022-03-07 12:18:23 -0500
commit3fe9d41a211055d748f4d98013aa86e7ffc1e63f (patch)
treef7803a4f0fc1a1257a0b72442e95059143c12b08
parent7263808fe1cfb3b9dfbc09d70c52d52a563e5254 (diff)
downloadcoredns-3fe9d41a211055d748f4d98013aa86e7ffc1e63f.tar.gz
coredns-3fe9d41a211055d748f4d98013aa86e7ffc1e63f.tar.zst
coredns-3fe9d41a211055d748f4d98013aa86e7ffc1e63f.zip
plugin/k8s_external: fix external nsAddrs when CoreDNS Service has no External IPs (#4891)
fix external nsAddrs; add tests; Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
-rw-r--r--plugin/kubernetes/ns.go10
-rw-r--r--plugin/kubernetes/ns_test.go69
2 files changed, 58 insertions, 21 deletions
diff --git a/plugin/kubernetes/ns.go b/plugin/kubernetes/ns.go
index 84f4e344b..3e6a30586 100644
--- a/plugin/kubernetes/ns.go
+++ b/plugin/kubernetes/ns.go
@@ -15,8 +15,9 @@ func isDefaultNS(name, zone string) bool {
// it returns a record for the local address of the machine we're running on.
func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
var (
- svcNames []string
- svcIPs []net.IP
+ svcNames []string
+ svcIPs []net.IP
+ foundEndpoint bool
)
// Find the CoreDNS Endpoints
@@ -25,6 +26,7 @@ func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
// Collect IPs for all Services of the Endpoints
for _, endpoint := range endpoints {
+ foundEndpoint = true
svcs := k.APIConn.SvcIndex(endpoint.Index)
for _, svc := range svcs {
if external {
@@ -54,8 +56,8 @@ func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
}
}
- // If no local IPs matched any endpoints, use the localIPs directly
- if len(svcIPs) == 0 {
+ // If no CoreDNS endpoints were found, use the localIPs directly
+ if !foundEndpoint {
svcIPs = make([]net.IP, len(k.localIPs))
svcNames = make([]string, len(k.localIPs))
for i, localIP := range k.localIPs {
diff --git a/plugin/kubernetes/ns_test.go b/plugin/kubernetes/ns_test.go
index 92ed3d4a8..ca69c7c3b 100644
--- a/plugin/kubernetes/ns_test.go
+++ b/plugin/kubernetes/ns_test.go
@@ -35,24 +35,25 @@ func (a APIConnTest) SvcIndex(s string) []*object.Service {
return nil
}
+var svcs = []*object.Service{
+ {
+ Name: "dns-service",
+ Namespace: "kube-system",
+ ClusterIPs: []string{"10.0.0.111"},
+ },
+ {
+ Name: "hdls-dns-service",
+ Namespace: "kube-system",
+ ClusterIPs: []string{api.ClusterIPNone},
+ },
+ {
+ Name: "dns6-service",
+ Namespace: "kube-system",
+ ClusterIPs: []string{"10::111"},
+ },
+}
+
func (APIConnTest) ServiceList() []*object.Service {
- svcs := []*object.Service{
- {
- Name: "dns-service",
- Namespace: "kube-system",
- ClusterIPs: []string{"10.0.0.111"},
- },
- {
- Name: "hdls-dns-service",
- Namespace: "kube-system",
- ClusterIPs: []string{api.ClusterIPNone},
- },
- {
- Name: "dns6-service",
- Namespace: "kube-system",
- ClusterIPs: []string{"10::111"},
- },
- }
return svcs
}
@@ -136,3 +137,37 @@ func TestNsAddrs(t *testing.T) {
t.Errorf("Expected AAAA Header Name to be %q, got %q", expected, cdr.Header().Name)
}
}
+
+func TestNsAddrsExternal(t *testing.T) {
+
+ k := New([]string{"example.com."})
+ k.APIConn = &APIConnTest{}
+ k.localIPs = []net.IP{net.ParseIP("10.244.0.20")}
+
+ // initially no services have an external IP ...
+ cdrs := k.nsAddrs(true, k.Zones[0])
+
+ if len(cdrs) != 0 {
+ t.Fatalf("Expected 0 results, got %v", len(cdrs))
+
+ }
+
+ // Add an external IP to one of the services ...
+ svcs[0].ExternalIPs = []string{"1.2.3.4"}
+ cdrs = k.nsAddrs(true, k.Zones[0])
+
+ if len(cdrs) != 1 {
+ t.Fatalf("Expected 1 results, got %v", len(cdrs))
+
+ }
+ cdr := cdrs[0]
+ expected := "1.2.3.4"
+ if cdr.(*dns.A).A.String() != expected {
+ t.Errorf("Expected A address to be %q, got %q", expected, cdr.(*dns.A).A.String())
+ }
+ expected = "dns-service.kube-system.example.com."
+ if cdr.Header().Name != expected {
+ t.Errorf("Expected record name to be %q, got %q", expected, cdr.Header().Name)
+ }
+
+}