Commit Graph

87 Commits

Author SHA1 Message Date
Kyle
38178940a3
feat: add annotation and label filters to Ambassador Host Source (#2633)
* Add annotation filter to Ambassador Host Source

This change makes the Ambassador Host source respect the External-DNS annotationFilter allowing for an Ambassador Host resource to specify what External-DNS deployment to use when there are multiple External-DNS deployments within the same cluster. Before this change if you had two External-DNS deployments within the cluster and used the Ambassador Host source the first External-DNS to process the resource will create the record and not the one that was specified in the filter annotation.

I added the `filterByAnnotations` function so that it matched the same way the other sources have implemented annotation filtering. I didn't add the controller check only because I wanted to keep this change to implementing the annotationFilter.

Example: Create two External-DNS deployments 1 public and 1 private and set the Ambassador Host to use the public External-DNS using the annotation filter.

```
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns-private
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: external-dns-private
  template:
    metadata:
      labels:
        app: external-dns-private
      annotations:
        iam.amazonaws.com/role: {ARN} # AWS ARN role
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: k8s.gcr.io/external-dns/external-dns:latest
        args:
        - --source=ambassador-host
        - --domain-filter=example.net # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
        - --provider=aws
        - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
        - --aws-zone-type=private # only look at public hosted zones (valid values are public, private or no value for both)
        - --registry=txt
        - --txt-owner-id= {Hosted Zone ID} # Insert Route53 Hosted Zone ID here
        - --annotation-filter=kubernetes.io/ingress.class in (private)
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns-public
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: external-dns-public
  template:
    metadata:
      labels:
        app: external-dns-public
      annotations:
        iam.amazonaws.com/role: {ARN} # AWS ARN role
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: k8s.gcr.io/external-dns/external-dns:latest
        args:
        - --source=ambassador-host
        - --domain-filter=example.net # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
        - --provider=aws
        - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
        - --aws-zone-type= # only look at public hosted zones (valid values are public, private or no value for both)
        - --registry=txt
        - --txt-owner-id= {Hosted Zone ID} # Insert Route53 Hosted Zone ID here
        - --annotation-filter=kubernetes.io/ingress.class in (public)
---
apiVersion: getambassador.io/v3alpha1
  kind: Host
  metadata:
    name: your-hostname
    annotations:
      external-dns.ambassador-service: emissary-ingress/emissary
      kubernetes.io/ingress.class: public
  spec:
		acmeProvider:
      authority: none
		hostname: your-hostname.example.com
```

Fixes kubernetes-sigs/external-dns#2632

* Add Label filltering for Ambassador Host source

Currently the `--label-filter` flag can only be used to filter CRDs, Ingress, Service and Openshift Route objects which match the label selector passed through that flag. This change extends the functionality to the Ambassador Host type object.

When the flag is not specified the default value is `labels.Everything()` which is an empty string, the same as before. An annotation based filter is inefficient because the filtering has to be done in the controller instead of the API server like with label filtering. The Annotation based filtering has been left in for legacy reasons so the Ambassador Host source can be used inconjunction with the other sources that don't yet support label filltering.

It is possible to use label based filltering with annotation based filltering so you can initially filter by label then filter the returned hosts by annotation. This is not recomended

* Update Ambassador Host source docs

Add that the Ambassador Host source now supports both annotation and label filltering.
2024-08-28 18:02:57 +01:00
Kristopher Kirkland
9015377c12 Add flags to disable each of the Traefik API groups 2023-11-29 12:14:59 -06:00
John Gardiner Myers
76a2ea17aa Make --ignore-hostname-annotation flag more consistent 2023-10-02 23:51:43 -07:00
John Gardiner Myers
75639b759c Support --label-filter for node source 2023-09-20 08:56:26 -07:00
Megum1n
70a43a4231
Merge branch 'master' into gloo-multiple-namespaces 2023-07-08 22:49:13 +02:00
John Gardiner Myers
4a40346d42 Remove flags and documentation for removed contour-ingressroute source 2023-07-04 16:37:37 -07:00
Megum1n
41d3de5364
Merge branch 'master' into gloo-multiple-namespaces 2023-06-24 02:11:35 +02:00
Thomas Kosiewski
95abe994c4
Merge remote-tracking branch 'kubernetes-sigs/master' 2023-06-01 18:49:38 +02:00
Megum1n
028656d649
Change variable type and description 2023-05-08 12:08:00 +02:00
Arnaud Lefray
56773c0430
chore: merge with master 2023-05-04 15:23:10 +02:00
Charles Xu
1d232c4b86 feat: resolve LB-type Service hostname to create A/AAAA instead of CNAME 2023-04-18 21:10:56 -07:00
Kubernetes Prow Robot
e6ec8ea329
Merge pull request #2220 from ericrrath/crd-source-event-handler
CRD source: add event-handler support
2023-04-13 23:20:39 -07:00
megum1n
ac605fa4ce
Rename gloo-namespace flag back to singular word 2023-04-13 23:00:26 +02:00
Thomas Kosiewski
458b702762 Added traefik source 2023-03-17 15:15:41 +01:00
megum1n
3d48d66c91
Add support for multiple gloo namespaces in one External DNS instance 2023-03-15 02:33:00 +01:00
Mikael Johansson
9a76be0202 Add F5 VirtualServer source 2023-03-14 10:23:56 +01:00
Eric R. Rath
929e618935 --events controls CRD informer creation
mgruener suggested that the --events flag could be wired to control whether or
not the CRD source created and started its informer.  This commit makes that
change; good idea!
2023-02-27 12:34:16 -08:00
Andy Bursavich
13d978caeb gateway-api: upgrade from v0.5.1 to v0.6.0 and add GRPCRoute support 2023-01-04 08:18:35 -08:00
Andy Bursavich
a7a56b9380 gateway-api: upgrade from v0.4.3 to v0.5.0 2022-09-21 09:01:30 -07:00
Andy Bursavich
71e45ce1d3 gateway-udproute: add source 2022-02-24 21:30:10 -08:00
Andy Bursavich
52e3fd61db gateway-tcproute: add source 2022-02-24 21:30:10 -08:00
Andy Bursavich
32ca4e6de8 gateway-tlsroute: add source 2022-02-24 21:30:10 -08:00
Andy Bursavich
3a1d86be20 gateway-httproute: add source 2022-02-24 21:30:10 -08:00
Andy Bursavich
48203e64c9 source: add gateway client 2022-02-24 21:30:10 -08:00
Dave Salisbury
1ceec80ec5 Merge remote-tracking branch 'origin/master' into ingress-class-filtering 2022-02-14 16:36:26 +11:00
Eric R. Rath
56a8d60fff Review feedback
njuettner suggested using a var instead of boolean literals for the
startInformer arg to NewCRDSource; good idea.
2022-02-04 15:36:29 -08:00
Eric R. Rath
585d752ca4 Don't run CRD informer during tests
This change disables the CRD source's informer during tests.  I made the mistake
of not running `make test` before the previous commit, and thus didn't realize
that leaving the informer enabled during the tests introduced a race condition:

	WARNING: DATA RACE
	Write at 0x00c0005aa130 by goroutine 59:
	  k8s.io/client-go/rest/fake.(*RESTClient).do()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:113 +0x69
	  k8s.io/client-go/rest/fake.(*RESTClient).do-fm()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:109 +0x64
	  k8s.io/client-go/rest/fake.roundTripperFunc.RoundTrip()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:43 +0x3d
	  net/http.send()
		  /usr/local/go/src/net/http/client.go:251 +0x6da
	  net/http.(*Client).send()
		  /usr/local/go/src/net/http/client.go:175 +0x1d5
	  net/http.(*Client).do()
		  /usr/local/go/src/net/http/client.go:717 +0x2cb
	  net/http.(*Client).Do()
		  /usr/local/go/src/net/http/client.go:585 +0x68b
	  k8s.io/client-go/rest.(*Request).request()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/request.go:855 +0x209
	  k8s.io/client-go/rest.(*Request).Do()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/request.go:928 +0xf0
	  sigs.k8s.io/external-dns/source.(*crdSource).List()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd.go:250 +0x28c
	  sigs.k8s.io/external-dns/source.NewCRDSource.func1()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd.go:125 +0x10a
	  k8s.io/client-go/tools/cache.(*ListWatch).List()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/listwatch.go:106 +0x94
	  k8s.io/client-go/tools/cache.(*Reflector).ListAndWatch.func1.1.2()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:233 +0xf4
	  k8s.io/client-go/tools/pager.SimplePageFunc.func1()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/pager/pager.go:40 +0x94
	  k8s.io/client-go/tools/pager.(*ListPager).List()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/pager/pager.go:91 +0x1f4
	  k8s.io/client-go/tools/cache.(*Reflector).ListAndWatch.func1.1()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:258 +0x2b7

	Previous write at 0x00c0005aa130 by goroutine 37:
	  k8s.io/client-go/rest/fake.(*RESTClient).do()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:113 +0x69
	  k8s.io/client-go/rest/fake.(*RESTClient).do-fm()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:109 +0x64
	  k8s.io/client-go/rest/fake.roundTripperFunc.RoundTrip()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/fake/fake.go:43 +0x3d
	  net/http.send()
		  /usr/local/go/src/net/http/client.go:251 +0x6da
	  net/http.(*Client).send()
		  /usr/local/go/src/net/http/client.go:175 +0x1d5
	  net/http.(*Client).do()
		  /usr/local/go/src/net/http/client.go:717 +0x2cb
	  net/http.(*Client).Do()
		  /usr/local/go/src/net/http/client.go:585 +0x68b
	  k8s.io/client-go/rest.(*Request).request()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/request.go:855 +0x209
	  k8s.io/client-go/rest.(*Request).Do()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/rest/request.go:928 +0xf0
	  sigs.k8s.io/external-dns/source.(*crdSource).List()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd.go:250 +0x28c
	  sigs.k8s.io/external-dns/source.(*crdSource).Endpoints()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd.go:171 +0x13c4
	  sigs.k8s.io/external-dns/source.testCRDSourceEndpoints.func1()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd_test.go:388 +0x4f6
	  testing.tRunner()
		  /usr/local/go/src/testing/testing.go:1193 +0x202

	Goroutine 59 (running) created at:
	  k8s.io/client-go/tools/cache.(*Reflector).ListAndWatch.func1()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:224 +0x36f
	  k8s.io/client-go/tools/cache.(*Reflector).ListAndWatch()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:316 +0x1ab
	  k8s.io/client-go/tools/cache.(*Reflector).Run.func1()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:177 +0x4a
	  k8s.io/apimachinery/pkg/util/wait.BackoffUntil.func1()
		  /Users/erath/go/pkg/mod/k8s.io/apimachinery@v0.18.8/pkg/util/wait/wait.go:155 +0x75
	  k8s.io/apimachinery/pkg/util/wait.BackoffUntil()
		  /Users/erath/go/pkg/mod/k8s.io/apimachinery@v0.18.8/pkg/util/wait/wait.go:156 +0xba
	  k8s.io/client-go/tools/cache.(*Reflector).Run()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:176 +0xee
	  k8s.io/client-go/tools/cache.(*Reflector).Run-fm()
		  /Users/erath/go/pkg/mod/k8s.io/client-go@v0.18.8/tools/cache/reflector.go:174 +0x54
	  k8s.io/apimachinery/pkg/util/wait.(*Group).StartWithChannel.func1()
		  /Users/erath/go/pkg/mod/k8s.io/apimachinery@v0.18.8/pkg/util/wait/wait.go:56 +0x45
	  k8s.io/apimachinery/pkg/util/wait.(*Group).Start.func1()
		  /Users/erath/go/pkg/mod/k8s.io/apimachinery@v0.18.8/pkg/util/wait/wait.go:73 +0x6d

	Goroutine 37 (running) created at:
	  testing.(*T).Run()
		  /usr/local/go/src/testing/testing.go:1238 +0x5d7
	  sigs.k8s.io/external-dns/source.testCRDSourceEndpoints()
		  /Users/erath/go/src/github.com/ericrrath/external-dns/source/crd_test.go:376 +0x1fcf
	  testing.tRunner()
		  /usr/local/go/src/testing/testing.go:1193 +0x202

It looks like client-go's fake.RESTClient (used by crd_test.go) is known to
cause race conditions when used with informers:
<https://github.com/kubernetes/kubernetes/issues/95372>.  None of the CRD tests
_depend_ on the informer yet, so disabling the informer at least allows the
existing tests to pass without race conditions.  I'll look into further changes
that 1) test the new event-handler behavior, and 2) allow all tests to pass
without race conditions.
2022-02-04 15:32:03 -08:00
Andrey Lebedev
4f41229820 Pass stop channel to informer factory instances 2022-01-22 21:31:29 +01:00
Dave Salisbury
097df5c458 Merge remote-tracking branch 'origin/master' into ingress-class-filtering 2021-12-28 14:27:30 +11:00
Miheer Salunke
ab8a62045e In OCP when you have multiple ingress controllers the route's status Ingress object get populated with multiple router canonical names. So in this case, the external dns tries to add multiple CNAME records for same host in the same hosted zone which is a violation of RFC 1912  and therefore is rejected by standards-compliant DNS services.
This feature adds a router field to the OCP Route Source so that a user can add an ingress controller name in flag --ocp-router-name which will be used to pick up the respective routerCanonicalHostname from Route's Status Ingress Object.

