Skip to content

Commit

Permalink
fix kubernetes in-cluster CNAME lookup
Browse files Browse the repository at this point in the history
fix coredns#2038

Signed-off-by: bingshen.wbs <bingshen.wbs@alibaba-inc.com>
  • Loading branch information
BSWANG committed Aug 23, 2018
1 parent b87ed01 commit aff2b2b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
22 changes: 12 additions & 10 deletions plugin/backend_lookup.go
Expand Up @@ -40,17 +40,19 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
if dnsutil.DuplicateCNAME(newRecord, previousRecords) {
continue
}

state1 := state.NewWithQuestion(serv.Host, state.QType())
nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt)

if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
if dns.IsSubDomain(zone, serv.Host) {
state1 := state.NewWithQuestion(serv.Host, state.QType())
state1.Zone = zone
nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt)

if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
}
continue
}
continue
}
// This means we can not complete the CNAME, try to look else where.
target := newRecord.Target
Expand Down
24 changes: 24 additions & 0 deletions plugin/kubernetes/handler_test.go
Expand Up @@ -183,6 +183,15 @@ var dnsTestCases = []test.Case{
test.CNAME("external.testns.svc.cluster.local. 5 IN CNAME ext.interwebs.test."),
},
},
// CNAME External To Internal Service
{
Qname: "external-to-service.testns.svc.cluster.local", Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess,
Answer: []dns.RR{
test.CNAME("external-to-service.testns.svc.cluster.local. 5 IN CNAME svc1.testns.svc.cluster.local."),
test.A("svc1.testns.svc.cluster.local. 5 IN A 10.0.0.1"),
},
},
// AAAA Service (with an existing A record, but no AAAA record)
{
Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypeAAAA,
Expand Down Expand Up @@ -420,6 +429,21 @@ var svcIndex = map[string][]*api.Service{
Type: api.ServiceTypeExternalName,
},
}},
"external-to-service.testns": {{
ObjectMeta: meta.ObjectMeta{
Name: "external-to-service",
Namespace: "testns",
},
Spec: api.ServiceSpec{
ExternalName: "svc1.testns.svc.cluster.local.",
Ports: []api.ServicePort{{
Name: "http",
Protocol: "tcp",
Port: 80,
}},
Type: api.ServiceTypeExternalName,
},
}},
}

func (APIConnServeTest) SvcIndex(s string) []*api.Service {
Expand Down
12 changes: 6 additions & 6 deletions plugin/kubernetes/parse_test.go
Expand Up @@ -14,17 +14,17 @@ func TestParseRequest(t *testing.T) {
expected string // output from r.String()
}{
// valid SRV request
{"_http._tcp.webs.mynamespace.svc.inter.webs.test.", "http.tcp..webs.mynamespace.svc"},
{"_http._tcp.webs.mynamespace.svc.inter.webs.tests.", "http.tcp..webs.mynamespace.svc"},
// wildcard acceptance
{"*.any.*.any.svc.inter.webs.test.", "*.any..*.any.svc"},
{"*.any.*.any.svc.inter.webs.tests.", "*.any..*.any.svc"},
// A request of endpoint
{"1-2-3-4.webs.mynamespace.svc.inter.webs.test.", "*.*.1-2-3-4.webs.mynamespace.svc"},
{"1-2-3-4.webs.mynamespace.svc.inter.webs.tests.", "*.*.1-2-3-4.webs.mynamespace.svc"},
// bare zone
{"inter.webs.test.", "....."},
{"inter.webs.tests.", "....."},
// bare svc type
{"svc.inter.webs.test.", "....."},
{"svc.inter.webs.tests.", "....."},
// bare pod type
{"pod.inter.webs.test.", "....."},
{"pod.inter.webs.tests.", "....."},
}
for i, tc := range tests {
m := new(dns.Msg)
Expand Down

0 comments on commit aff2b2b

Please sign in to comment.