diff options
Diffstat (limited to 'plugin/kubernetes/setup.go')
-rw-r--r-- | plugin/kubernetes/setup.go | 295 |
1 files changed, 156 insertions, 139 deletions
diff --git a/plugin/kubernetes/setup.go b/plugin/kubernetes/setup.go index f79724dee..fda3e1701 100644 --- a/plugin/kubernetes/setup.go +++ b/plugin/kubernetes/setup.go @@ -26,25 +26,36 @@ func init() { } func setup(c *caddy.Controller) error { - kubernetes, initOpts, err := kubernetesParse(c) + k, err := kubernetesParse(c) if err != nil { return plugin.Error("kubernetes", err) } - err = kubernetes.initKubeCache(initOpts) + err = k.InitKubeCache() if err != nil { return plugin.Error("kubernetes", err) } - // Register KubeCache start and stop functions with Caddy + k.RegisterKubeCache(c) + + dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { + k.Next = next + return k + }) + + return nil +} + +// RegisterKubeCache registers KubeCache start and stop functions with Caddy +func (k *Kubernetes) RegisterKubeCache(c *caddy.Controller) { c.OnStartup(func() error { - go kubernetes.APIConn.Run() - if kubernetes.APIProxy != nil { - kubernetes.APIProxy.Run() + go k.APIConn.Run() + if k.APIProxy != nil { + k.APIProxy.Run() } synced := false for synced == false { - synced = kubernetes.APIConn.HasSynced() + synced = k.APIConn.HasSynced() time.Sleep(100 * time.Millisecond) } @@ -52,21 +63,31 @@ func setup(c *caddy.Controller) error { }) c.OnShutdown(func() error { - if kubernetes.APIProxy != nil { - kubernetes.APIProxy.Stop() + if k.APIProxy != nil { + k.APIProxy.Stop() } - return kubernetes.APIConn.Stop() - }) - - dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { - kubernetes.Next = next - return kubernetes + return k.APIConn.Stop() }) +} - return nil +func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) { + var k8s *Kubernetes + var err error + for i := 1; c.Next(); i++ { + if i > 1 { + return nil, fmt.Errorf("only one kubernetes section allowed per server block") + } + k8s, err = ParseStanza(c) + if err != nil { + return k8s, err + } + } + return k8s, nil } -func kubernetesParse(c *caddy.Controller) (*Kubernetes, dnsControlOpts, error) { +// ParseStanza parses a kubernetes stanza +func ParseStanza(c *caddy.Controller) (*Kubernetes, error) { + k8s := New([]string{""}) k8s.interfaceAddrsFunc = localPodIP k8s.autoPathSearch = searchFromResolvConf() @@ -74,145 +95,141 @@ func kubernetesParse(c *caddy.Controller) (*Kubernetes, dnsControlOpts, error) { opts := dnsControlOpts{ resyncPeriod: defaultResyncPeriod, } + k8s.opts = opts - for i := 1; c.Next(); i++ { - if i > 1 { - return nil, opts, fmt.Errorf("only one kubernetes section allowed per server block") - } - zones := c.RemainingArgs() + zones := c.RemainingArgs() - if len(zones) != 0 { - k8s.Zones = zones - for i := 0; i < len(k8s.Zones); i++ { - k8s.Zones[i] = plugin.Host(k8s.Zones[i]).Normalize() - } - } else { - k8s.Zones = make([]string, len(c.ServerBlockKeys)) - for i := 0; i < len(c.ServerBlockKeys); i++ { - k8s.Zones[i] = plugin.Host(c.ServerBlockKeys[i]).Normalize() - } + if len(zones) != 0 { + k8s.Zones = zones + for i := 0; i < len(k8s.Zones); i++ { + k8s.Zones[i] = plugin.Host(k8s.Zones[i]).Normalize() } - - k8s.primaryZoneIndex = -1 - for i, z := range k8s.Zones { - if strings.HasSuffix(z, "in-addr.arpa.") || strings.HasSuffix(z, "ip6.arpa.") { - continue - } - k8s.primaryZoneIndex = i - break + } else { + k8s.Zones = make([]string, len(c.ServerBlockKeys)) + for i := 0; i < len(c.ServerBlockKeys); i++ { + k8s.Zones[i] = plugin.Host(c.ServerBlockKeys[i]).Normalize() } + } - if k8s.primaryZoneIndex == -1 { - return nil, opts, errors.New("non-reverse zone name must be used") + k8s.primaryZoneIndex = -1 + for i, z := range k8s.Zones { + if strings.HasSuffix(z, "in-addr.arpa.") || strings.HasSuffix(z, "ip6.arpa.") { + continue } + k8s.primaryZoneIndex = i + break + } + + if k8s.primaryZoneIndex == -1 { + return nil, errors.New("non-reverse zone name must be used") + } - for c.NextBlock() { - switch c.Val() { - case "endpoint_pod_names": - args := c.RemainingArgs() - if len(args) > 0 { - return nil, opts, c.ArgErr() + for c.NextBlock() { + switch c.Val() { + case "endpoint_pod_names": + args := c.RemainingArgs() + if len(args) > 0 { + return nil, c.ArgErr() + } + k8s.endpointNameMode = true + continue + case "pods": + args := c.RemainingArgs() + if len(args) == 1 { + switch args[0] { + case podModeDisabled, podModeInsecure, podModeVerified: + k8s.podMode = args[0] + default: + return nil, fmt.Errorf("wrong value for pods: %s, must be one of: disabled, verified, insecure", args[0]) } - k8s.endpointNameMode = true continue - case "pods": - args := c.RemainingArgs() - if len(args) == 1 { - switch args[0] { - case podModeDisabled, podModeInsecure, podModeVerified: - k8s.podMode = args[0] - default: - return nil, opts, fmt.Errorf("wrong value for pods: %s, must be one of: disabled, verified, insecure", args[0]) - } - continue - } - return nil, opts, c.ArgErr() - case "namespaces": - args := c.RemainingArgs() - if len(args) > 0 { - for _, a := range args { - k8s.Namespaces[a] = true - } - continue - } - return nil, opts, c.ArgErr() - case "endpoint": - args := c.RemainingArgs() - if len(args) > 0 { - k8s.APIServerList = args - continue - } - return nil, opts, c.ArgErr() - case "tls": // cert key cacertfile - args := c.RemainingArgs() - if len(args) == 3 { - k8s.APIClientCert, k8s.APIClientKey, k8s.APICertAuth = args[0], args[1], args[2] - continue - } - return nil, opts, c.ArgErr() - case "resyncperiod": - args := c.RemainingArgs() - if len(args) > 0 { - rp, err := time.ParseDuration(args[0]) - if err != nil { - return nil, opts, fmt.Errorf("unable to parse resync duration value: '%v': %v", args[0], err) - } - opts.resyncPeriod = rp - continue - } - return nil, opts, c.ArgErr() - case "labels": - args := c.RemainingArgs() - if len(args) > 0 { - labelSelectorString := strings.Join(args, " ") - ls, err := meta.ParseToLabelSelector(labelSelectorString) - if err != nil { - return nil, opts, fmt.Errorf("unable to parse label selector value: '%v': %v", labelSelectorString, err) - } - opts.labelSelector = ls - continue - } - return nil, opts, c.ArgErr() - case "fallthrough": - k8s.Fall.SetZonesFromArgs(c.RemainingArgs()) - case "upstream": - args := c.RemainingArgs() - if len(args) == 0 { - return nil, opts, c.ArgErr() - } - ups, err := dnsutil.ParseHostPortOrFile(args...) - if err != nil { - return nil, opts, err - } - k8s.Proxy = proxy.NewLookup(ups) - case "ttl": - args := c.RemainingArgs() - if len(args) == 0 { - return nil, opts, c.ArgErr() + } + return nil, c.ArgErr() + case "namespaces": + args := c.RemainingArgs() + if len(args) > 0 { + for _, a := range args { + k8s.Namespaces[a] = true } - t, err := strconv.Atoi(args[0]) + continue + } + return nil, c.ArgErr() + case "endpoint": + args := c.RemainingArgs() + if len(args) > 0 { + k8s.APIServerList = args + continue + } + return nil, c.ArgErr() + case "tls": // cert key cacertfile + args := c.RemainingArgs() + if len(args) == 3 { + k8s.APIClientCert, k8s.APIClientKey, k8s.APICertAuth = args[0], args[1], args[2] + continue + } + return nil, c.ArgErr() + case "resyncperiod": + args := c.RemainingArgs() + if len(args) > 0 { + rp, err := time.ParseDuration(args[0]) if err != nil { - return nil, opts, err + return nil, fmt.Errorf("unable to parse resync duration value: '%v': %v", args[0], err) } - if t < 5 || t > 3600 { - return nil, opts, c.Errf("ttl must be in range [5, 3600]: %d", t) - } - k8s.ttl = uint32(t) - case "transfer": - tos, froms, err := parse.Transfer(c, false) + k8s.opts.resyncPeriod = rp + continue + } + return nil, c.ArgErr() + case "labels": + args := c.RemainingArgs() + if len(args) > 0 { + labelSelectorString := strings.Join(args, " ") + ls, err := meta.ParseToLabelSelector(labelSelectorString) if err != nil { - return nil, opts, err - } - if len(froms) != 0 { - return nil, opts, c.Errf("transfer from is not supported with this plugin") + return nil, fmt.Errorf("unable to parse label selector value: '%v': %v", labelSelectorString, err) } - k8s.TransferTo = tos - default: - return nil, opts, c.Errf("unknown property '%s'", c.Val()) + k8s.opts.labelSelector = ls + continue + } + return nil, c.ArgErr() + case "fallthrough": + k8s.Fall.SetZonesFromArgs(c.RemainingArgs()) + case "upstream": + args := c.RemainingArgs() + if len(args) == 0 { + return nil, c.ArgErr() + } + ups, err := dnsutil.ParseHostPortOrFile(args...) + if err != nil { + return nil, err + } + k8s.Proxy = proxy.NewLookup(ups) + case "ttl": + args := c.RemainingArgs() + if len(args) == 0 { + return nil, c.ArgErr() + } + t, err := strconv.Atoi(args[0]) + if err != nil { + return nil, err + } + if t < 5 || t > 3600 { + return nil, c.Errf("ttl must be in range [5, 3600]: %d", t) + } + k8s.ttl = uint32(t) + case "transfer": + tos, froms, err := parse.Transfer(c, false) + if err != nil { + return nil, err + } + if len(froms) != 0 { + return nil, c.Errf("transfer from is not supported with this plugin") } + k8s.TransferTo = tos + default: + return nil, c.Errf("unknown property '%s'", c.Val()) } } - return k8s, opts, nil + return k8s, nil } func searchFromResolvConf() []string { |