Signed-off-by: Miheer Salunke <miheer.salunke@gmail.com>
2021-11-03 12:52:57 +10:00
Dave Salisbury
b8cbd4bbf4 Merge remote-tracking branch 'origin/master' into ingress-class-filtering 2021-10-25 11:18:56 +11:00
Arjun Naik
d91b7e6b8f Label filtering for Ingress, Service, Openshift Route sources
Currently the `--label-filter` flag can only be used to filter CRDs
which match the label selector passed through that flag. This change
extends the functionality to the Ingress, Service and Openshift Route
type objects. When the flag is not specified the default value is
`labels.Everything()` which is an empty string, the same as before.
Annotation based filter is inefficient because the filtering has to be
done in the controller instead of the API server like with label
filtering.
2021-10-14 11:06:55 +02:00
Dave Salisbury
8da6f99857 Rename ingressClassNameFilter to ingressClassNames
...and update the help text to specify use more clearly
2021-10-02 15:22:01 +10:00
Dave Salisbury
c4898b7e98 Plumb in filtering on ingress class name 2021-10-02 14:29:34 +10:00
Raffaele Di Fazio
05cadcb340 remove contour ingressroute
Signed-off-by: Raffaele Di Fazio <raffo@github.com>
2021-08-12 14:08:02 +02:00
Anand Patel
509a07c493
create new source ingress config option IgnoreIngressRulesSpec 2021-06-30 10:03:04 -07:00
Kubernetes Prow Robot
0148bca0f5
Merge pull request #2041 from olemarkus/kops
Kops compatibility mode
2021-06-24 06:25:41 -07:00
Kubernetes Prow Robot
c78be00600
Merge pull request #2109 from krmichel/master
Add support for Kong's TCPIngress with a load balancer
2021-06-23 11:34:10 -07:00
Ole Markus With
73469a0852 Support dns-controller compat mode for pod source 2021-06-23 09:06:38 +02:00
Kyle Michel
8676dda63f
Add support for Kong's TCPIngress with a load balancer 2021-05-26 21:04:07 -04:00
Bogdan
2476e77541 Add the --default-targets flag
This is a useful feature in environments
with public global WAN address(es)
2021-05-21 08:21:14 +02:00
Ole Markus With
5a46584221 Add pod source
Pod source is a key feature of kOps' DNS Controller.
Among other things, i is used for etcd and API discovery.
2021-03-31 15:48:41 +02:00
Hugome
5221b1d525
feat: add gloo proxy source 2021-03-03 22:34:22 +01:00
Alvaro Saurin
6eeef96b14 Support Ambassador Host resources as sources
Ambassador can be configured with `Host` resources (based on the
`Host` CRD) for defining the external DNS host name.

