Skip to content

Commit 975adec

Browse files
DNS services are not resolving properly
The change on Sept 15th changed how services resolved in the absence of search paths, which resulted in very long times to resolve DNS in some cases.
1 parent 0e08c78 commit 975adec

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

pkg/dns/server.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package dns
33
import (
44
client "k8s.io/kubernetes/pkg/client/unversioned"
55

6+
"github.com/golang/glog"
7+
68
"github.com/coreos/go-etcd/etcd"
79
"github.com/prometheus/client_golang/prometheus"
810
backendetcd "github.com/skynetservices/skydns/backends/etcd"
@@ -12,8 +14,9 @@ import (
1214
// NewServerDefaults returns the default SkyDNS server configuration for a DNS server.
1315
func NewServerDefaults() (*server.Config, error) {
1416
config := &server.Config{
15-
Domain: "cluster.local.",
16-
Local: "openshift.default.svc.cluster.local.",
17+
Domain: "cluster.local.",
18+
Local: "openshift.default.svc.cluster.local.",
19+
Verbose: bool(glog.V(4)),
1720
}
1821
return config, server.SetDefaults(config)
1922
}

pkg/dns/serviceresolver.go

+31-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"strings"
66

7+
"github.com/golang/glog"
8+
79
kapi "k8s.io/kubernetes/pkg/api"
810
"k8s.io/kubernetes/pkg/api/errors"
911
kclient "k8s.io/kubernetes/pkg/client/unversioned"
@@ -60,20 +62,20 @@ func NewServiceResolver(config *server.Config, accessor ServiceAccessor, endpoin
6062
// * endpoint_id is "portal" when portalIP is set
6163
// * endpoints always returns each individual endpoint as A records
6264
//
63-
func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error) {
64-
if !strings.HasSuffix(name, b.base) {
65+
func (b *ServiceResolver) Records(dnsName string, exact bool) ([]msg.Service, error) {
66+
if !strings.HasSuffix(dnsName, b.base) {
6567
return nil, nil
6668
}
67-
prefix := strings.Trim(strings.TrimSuffix(name, b.base), ".")
69+
prefix := strings.Trim(strings.TrimSuffix(dnsName, b.base), ".")
6870
segments := strings.Split(prefix, ".")
6971
for i, j := 0, len(segments)-1; i < j; i, j = i+1, j-1 {
7072
segments[i], segments[j] = segments[j], segments[i]
7173
}
7274
if len(segments) == 0 {
7375
return nil, nil
7476
}
75-
76-
switch segments[0] {
77+
glog.V(4).Infof("Answering query %s:%t", dnsName, exact)
78+
switch base := segments[0]; base {
7779
case "svc", "endpoints":
7880
if len(segments) < 3 {
7981
return nil, nil
@@ -94,7 +96,8 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
9496
return nil, nil
9597
}
9698

97-
retrieveEndpoints := segments[0] == "endpoints" || (len(segments) > 3 && segments[3] == "_endpoints")
99+
subdomain := buildDNSName(b.base, base, namespace, name)
100+
retrieveEndpoints := base == "endpoints" || (len(segments) > 3 && segments[3] == "_endpoints")
98101

99102
// if has a portal IP and looking at svc
100103
if svc.Spec.ClusterIP != kapi.ClusterIPNone && !retrieveEndpoints {
@@ -117,8 +120,8 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
117120
if len(portName) == 0 {
118121
portName = fmt.Sprintf("unknown-port-%d", port)
119122
}
120-
srvName := fmt.Sprintf("%s.portal.%s", portName, name)
121-
keyName := fmt.Sprintf("_%s._%s.%s", portName, p.Protocol, name)
123+
srvName := buildDNSName(subdomain, "portal", portName)
124+
keyName := buildDNSName(subdomain, "_"+strings.ToLower(string(p.Protocol)), "_"+portName)
122125
services = append(services,
123126
msg.Service{
124127
Host: svc.Spec.ClusterIP,
@@ -144,6 +147,7 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
144147
},
145148
)
146149
}
150+
glog.V(4).Infof("Answered %s:%t with %#v", dnsName, exact, services)
147151
return services, nil
148152
}
149153

@@ -181,11 +185,11 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
181185
if len(p.Protocol) == 0 {
182186
p.Protocol = kapi.ProtocolTCP
183187
}
184-
portName := p.Name
188+
portName := strings.ToLower(p.Name)
185189
if len(portName) == 0 {
186190
portName = fmt.Sprintf("unknown-port-%d", port)
187191
}
188-
srvName := fmt.Sprintf("%s.%s.%s", portName, shortName, name)
192+
srvName := buildDNSName(subdomain, shortName, portName)
189193
services = append(services, msg.Service{
190194
Host: a.IP,
191195
Port: port,
@@ -197,7 +201,7 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
197201
Text: "",
198202
Key: msg.Path(srvName),
199203
})
200-
keyName := fmt.Sprintf("_%s._%s.%s", portName, p.Protocol, name)
204+
keyName := buildDNSName(subdomain, "_"+strings.ToLower(string(p.Protocol)), "_"+portName)
201205
services = append(services, msg.Service{
202206
Host: srvName,
203207
Port: port,
@@ -225,6 +229,7 @@ func (b *ServiceResolver) Records(name string, exact bool) ([]msg.Service, error
225229
}
226230
}
227231
}
232+
glog.V(4).Infof("Answered %s:%t with %#v", dnsName, exact, services)
228233
return services, nil
229234
}
230235
return nil, nil
@@ -246,8 +251,9 @@ func (b *ServiceResolver) ReverseRecord(name string) (*msg.Service, error) {
246251
if len(svc.Spec.Ports) > 0 {
247252
port = svc.Spec.Ports[0].Port
248253
}
254+
hostName := buildDNSName(b.base, "svc", svc.Namespace, svc.Name)
249255
return &msg.Service{
250-
Host: fmt.Sprintf("%s.%s.svc.%s", svc.Name, svc.Namespace, b.base),
256+
Host: hostName,
251257
Port: port,
252258

253259
Priority: 10,
@@ -278,3 +284,16 @@ func extractIP(reverseName string) (string, bool) {
278284
}
279285
return strings.Join(segments, "."), true
280286
}
287+
288+
// buildDNSName reverses the labels order and joins them with dots.
289+
func buildDNSName(labels ...string) string {
290+
var res string
291+
for _, label := range labels {
292+
if res == "" {
293+
res = label
294+
} else {
295+
res = fmt.Sprintf("%s.%s", label, res)
296+
}
297+
}
298+
return res
299+
}

0 commit comments

Comments
 (0)