diff --git a/docs/tutorials/gloo-proxy.md b/docs/tutorials/gloo-proxy.md index 0ec63da80..b1fb8d162 100644 --- a/docs/tutorials/gloo-proxy.md +++ b/docs/tutorials/gloo-proxy.md @@ -25,7 +25,7 @@ spec: image: registry.k8s.io/external-dns/external-dns:v0.13.2 args: - --source=gloo-proxy - - --gloo-namespace=custom-gloo-system # gloo system namespace. Omit to use the default (gloo-system) + - --gloo-namespaces=custom-gloo-system # comma separated gloo system namespace list. Omit to use the default (gloo-system) - --provider=aws - --registry=txt - --txt-owner-id=my-identifier @@ -93,7 +93,7 @@ spec: image: registry.k8s.io/external-dns/external-dns:v0.13.2 args: - --source=gloo-proxy - - --gloo-namespace=custom-gloo-system # gloo system namespace. Omit to use the default (gloo-system) + - --gloo-namespaces=custom-gloo-system # comma separated gloo system namespace list. Omit to use the default (gloo-system) - --provider=aws - --registry=txt - --txt-owner-id=my-identifier diff --git a/main.go b/main.go index ece1b0290..21e196464 100644 --- a/main.go +++ b/main.go @@ -134,7 +134,7 @@ func main() { CFUsername: cfg.CFUsername, CFPassword: cfg.CFPassword, ContourLoadBalancerService: cfg.ContourLoadBalancerService, - GlooNamespace: cfg.GlooNamespace, + GlooNamespaces: cfg.GlooNamespaces, SkipperRouteGroupVersion: cfg.SkipperRouteGroupVersion, RequestTimeout: cfg.RequestTimeout, DefaultTargets: cfg.DefaultTargets, diff --git a/pkg/apis/externaldns/types.go b/pkg/apis/externaldns/types.go index 230610e7f..85b75c651 100644 --- a/pkg/apis/externaldns/types.go +++ b/pkg/apis/externaldns/types.go @@ -48,7 +48,7 @@ type Config struct { RequestTimeout time.Duration DefaultTargets []string ContourLoadBalancerService string - GlooNamespace string + GlooNamespaces string SkipperRouteGroupVersion string Sources []string Namespace string @@ -207,7 +207,7 @@ var defaultConfig = &Config{ RequestTimeout: time.Second * 30, DefaultTargets: []string{}, ContourLoadBalancerService: "heptio-contour/contour", - GlooNamespace: "gloo-system", + GlooNamespaces: "gloo-system", SkipperRouteGroupVersion: "zalando.org/v1", Sources: nil, Namespace: "", @@ -398,7 +398,7 @@ func (cfg *Config) ParseFlags(args []string) error { app.Flag("contour-load-balancer", "The fully-qualified name of the Contour load balancer service. (default: heptio-contour/contour)").Default("heptio-contour/contour").StringVar(&cfg.ContourLoadBalancerService) // Flags related to Gloo - app.Flag("gloo-namespace", "Gloo namespace. (default: gloo-system)").Default("gloo-system").StringVar(&cfg.GlooNamespace) + app.Flag("gloo-namespaces", "Coma separated list of gloo namespaces. (default: gloo-system)").Default("gloo-system").StringVar(&cfg.GlooNamespaces) // Flags related to Skipper RouteGroup app.Flag("skipper-routegroup-groupversion", "The resource version for skipper routegroup").Default(source.DefaultRoutegroupVersion).StringVar(&cfg.SkipperRouteGroupVersion) diff --git a/pkg/apis/externaldns/types_test.go b/pkg/apis/externaldns/types_test.go index 87647ee21..fb262b0f9 100644 --- a/pkg/apis/externaldns/types_test.go +++ b/pkg/apis/externaldns/types_test.go @@ -36,7 +36,7 @@ var ( KubeConfig: "", RequestTimeout: time.Second * 30, ContourLoadBalancerService: "heptio-contour/contour", - GlooNamespace: "gloo-system", + GlooNamespaces: "gloo-system", SkipperRouteGroupVersion: "zalando.org/v1", Sources: []string{"service"}, Namespace: "", @@ -136,7 +136,7 @@ var ( KubeConfig: "/some/path", RequestTimeout: time.Second * 77, ContourLoadBalancerService: "heptio-contour-other/contour-other", - GlooNamespace: "gloo-not-system", + GlooNamespaces: "gloo-not-system,gloo-second-system", SkipperRouteGroupVersion: "zalando.org/v2", Sources: []string{"service", "ingress", "connector"}, Namespace: "namespace", @@ -266,7 +266,7 @@ func TestParseFlags(t *testing.T) { "--kubeconfig=/some/path", "--request-timeout=77s", "--contour-load-balancer=heptio-contour-other/contour-other", - "--gloo-namespace=gloo-not-system", + "--gloo-namespaces=gloo-not-system,gloo-second-system", "--skipper-routegroup-groupversion=zalando.org/v2", "--source=service", "--source=ingress", @@ -391,7 +391,7 @@ func TestParseFlags(t *testing.T) { "EXTERNAL_DNS_KUBECONFIG": "/some/path", "EXTERNAL_DNS_REQUEST_TIMEOUT": "77s", "EXTERNAL_DNS_CONTOUR_LOAD_BALANCER": "heptio-contour-other/contour-other", - "EXTERNAL_DNS_GLOO_NAMESPACE": "gloo-not-system", + "EXTERNAL_DNS_GLOO_NAMESPACES": "gloo-not-system,gloo-second-system", "EXTERNAL_DNS_SKIPPER_ROUTEGROUP_GROUPVERSION": "zalando.org/v2", "EXTERNAL_DNS_SOURCE": "service\ningress\nconnector", "EXTERNAL_DNS_NAMESPACE": "namespace", diff --git a/source/gloo_proxy.go b/source/gloo_proxy.go index 845ccdee0..49f800083 100644 --- a/source/gloo_proxy.go +++ b/source/gloo_proxy.go @@ -81,15 +81,16 @@ type proxyVirtualHostMetadataSource struct { type glooSource struct { dynamicKubeClient dynamic.Interface kubeClient kubernetes.Interface - glooNamespace string + glooNamespaces []string } // NewGlooSource creates a new glooSource with the given config -func NewGlooSource(dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, glooNamespace string) (Source, error) { +func NewGlooSource(dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, glooNamespaces string) (Source, error) { + return &glooSource{ dynamicKubeClient, kubeClient, - glooNamespace, + strings.Split(glooNamespaces, ","), }, nil } @@ -100,33 +101,36 @@ func (gs *glooSource) AddEventHandler(ctx context.Context, handler func()) { func (gs *glooSource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, error) { endpoints := []*endpoint.Endpoint{} - proxies, err := gs.dynamicKubeClient.Resource(proxyGVR).Namespace(gs.glooNamespace).List(ctx, metav1.ListOptions{}) - if err != nil { - return nil, err - } - for _, obj := range proxies.Items { - proxy := proxy{} - jsonString, err := obj.MarshalJSON() - if err != nil { - return nil, err - } - err = json.Unmarshal(jsonString, &proxy) - if err != nil { - return nil, err - } - log.Debugf("Gloo: Find %s proxy", proxy.Metadata.Name) - proxyTargets, err := gs.proxyTargets(ctx, proxy.Metadata.Name) - if err != nil { - return nil, err - } - log.Debugf("Gloo[%s]: Find %d target(s) (%+v)", proxy.Metadata.Name, len(proxyTargets), proxyTargets) - proxyEndpoints, err := gs.generateEndpointsFromProxy(ctx, &proxy, proxyTargets) - if err != nil { - return nil, err - } - log.Debugf("Gloo[%s]: Generate %d endpoint(s)", proxy.Metadata.Name, len(proxyEndpoints)) - endpoints = append(endpoints, proxyEndpoints...) + for _, ns := range gs.glooNamespaces { + proxies, err := gs.dynamicKubeClient.Resource(proxyGVR).Namespace(ns).List(ctx, metav1.ListOptions{}) + if err != nil { + return nil, err + } + for _, obj := range proxies.Items { + proxy := proxy{} + jsonString, err := obj.MarshalJSON() + if err != nil { + return nil, err + } + err = json.Unmarshal(jsonString, &proxy) + if err != nil { + return nil, err + } + log.Debugf("Gloo: Find %s proxy", proxy.Metadata.Name) + proxyTargets, err := gs.proxyTargets(ctx, proxy.Metadata.Name, ns) + if err != nil { + return nil, err + } + log.Debugf("Gloo[%s]: Find %d target(s) (%+v)", proxy.Metadata.Name, len(proxyTargets), proxyTargets) + proxyEndpoints, err := gs.generateEndpointsFromProxy(ctx, &proxy, proxyTargets) + if err != nil { + return nil, err + } + log.Debugf("Gloo[%s]: Generate %d endpoint(s)", proxy.Metadata.Name, len(proxyEndpoints)) + endpoints = append(endpoints, proxyEndpoints...) + } } + return endpoints, nil } @@ -168,8 +172,8 @@ func (gs *glooSource) annotationsFromProxySource(ctx context.Context, virtualHos return annotations, nil } -func (gs *glooSource) proxyTargets(ctx context.Context, name string) (endpoint.Targets, error) { - svc, err := gs.kubeClient.CoreV1().Services(gs.glooNamespace).Get(ctx, name, metav1.GetOptions{}) +func (gs *glooSource) proxyTargets(ctx context.Context, name string, namespace string) (endpoint.Targets, error) { + svc, err := gs.kubeClient.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{}) if err != nil { return nil, err } diff --git a/source/store.go b/source/store.go index 87ba403a2..f37fb9462 100644 --- a/source/store.go +++ b/source/store.go @@ -67,7 +67,7 @@ type Config struct { CFUsername string CFPassword string ContourLoadBalancerService string - GlooNamespace string + GlooNamespaces string SkipperRouteGroupVersion string RequestTimeout time.Duration DefaultTargets []string @@ -288,7 +288,7 @@ func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg if err != nil { return nil, err } - return NewGlooSource(dynamicClient, kubernetesClient, cfg.GlooNamespace) + return NewGlooSource(dynamicClient, kubernetesClient, cfg.GlooNamespaces) case "openshift-route": ocpClient, err := p.OpenShiftClient() if err != nil {