Skip to content

Commit b81b382

Browse files
author
OpenShift Bot
authored
Merge pull request #11790 from smarterclayton/support_external_name_dns
Merged by openshift-bot
2 parents 3c28ed4 + a3f4e25 commit b81b382

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

pkg/dns/serviceresolver.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func (b *ServiceResolver) Records(dnsName string, exact bool) ([]msg.Service, er
128128
}
129129

130130
// no clusterIP and not headless, no DNS
131-
if len(svc.Spec.ClusterIP) == 0 {
131+
if len(svc.Spec.ClusterIP) == 0 && svc.Spec.Type != kapi.ServiceTypeExternalName {
132132
return nil, errNoSuchName
133133
}
134134

@@ -140,8 +140,13 @@ func (b *ServiceResolver) Records(dnsName string, exact bool) ([]msg.Service, er
140140

141141
// if has a portal IP and looking at svc
142142
if svc.Spec.ClusterIP != kapi.ClusterIPNone && !retrieveEndpoints {
143+
hostValue := svc.Spec.ClusterIP
144+
if svc.Spec.Type == kapi.ServiceTypeExternalName {
145+
hostValue = svc.Spec.ExternalName
146+
}
147+
143148
defaultService := msg.Service{
144-
Host: svc.Spec.ClusterIP,
149+
Host: hostValue,
145150
Port: 0,
146151

147152
Priority: 10,
@@ -153,6 +158,7 @@ func (b *ServiceResolver) Records(dnsName string, exact bool) ([]msg.Service, er
153158
defaultService.Key = msg.Path(defaultName)
154159

155160
if len(svc.Spec.Ports) == 0 || !includePorts {
161+
glog.V(4).Infof("Answered %s:%t with %#v", dnsName, exact, defaultService)
156162
return []msg.Service{defaultService}, nil
157163
}
158164

@@ -175,7 +181,7 @@ func (b *ServiceResolver) Records(dnsName string, exact bool) ([]msg.Service, er
175181
keyName := buildDNSName(defaultName, protocolSegment, portSegment)
176182
services = append(services,
177183
msg.Service{
178-
Host: svc.Spec.ClusterIP,
184+
Host: hostValue,
179185
Port: int(port),
180186

181187
Priority: 10,

test/extended/dns/dns.go

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ func digForNames(namesToResolve []string, expect sets.String) string {
6464
return probeCmd
6565
}
6666

67+
func digForCNAMEs(namesToResolve []string, expect sets.String) string {
68+
fileNamePrefix := "test"
69+
var probeCmd string
70+
for _, name := range namesToResolve {
71+
// Resolve by TCP and UDP DNS. Use $$(...) because $(...) is
72+
// expanded by kubernetes (though this won't expand so should
73+
// remain a literal, safe > sorry).
74+
lookup := "CNAME"
75+
fileName := fmt.Sprintf("%s_udp@%s", fileNamePrefix, name)
76+
expect.Insert(fileName)
77+
probeCmd += fmt.Sprintf(`test -n "$$(dig +notcp +noall +answer +search %s %s)" && echo %q;`, name, lookup, fileName)
78+
fileName = fmt.Sprintf("%s_tcp@%s", fileNamePrefix, name)
79+
expect.Insert(fileName)
80+
probeCmd += fmt.Sprintf(`test -n "$$(dig +tcp +noall +answer +search %s %s)" && echo %q;`, name, lookup, fileName)
81+
}
82+
return probeCmd
83+
}
6784
func digForARecords(records map[string][]string, expect sets.String) string {
6885
var probeCmd string
6986
fileNamePrefix := "test"
@@ -178,8 +195,8 @@ func validateDNSResults(f *e2e.Framework, pod *api.Pod, fileNames sets.String, e
178195
e2e.Logf("DNS probes using %s succeeded\n", pod.Name)
179196
}
180197

181-
func createServiceSpec(serviceName string, isHeadless bool, selector map[string]string) *api.Service {
182-
headlessService := &api.Service{
198+
func createServiceSpec(serviceName string, isHeadless bool, externalName string, selector map[string]string) *api.Service {
199+
s := &api.Service{
183200
ObjectMeta: api.ObjectMeta{
184201
Name: serviceName,
185202
},
@@ -191,9 +208,14 @@ func createServiceSpec(serviceName string, isHeadless bool, selector map[string]
191208
},
192209
}
193210
if isHeadless {
194-
headlessService.Spec.ClusterIP = "None"
211+
s.Spec.ClusterIP = "None"
195212
}
196-
return headlessService
213+
if len(externalName) > 0 {
214+
s.Spec.Type = api.ServiceTypeExternalName
215+
s.Spec.ExternalName = externalName
216+
s.Spec.ClusterIP = ""
217+
}
218+
return s
197219
}
198220

199221
func createEndpointSpec(name string) *api.Endpoints {
@@ -233,18 +255,21 @@ var _ = Describe("DNS", func() {
233255
f := e2e.NewDefaultFramework("dns")
234256

235257
It("should answer endpoint and wildcard queries for the cluster [Conformance]", func() {
236-
if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("headless", true, nil)); err != nil {
258+
if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("headless", true, "", nil)); err != nil {
237259
e2e.Failf("unable to create headless service: %v", err)
238260
}
239261
if _, err := f.Client.Endpoints(f.Namespace.Name).Create(createEndpointSpec("headless")); err != nil {
240262
e2e.Failf("unable to create clusterip endpoints: %v", err)
241263
}
242-
if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("clusterip", false, nil)); err != nil {
264+
if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("clusterip", false, "", nil)); err != nil {
243265
e2e.Failf("unable to create clusterip service: %v", err)
244266
}
245267
if _, err := f.Client.Endpoints(f.Namespace.Name).Create(createEndpointSpec("clusterip")); err != nil {
246268
e2e.Failf("unable to create clusterip endpoints: %v", err)
247269
}
270+
if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("externalname", true, "www.google.com", nil)); err != nil {
271+
e2e.Failf("unable to create externalName service: %v", err)
272+
}
248273

249274
ep, err := f.Client.Endpoints("default").Get("kubernetes")
250275
if err != nil {
@@ -270,6 +295,11 @@ var _ = Describe("DNS", func() {
270295
fmt.Sprintf("prefix.clusterip.%s", f.Namespace.Name),
271296
}, expect),
272297

298+
// the DNS pod should be able to get a CNAME for this service
299+
digForCNAMEs([]string{
300+
fmt.Sprintf("externalname.%s.svc", f.Namespace.Name),
301+
}, expect),
302+
273303
// the DNS pod should be able to look up endpoints for names and wildcards
274304
digForARecords(map[string][]string{
275305
"kubernetes.default.endpoints": kubeEndpoints,

test/extended/setup.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ readonly CONFORMANCE_TESTS=(
291291
"Ensure supplemental groups propagate to docker"
292292
"EmptyDir"
293293
"PetSet"
294+
"DNS for ExternalName services"
295+
"DNS for pods for Hostname and Subdomain annotation"
294296
"PrivilegedPod should test privileged pod"
295297
"Pods should support remote command execution"
296298
"Pods should support retrieving logs from the container"

0 commit comments

Comments
 (0)