aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/kubernetes.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes/kubernetes.go')
-rw-r--r--middleware/kubernetes/kubernetes.go71
1 files changed, 52 insertions, 19 deletions
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index d4a255935..a1e6bdb73 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -28,26 +28,35 @@ import (
// Kubernetes implements a middleware that connects to a Kubernetes cluster.
type Kubernetes struct {
- Next middleware.Handler
- Zones []string
- primaryZone int
- Proxy proxy.Proxy // Proxy for looking up names during the resolution process
- APIEndpoint string
- APICertAuth string
- APIClientCert string
- APIClientKey string
- APIConn dnsController
- ResyncPeriod time.Duration
- Namespaces []string
- Federations []Federation
- LabelSelector *unversionedapi.LabelSelector
- Selector *labels.Selector
- PodMode string
- ReverseCidrs []net.IPNet
- Fallthrough bool
+ Next middleware.Handler
+ Zones []string
+ primaryZone int
+ Proxy proxy.Proxy // Proxy for looking up names during the resolution process
+ APIEndpoint string
+ APICertAuth string
+ APIClientCert string
+ APIClientKey string
+ APIConn dnsController
+ ResyncPeriod time.Duration
+ Namespaces []string
+ Federations []Federation
+ LabelSelector *unversionedapi.LabelSelector
+ Selector *labels.Selector
+ PodMode string
+ ReverseCidrs []net.IPNet
+ Fallthrough bool
+ AutoPath
interfaceAddrs interfaceAddrser
}
+type AutoPath struct {
+ Enabled bool
+ NDots int
+ ResolvConfFile string
+ HostSearchPath []string
+ OnNXDOMAIN int
+}
+
const (
// PodModeDisabled is the default value where pod requests are ignored
PodModeDisabled = "disabled"
@@ -97,6 +106,7 @@ var errInvalidRequest = errors.New("invalid query name")
var errZoneNotFound = errors.New("zone not found")
var errAPIBadPodType = errors.New("expected type *api.Pod")
var errPodsDisabled = errors.New("pod records disabled")
+var errResolvConfReadErr = errors.New("resolv.conf read error")
// Services implements the ServiceBackend interface.
func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) (svcs []msg.Service, debug []msg.Service, err error) {
@@ -183,7 +193,7 @@ func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dn
// IsNameError implements the ServiceBackend interface.
func (k *Kubernetes) IsNameError(err error) bool {
- return err == errNoItems || err == errNsNotExposed || err == errInvalidRequest
+ return err == errNoItems || err == errNsNotExposed || err == errInvalidRequest || err == errZoneNotFound
}
// Debug implements the ServiceBackend interface.
@@ -245,7 +255,7 @@ func (k *Kubernetes) InitKubeCache() (err error) {
}
opts := dnsControlOpts{
- initPodCache: k.PodMode == PodModeVerified,
+ initPodCache: (k.PodMode == PodModeVerified || k.AutoPath.Enabled),
}
k.APIConn = newdnsController(kubeClient, k.ResyncPeriod, k.Selector, opts)
@@ -448,6 +458,21 @@ func ipFromPodName(podname string) string {
return strings.Replace(podname, "-", ":", -1)
}
+func (k *Kubernetes) findPodWithIP(ip string) (p *api.Pod) {
+ if k.PodMode != PodModeVerified {
+ return nil
+ }
+ objList := k.APIConn.PodIndex(ip)
+ for _, o := range objList {
+ p, ok := o.(*api.Pod)
+ if !ok {
+ return nil
+ }
+ return p
+ }
+ return nil
+}
+
func (k *Kubernetes) findPods(namespace, podname string) (pods []pod, err error) {
if k.PodMode == PodModeDisabled {
return pods, errPodsDisabled
@@ -634,3 +659,11 @@ func (k *Kubernetes) localPodIP() net.IP {
}
return nil
}
+
+func splitSearch(zone, question, namespace string) (name, search string, ok bool) {
+ search = strings.Join([]string{namespace, "svc", zone}, ".")
+ if dns.IsSubDomain(search, question) {
+ return question[:len(question)-len(search)-1], search, true
+ }
+ return "", "", false
+}