diff options
Diffstat (limited to 'middleware/kubernetes/setup.go')
-rw-r--r-- | middleware/kubernetes/setup.go | 218 |
1 files changed, 94 insertions, 124 deletions
diff --git a/middleware/kubernetes/setup.go b/middleware/kubernetes/setup.go index 071db851a..2e531e859 100644 --- a/middleware/kubernetes/setup.go +++ b/middleware/kubernetes/setup.go @@ -3,8 +3,6 @@ package kubernetes import ( "errors" "fmt" - "log" - "net" "strings" "time" @@ -74,141 +72,113 @@ func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) { k8s.autoPathSearch = searchFromResolvConf() for c.Next() { - if c.Val() == "kubernetes" { - zones := c.RemainingArgs() - - if len(zones) != 0 { - k8s.Zones = zones - middleware.Zones(k8s.Zones).Normalize() - } else { - k8s.Zones = make([]string, len(c.ServerBlockKeys)) - for i := 0; i < len(c.ServerBlockKeys); i++ { - k8s.Zones[i] = middleware.Host(c.ServerBlockKeys[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 + zones := c.RemainingArgs() + + if len(zones) != 0 { + k8s.Zones = zones + middleware.Zones(k8s.Zones).Normalize() + } else { + k8s.Zones = make([]string, len(c.ServerBlockKeys)) + for i := 0; i < len(c.ServerBlockKeys); i++ { + k8s.Zones[i] = middleware.Host(c.ServerBlockKeys[i]).Normalize() } + } - if k8s.primaryZoneIndex == -1 { - return nil, errors.New("non-reverse zone name must be given for Kubernetes") + 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 + } - for c.NextBlock() { - switch c.Val() { - case "cidrs": - - // DEPRECATION WARNING - log.Printf("[WARNING] \"cidrs\" will be removed for CoreDNS soon. See https://coredns.io/2017/07/23/corefile-explained#reverse-zones for the replacement") - - args := c.RemainingArgs() - if len(args) > 0 { - for _, cidrStr := range args { - _, cidr, err := net.ParseCIDR(cidrStr) - if err != nil { - return nil, fmt.Errorf("invalid cidr: %s", cidrStr) - } - k8s.ReverseCidrs = append(k8s.ReverseCidrs, *cidr) + if k8s.primaryZoneIndex == -1 { + return nil, errors.New("non-reverse zone name must be used") + } - } - continue - } - return nil, c.ArgErr() - 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]) - } - continue - } - return nil, c.ArgErr() - case "namespaces": - args := c.RemainingArgs() - if len(args) > 0 { - k8s.Namespaces = append(k8s.Namespaces, args...) - continue - } - return nil, c.ArgErr() - case "endpoint": - args := c.RemainingArgs() - if len(args) > 0 { - for _, endpoint := range strings.Split(args[0], ",") { - k8s.APIServerList = append(k8s.APIServerList, strings.TrimSpace(endpoint)) - } - 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, fmt.Errorf("unable to parse resync duration value: '%v': %v", args[0], err) - } - k8s.ResyncPeriod = rp - continue - } - return nil, c.ArgErr() - case "labels": - args := c.RemainingArgs() - if len(args) > 0 { - labelSelectorString := strings.Join(args, " ") - ls, err := unversionedapi.ParseToLabelSelector(labelSelectorString) - if err != nil { - return nil, fmt.Errorf("unable to parse label selector value: '%v': %v", labelSelectorString, err) - } - k8s.LabelSelector = ls - continue - } - return nil, c.ArgErr() - case "fallthrough": - args := c.RemainingArgs() - if len(args) == 0 { - k8s.Fallthrough = true - continue + for c.NextBlock() { + switch c.Val() { + 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]) } - return nil, c.ArgErr() - case "upstream": - args := c.RemainingArgs() - if len(args) == 0 { - return nil, c.ArgErr() + continue + } + return nil, c.ArgErr() + case "namespaces": + args := c.RemainingArgs() + if len(args) > 0 { + k8s.Namespaces = append(k8s.Namespaces, args...) + continue + } + return nil, c.ArgErr() + case "endpoint": + args := c.RemainingArgs() + if len(args) > 0 { + for _, endpoint := range strings.Split(args[0], ",") { + k8s.APIServerList = append(k8s.APIServerList, strings.TrimSpace(endpoint)) } - ups, err := dnsutil.ParseHostPortOrFile(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, err + return nil, fmt.Errorf("unable to parse resync duration value: '%v': %v", args[0], err) } - k8s.Proxy = proxy.NewLookup(ups) - case "federation": // name zone - args := c.RemainingArgs() - if len(args) == 2 { - k8s.Federations = append(k8s.Federations, Federation{ - name: args[0], - zone: args[1], - }) - continue + k8s.ResyncPeriod = rp + continue + } + return nil, c.ArgErr() + case "labels": + args := c.RemainingArgs() + if len(args) > 0 { + labelSelectorString := strings.Join(args, " ") + ls, err := unversionedapi.ParseToLabelSelector(labelSelectorString) + if err != nil { + return nil, fmt.Errorf("unable to parse label selector value: '%v': %v", labelSelectorString, err) } - return nil, fmt.Errorf("incorrect number of arguments for federation, got %v, expected 2", len(args)) + k8s.LabelSelector = ls + continue + } + return nil, c.ArgErr() + case "fallthrough": + args := c.RemainingArgs() + if len(args) == 0 { + k8s.Fallthrough = true + continue + } + return nil, c.ArgErr() + 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) + default: + return nil, c.Errf("unknown property '%s'", c.Val()) } - return k8s, nil } + return k8s, nil } return nil, errors.New("kubernetes setup called without keyword 'kubernetes' in Corefile") } |