diff options
author | 2022-07-06 13:55:15 -0400 | |
---|---|---|
committer | 2022-07-06 13:55:15 -0400 | |
commit | e80d696502863f2e35099e6e366bb00418c28d80 (patch) | |
tree | 99e2c372668b6f7e73ab736ecb551b6997ccdd8e /plugin/kubernetes/external.go | |
parent | d903a963eeb3454996846811fb850ceb8c4fea81 (diff) | |
download | coredns-e80d696502863f2e35099e6e366bb00418c28d80.tar.gz coredns-e80d696502863f2e35099e6e366bb00418c28d80.tar.zst coredns-e80d696502863f2e35099e6e366bb00418c28d80.zip |
plugin/k8s_external: Add support for PTR requests (#5435)
* Exclude External IP addresses from being added to the existing kubernetes' plugin IP->Service index
* Add support for PTR requests on External IPs of Services to the k8s_external plugin
Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
Diffstat (limited to 'plugin/kubernetes/external.go')
-rw-r--r-- | plugin/kubernetes/external.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/plugin/kubernetes/external.go b/plugin/kubernetes/external.go index 74e7151fc..702bdc30c 100644 --- a/plugin/kubernetes/external.go +++ b/plugin/kubernetes/external.go @@ -14,6 +14,18 @@ import ( // External implements the ExternalFunc call from the external plugin. // It returns any services matching in the services' ExternalIPs. func (k *Kubernetes) External(state request.Request) ([]msg.Service, int) { + if state.QType() == dns.TypePTR { + ip := dnsutil.ExtractAddressFromReverse(state.Name()) + if ip != "" { + svcs, err := k.ExternalReverse(ip) + if err != nil { + return nil, dns.RcodeNameError + } + return svcs, dns.RcodeSuccess + } + // for invalid reverse names, fall through to determine proper nxdomain/nodata response + } + base, _ := dnsutil.TrimZone(state.Name(), state.Zone) segs := dns.SplitDomainName(base) @@ -76,6 +88,10 @@ func (k *Kubernetes) External(state request.Request) ([]msg.Service, int) { } } } + if state.QType() == dns.TypePTR { + // if this was a PTR request, return empty service list, but retain rcode for proper nxdomain/nodata response + return nil, rcode + } return services, rcode } @@ -111,3 +127,24 @@ func (k *Kubernetes) ExternalServices(zone string) (services []msg.Service) { func (k *Kubernetes) ExternalSerial(string) uint32 { return uint32(k.APIConn.Modified(true)) } + +// ExternalReverse does a reverse lookup for the external IPs +func (k *Kubernetes) ExternalReverse(ip string) ([]msg.Service, error) { + records := k.serviceRecordForExternalIP(ip) + if len(records) == 0 { + return records, errNoItems + } + return records, nil +} + +func (k *Kubernetes) serviceRecordForExternalIP(ip string) []msg.Service { + var svcs []msg.Service + for _, service := range k.APIConn.SvcExtIndexReverse(ip) { + if len(k.Namespaces) > 0 && !k.namespaceExposed(service.Namespace) { + continue + } + domain := strings.Join([]string{service.Name, service.Namespace}, ".") + svcs = append(svcs, msg.Service{Host: domain, TTL: k.ttl}) + } + return svcs +} |