This code adds a new source, `ambassador-host`, that looks for the
`ambassador/ambassador` Service and and uses the `hostname` from the
`Host` resource.

Signed-off-by: Alvaro Saurin <alvaro.saurin@gmail.com>
Signed-off-by: Flynn <flynn@datawire.io>
2021-01-27 12:47:10 -05:00
João Marçal
79ea64884b
Added labelFilter for source CRD (#1461)
* Added label filter for source CRD

* Fixed bug with labels and added tests for source CRD

* Fixed formating

* Update source/crd_test.go

Co-authored-by: Vinny Sabatini <vincent.sabatini@gmail.com>

Co-authored-by: Vinny Sabatini <vincent.sabatini@gmail.com>
2020-09-24 01:28:05 -07:00
Benjile
fefb1b2777 Optionally ignore tls rules in ingress source 2020-09-18 09:12:14 +02:00
Joseph Glanville
5beb528c32 Contour HTTPProxy support 2020-08-06 18:56:59 +07:00
Raffaele Di Fazio
7505f29e4c
Remove occurrences of "master" from the project (#1636)
* intial removal of inappropriate terminology

Signed-off-by: Raffaele Di Fazio <raffo@github.com>

* removed other occurrences

Signed-off-by: Raffaele Di Fazio <raffo@github.com>

* gofmt

Signed-off-by: Raffaele Di Fazio <raffo@github.com>

* addresses comment

Signed-off-by: Raffaele Di Fazio <raffo@github.com>

* gofmt

Signed-off-by: Raffaele Di Fazio <raffo@github.com>
2020-07-08 01:13:08 -07:00
Kubernetes Prow Robot
a11414fa3b
Merge pull request #1607 from tariq1890/add_vs
add new source for istio virtual services
2020-07-01 00:46:17 -07:00
Tariq Ibrahim
c2788b2735
add new source for istio virtual services
Co-authored-by: Alfred Krohmer <alfred.krohmer@logmein.com>
Co-authored-by: Jonas-Taha El Sesiy <github@elsesiy.com>
2020-06-29 13:19:50 -07:00