Kubernetes cleanup6 (#887)

* mw/kubernetes: handle dns.TypeNS better.

* mw/kubernetes: cleanup typeNS replies a bit.
This commit is contained in:
Miek Gieben 2017-08-10 22:14:19 +01:00 committed by GitHub
parent ea77f2a2ca
commit a38a34c7e0
3 changed files with 8 additions and 27 deletions

View file

@ -25,7 +25,7 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
// otherwise delegate to the next in the pipeline. // otherwise delegate to the next in the pipeline.
zone := middleware.Zones(k.Zones).Matches(state.Name()) zone := middleware.Zones(k.Zones).Matches(state.Name())
if zone == "" { if zone == "" {
if state.Type() != "PTR" { if state.QType() != dns.TypePTR {
return middleware.NextOrFailure(k.Name(), k.Next, ctx, w, r) return middleware.NextOrFailure(k.Name(), k.Next, ctx, w, r)
} }
// If this is a PTR request, and the request is in a defined // If this is a PTR request, and the request is in a defined

View file

@ -86,7 +86,6 @@ var (
errNoItems = errors.New("no items found") errNoItems = errors.New("no items found")
errNsNotExposed = errors.New("namespace is not exposed") errNsNotExposed = errors.New("namespace is not exposed")
errInvalidRequest = errors.New("invalid query name") errInvalidRequest = errors.New("invalid query name")
errZoneNotFound = errors.New("zone not found")
errAPIBadPodType = errors.New("expected type *api.Pod") errAPIBadPodType = errors.New("expected type *api.Pod")
errPodsDisabled = errors.New("pod records disabled") errPodsDisabled = errors.New("pod records disabled")
) )
@ -97,7 +96,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
// We're looking again at types, which we've already done in ServeDNS, but there are some types k8s just can't answer. // We're looking again at types, which we've already done in ServeDNS, but there are some types k8s just can't answer.
switch state.QType() { switch state.QType() {
case dns.TypeTXT: case dns.TypeTXT:
// 1 label + zone, label must be "dns-version" // 1 label + zone, label must be "dns-version".
t, err := dnsutil.TrimZone(state.Name(), state.Zone) t, err := dnsutil.TrimZone(state.Name(), state.Zone)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -111,6 +110,11 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
} }
svc := msg.Service{Text: DNSSchemaVersion, TTL: 28800, Key: msg.Path(state.QName(), "coredns")} svc := msg.Service{Text: DNSSchemaVersion, TTL: 28800, Key: msg.Path(state.QName(), "coredns")}
return []msg.Service{svc}, nil, nil return []msg.Service{svc}, nil, nil
case dns.TypeNS:
// We can only get here if the qname equal the zone, see ServeDNS in handler.go.
ns := k.coreDNSRecord()
svc := msg.Service{Host: ns.A.String(), Key: msg.Path(state.QName(), "coredns")}
return []msg.Service{svc}, nil, nil
} }
r, e := k.parseRequest(state.Name(), state.QType(), state.Zone) r, e := k.parseRequest(state.Name(), state.QType(), state.Zone)
@ -142,20 +146,10 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
} }
} }
return noext, nil, e return noext, nil, e
case dns.TypeNS:
srv := k.recordsForNS(r)
svcs = append(svcs, srv)
return svcs, nil, err
} }
return nil, nil, nil return nil, nil, nil
} }
func (k *Kubernetes) recordsForNS(r recordRequest) msg.Service {
ns := k.coreDNSRecord()
return msg.Service{Host: ns.A.String(),
Key: msg.Path(strings.Join([]string{ns.Hdr.Name, r.zone}, "."), "coredns")}
}
// PrimaryZone will return the first non-reverse zone being handled by this middleware // PrimaryZone will return the first non-reverse zone being handled by this middleware
func (k *Kubernetes) PrimaryZone() string { func (k *Kubernetes) PrimaryZone() string {
return k.Zones[k.primaryZone] return k.Zones[k.primaryZone]
@ -168,7 +162,7 @@ func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dn
// IsNameError implements the ServiceBackend interface. // IsNameError implements the ServiceBackend interface.
func (k *Kubernetes) IsNameError(err error) bool { func (k *Kubernetes) IsNameError(err error) bool {
return err == errNoItems || err == errNsNotExposed || err == errInvalidRequest || err == errZoneNotFound return err == errNoItems || err == errNsNotExposed || err == errInvalidRequest
} }
// Debug implements the ServiceBackend interface. // Debug implements the ServiceBackend interface.

View file

@ -6,19 +6,6 @@ import "net"
import "k8s.io/client-go/1.5/pkg/api" import "k8s.io/client-go/1.5/pkg/api"
import "github.com/miekg/dns" import "github.com/miekg/dns"
func TestRecordForNS(t *testing.T) {
k := Kubernetes{Zones: []string{"inter.webs.test."}}
corednsRecord.Hdr.Name = "coredns.kube-system."
corednsRecord.A = net.IP("1.2.3.4")
r, _ := k.parseRequest("inter.webs.test.", dns.TypeNS, "inter.webs.test.")
expected := "/coredns/test/webs/inter/kube-system/coredns"
svc := k.recordsForNS(r)
if svc.Key != expected {
t.Errorf("Expected result '%v'. Instead got result '%v'.", expected, svc.Key)
}
}
func TestDefaultNSMsg(t *testing.T) { func TestDefaultNSMsg(t *testing.T) {
k := Kubernetes{Zones: []string{"inter.webs.test."}} k := Kubernetes{Zones: []string{"inter.webs.test."}}
corednsRecord.Hdr.Name = "coredns.kube-system." corednsRecord.Hdr.Name = "coredns.kube-system."