Watch feature (#1527)
* Add part 1 watch functionality. (squashed) * add funcs for service/endpoint fqdns * add endpoints watch * document exposed funcs * only send subset deltas * locking for watch map * tests and docs * add pod watch * remove debugs prints * feedback part 1 * add error reporting to proto * inform clients of server stop+errors * add grpc options param * use proper context * Review feedback: * Removed client (will move to another repo) * Use new log functions * Change watchChan to be for string not []string * Rework how k8s plugin stores watch tracking info to simplify * Normalize the qname on watch request * Add blank line back * Revert another spurious change * Fix tests * Add stop channel. Fix tests. Better docs for plugin interface. * fmt.Printf -> log.Warningf * Move from dnsserver to plugin/pkg/watch * gofmt * remove dead client watches * sate linter * linter omg
This commit is contained in:
parent
b7480d5d12
commit
99287d091c
17 changed files with 980 additions and 60 deletions
|
@ -260,6 +260,8 @@ func (k *Kubernetes) InitKubeCache() (err error) {
|
|||
|
||||
k.opts.initPodCache = k.podMode == podModeVerified
|
||||
|
||||
k.opts.zones = k.Zones
|
||||
k.opts.endpointNameMode = k.endpointNameMode
|
||||
k.APIConn = newdnsController(kubeClient, k.opts)
|
||||
|
||||
return err
|
||||
|
@ -292,6 +294,29 @@ func (k *Kubernetes) Records(state request.Request, exact bool) ([]msg.Service,
|
|||
return services, err
|
||||
}
|
||||
|
||||
// serviceFQDN returns the k8s cluster dns spec service FQDN for the service (or endpoint) object.
|
||||
func serviceFQDN(obj meta.Object, zone string) string {
|
||||
return dnsutil.Join(append([]string{}, obj.GetName(), obj.GetNamespace(), Svc, zone))
|
||||
}
|
||||
|
||||
// podFQDN returns the k8s cluster dns spec FQDN for the pod.
|
||||
func podFQDN(p *api.Pod, zone string) string {
|
||||
name := strings.Replace(p.Status.PodIP, ".", "-", -1)
|
||||
name = strings.Replace(name, ":", "-", -1)
|
||||
return dnsutil.Join(append([]string{}, name, p.GetNamespace(), Pod, zone))
|
||||
}
|
||||
|
||||
// endpointFQDN returns a list of k8s cluster dns spec service FQDNs for each subset in the endpoint.
|
||||
func endpointFQDN(ep *api.Endpoints, zone string, endpointNameMode bool) []string {
|
||||
var names []string
|
||||
for _, ss := range ep.Subsets {
|
||||
for _, addr := range ss.Addresses {
|
||||
names = append(names, dnsutil.Join(append([]string{}, endpointHostname(addr, endpointNameMode), serviceFQDN(ep, zone))))
|
||||
}
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
func endpointHostname(addr api.EndpointAddress, endpointNameMode bool) string {
|
||||
if addr.Hostname != "" {
|
||||
return strings.ToLower(addr.Hostname)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue