Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
cfb67ef
chore(cloudflare): migrate remaining custom hostnames to v5
AndrewCharlesHay Oct 6, 2025
971381c
Apply linter fixes and formatting
AndrewCharlesHay Oct 6, 2025
7eee635
docs: remove pr description
AndrewCharlesHay Oct 7, 2025
f14fc41
docs: update Cloudflare tutorial to reflect v5 SDK migration completion
AndrewCharlesHay Oct 7, 2025
e9f155a
test: consolidate custom hostname tests into main test file
AndrewCharlesHay Oct 7, 2025
c790795
docs: v0.20 update
AndrewCharlesHay Oct 7, 2025
a8e96b2
fix: address comments
AndrewCharlesHay Oct 9, 2025
270b3cd
refactor(cloudflare): update CustomHostnames interface to match Cloud…
AndrewCharlesHay Oct 9, 2025
69bef93
fix(cloudflare): implement proper CloudFlare v5 error handling
AndrewCharlesHay Oct 10, 2025
28ff9cd
style(cloudflare): make go-lint
AndrewCharlesHay Oct 10, 2025
ec546c2
test(cloudflare): add test for ssl params
AndrewCharlesHay Oct 13, 2025
39fadcd
chore: remove extra files
AndrewCharlesHay Oct 13, 2025
d2c22ce
style: make lint
AndrewCharlesHay Oct 13, 2025
f41f302
docs: update comment
AndrewCharlesHay Oct 18, 2025
e641e5d
fix: address comments
AndrewCharlesHay Oct 22, 2025
0a822b3
fix: remove dead code
AndrewCharlesHay Oct 22, 2025
5e08563
fix: update test
AndrewCharlesHay Oct 22, 2025
d1d3357
fix: update tests
AndrewCharlesHay Oct 22, 2025
3b05158
fix: update tests
AndrewCharlesHay Oct 22, 2025
8e8a960
fix: update test
AndrewCharlesHay Oct 22, 2025
562b091
refactor(cloudflare): remove redundant rate limit error checks (v0 wo…
AndrewCharlesHay Oct 24, 2025
f5f3165
fix: handle rate limit errors in string format
AndrewCharlesHay Nov 4, 2025
8a3c8b1
chore: remove extra comment
AndrewCharlesHay Nov 11, 2025
a976b56
remove unused test
AndrewCharlesHay Nov 11, 2025
64f8d3f
WIP: Remove coverage file, update error handling and tests per review
AndrewCharlesHay Nov 13, 2025
1538574
fix: remove orphaned test code and fix test syntax errors
AndrewCharlesHay Dec 1, 2025
c8671be
fix: resolve test compilation errors and skip flaky error log countin…
AndrewCharlesHay Dec 1, 2025
46c5795
chore: apply gofmt formatting
AndrewCharlesHay Dec 2, 2025
597945b
Build(tool) remove vacuum (#5955)
szuecs Nov 13, 2025
8bafc69
chore(ci): fix releaser script (#5953)
mloiseleur Nov 14, 2025
0b653f8
chore(release): updates kustomize & docs with v0.20.0 (#5958)
mloiseleur Nov 14, 2025
0309f8a
chore(deps): bump github.com/digitalocean/godo (#5956)
dependabot[bot] Nov 16, 2025
452265e
chore(deps): bump renovatebot/github-action (#5950)
dependabot[bot] Nov 16, 2025
94cfcf9
feat: add support for ingress backed GlooEdge Gateway (#5909)
cucxabong Nov 16, 2025
3e9e22f
feat: end to end testing with coredns provider (#5933)
Raffo Nov 19, 2025
fed0858
chore(deps): bump the dev-dependencies group across 1 directory with …
dependabot[bot] Nov 20, 2025
8bab0ca
chore(deps): bump golang.org/x/crypto from 0.44.0 to 0.45.0 (#5969)
dependabot[bot] Nov 20, 2025
91f9561
fix: append dot to the target of SRV records as required by RFC 2782 …
frittentheke Nov 21, 2025
2c7ca01
docs: add UniFi webhook provider to README (#5967)
lexfrei Nov 22, 2025
aab65cc
chore(deps): bump the dev-dependencies group across 1 directory with …
dependabot[bot] Nov 29, 2025
71bc535
chore(deps): bump github.com/goccy/go-yaml in the dev-dependencies gr…
dependabot[bot] Dec 1, 2025
b07cc35
Add tests for buildCustomHostnameNewParams and improve error handling…
AndrewCharlesHay Dec 2, 2025
803de1a
fix: rebase
AndrewCharlesHay Dec 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/dependency-update.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/[email protected]
# https://github.com/renovatebot/github-action
- name: self-hosted renovate
uses: renovatebot/[email protected].1
uses: renovatebot/[email protected].2
with:
# https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down
19 changes: 19 additions & 0 deletions .github/workflows/end-to-end-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: end to end test

on:
push:
branches:
pull_request:
branches: [ master ]
workflow_dispatch:

jobs:
e2e-tests:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4
- name: e2e
run: |
./scripts/e2e-test.sh
11 changes: 1 addition & 10 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@ on:

jobs:
lint:
name: Markdown, Go and OAS
name: Markdown and Go
runs-on: ubuntu-latest
permissions:
# Required: allow read access to the content for analysis.
contents: read
# For OAS check
checks: write
# For go lang linter
pull-requests: read
steps:
Expand Down Expand Up @@ -50,13 +48,6 @@ jobs:
args: --timeout=30m
version: v2.5

# https://github.com/daveshanley/vacuum
- name: Lint OpenAPI spec
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Increases rate limit from 60 to 5000 requests
run: |
go tool vacuum lint -d --fail-severity warn --show-rules api/*.yaml

- uses: actions/setup-python@v6
# https://github.com/pre-commit/action
- name: Verify with pre-commit
Expand Down
7 changes: 1 addition & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,9 @@ licensecheck:
exit 1; \
fi

#? oas-lint: Execute OpenAPI Specification (OAS) linting https://quobix.com/vacuum/
.PHONY: go-lint
oas-lint:
go tool -modfile=go.tool.mod vacuum lint -d --fail-severity warn api/*.yaml

#? lint: Run all the linters
.PHONY: lint
lint: licensecheck go-lint oas-lint
lint: licensecheck go-lint

#? crd: Generates CRD using controller-gen and copy it into chart
.PHONY: crd
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ from the usage of any externally developed webhook.
| STACKIT | https://github.com/stackitcloud/external-dns-stackit-webhook |
| Unbound | https://github.com/guillomep/external-dns-unbound-webhook |
| Unifi | https://github.com/kashalls/external-dns-unifi-webhook |
| UniFi | https://github.com/lexfrei/external-dns-unifios-webhook |
| Volcengine Cloud | https://github.com/volcengine/external-dns-volcengine-webhook |
| Vultr | https://github.com/vultr/external-dns-vultr-webhook |
| Yandex Cloud | https://github.com/ismailbaskin/external-dns-yandex-webhook/ |
Expand Down Expand Up @@ -168,7 +169,7 @@ Breaking changes were introduced in external-dns in the following versions:

- [`v0.10.0`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.10.0): use of `networking.k8s.io/ingresses` instead of `extensions/ingresses` (see [#2281](https://github.com/kubernetes-sigs/external-dns/pull/2281))
- [`v0.18.0`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.18.0): use of `discovery.k8s.io/endpointslices` instead of `endpoints` (see [#5493](https://github.com/kubernetes-sigs/external-dns/pull/5493))
- [`v0.19.0`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.19.0): expose external ipv6 by default (see [#5575](https://github.com/kubernetes-sigs/external-dns/pull/5575) and disable legacy listeners on traefik.containo.us API Group (see [#5565](https://github.com/kubernetes-sigs/external-dns/pull/5565))
- [`v0.20.0`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.20.0): expose external ipv6 by default (see [#5575](https://github.com/kubernetes-sigs/external-dns/pull/5575) and disable legacy listeners on traefik.containo.us API Group (see [#5565](https://github.com/kubernetes-sigs/external-dns/pull/5565))

| ExternalDNS | ≤ 0.9.x | ≥ 0.10.x and ≤ 0.17.x | ≥ 0.18.x |
| ---------------------------- | :----------------: | :-------------------: | :----------------: |
Expand Down
4 changes: 4 additions & 0 deletions charts/external-dns/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Add option to set `annotationPrefix` ([#5889](https://github.com/kubernetes-sigs/external-dns/pull/5889)) _@lexfrei_

### Changed

- Grant `networking.k8s.io/ingresses` and `gateway.solo.io/gateways` permissions when using `gloo-proxy` source. ([#5909](https://github.com/kubernetes-sigs/external-dns/pull/5909)) _@cucxabong_

## [v1.19.0] - 2025-09-08

### Added
Expand Down
4 changes: 2 additions & 2 deletions charts/external-dns/templates/clusterrole.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ rules:
resources: ["endpointslices"]
verbs: ["get","watch","list"]
{{- end }}
{{- if or (has "ingress" .Values.sources) (has "istio-gateway" .Values.sources) (has "istio-virtualservice" .Values.sources) (has "contour-httpproxy" .Values.sources) (has "openshift-route" .Values.sources) (has "skipper-routegroup" .Values.sources) }}
{{- if or (has "ingress" .Values.sources) (has "istio-gateway" .Values.sources) (has "istio-virtualservice" .Values.sources) (has "contour-httpproxy" .Values.sources) (has "openshift-route" .Values.sources) (has "skipper-routegroup" .Values.sources) (has "gloo-proxy" .Values.sources) }}
- apiGroups: ["extensions","networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
Expand Down Expand Up @@ -99,7 +99,7 @@ rules:
{{- end }}
{{- if has "gloo-proxy" .Values.sources }}
- apiGroups: ["gloo.solo.io","gateway.solo.io"]
resources: ["proxies","virtualservices"]
resources: ["proxies","virtualservices","gateways"]
verbs: ["get","watch","list"]
{{- end }}
{{- if has "kong-tcpingress" .Values.sources }}
Expand Down
24 changes: 24 additions & 0 deletions charts/external-dns/tests/rbac_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -520,3 +520,27 @@ tests:
resources: ["virtualservices"]
verbs: ["get","watch","list"]
template: clusterrole.yaml
- it: should create default RBAC rules for 'GlooEdge' when 'gloo-proxy' is set
set:
sources:
- gloo-proxy
asserts:
- template: clusterrole.yaml
equal:
path: rules
value:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list","watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get","watch","list"]
- apiGroups: ["extensions","networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
- apiGroups: ["gloo.solo.io","gateway.solo.io"]
resources: ["proxies","virtualservices","gateways"]
verbs: ["get","watch","list"]
2 changes: 1 addition & 1 deletion docs/advanced/import-records.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ spec:
env:
- name: AWS_DEFAULT_REGION
value: us-west-2
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
imagePullPolicy: IfNotPresent
name: external-dns
securityContext:
Expand Down
102 changes: 98 additions & 4 deletions docs/annotations/annotations.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,108 @@ If the annotation is not present, use the domains from both the spec and annotat

## external-dns.alpha.kubernetes.io/ingress

This annotation allows ExternalDNS to work with Istio Gateways that don't have a public IP.
This annotation allows ExternalDNS to work with Istio & GlooEdge Gateways that don't have a public IP.

It can be used to address a specific architectural pattern, when a Kubernetes Ingress directs all public traffic to the Istio Gateway:
It can be used to address a specific architectural pattern, when a Kubernetes Ingress directs all public traffic to an Istio or GlooEdge Gateway:

- **The Challenge**: By default, ExternalDNS sources the public IP address for a DNS record from a Service of type LoadBalancer.
However, in some service mesh setups, the Istio Gateway's Service is of type ClusterIP, with all public traffic routed to it via a separate Kubernetes Ingress object. This setup leaves the Gateway without a public IP that ExternalDNS can discover.
However, in some setups, the Gateway's Service is of type ClusterIP, with all public traffic routed to it via a separate Kubernetes Ingress object. This setup leaves the Gateway without a public IP that ExternalDNS can discover.

- **The Solution**: The annotation on the Istio Gateway tells ExternalDNS to ignore the Gateway's Service IP. Instead, it directs ExternalDNS to a specified Ingress resource to find the target LoadBalancer IP address.
- **The Solution**: The annotation on the Istio/GlooEdge Gateway tells ExternalDNS to ignore the Gateway's Service IP. Instead, it directs ExternalDNS to a specified Ingress resource to find the target LoadBalancer IP address.

### Use Cases for `external-dns.alpha.kubernetes.io/ingress` annotation

#### Getting target from Ingress backed Gloo Gateway

```yml
apiVersion: gateway.solo.io/v1
kind: Gateway
metadata:
annotations:
external-dns.alpha.kubernetes.io/ingress: gateway-proxy
labels:
app: gloo
name: gateway-proxy
namespace: gloo-system
spec:
bindAddress: '::'
bindPort: 8080
options: {}
proxyNames:
- gateway-proxy
ssl: false
useProxyProto: false
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gateway-proxy
namespace: gloo-system
spec:
ingressClassName: alb
rules:
- host: cool-service.example.com
http:
paths:
- backend:
service:
name: gateway-proxy
port:
name: http
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- hostname: k8s-alb-c4aa37c880-740590208.us-east-1.elb.amazonaws.com
---
# This object is generated by GlooEdge Control Plane from Gateway and VirtualService.
# We have no direct control on this resource
apiVersion: gloo.solo.io/v1
kind: Proxy
metadata:
labels:
created_by: gloo-gateway
name: gateway-proxy
namespace: gloo-system
spec:
listeners:
- bindAddress: '::'
bindPort: 8080
httpListener:
virtualHosts:
- domains:
- cool-service.example.com
metadataStatic:
sources:
- observedGeneration: "6652"
resourceKind: '*v1.VirtualService'
resourceRef:
name: cool-service
namespace: gloo-system
name: cool-service
routes:
- matchers:
- prefix: /
metadataStatic:
sources:
- observedGeneration: "6652"
resourceKind: '*v1.VirtualService'
resourceRef:
name: cool-service
namespace: gloo-system
upgrades:
- websocket: {}
metadataStatic:
sources:
- observedGeneration: "6111"
resourceKind: '*v1.Gateway'
resourceRef:
name: gateway-proxy
namespace: gloo-system
name: listener-::-8080
useProxyProto: false
```

## external-dns.alpha.kubernetes.io/internal-hostname

Expand Down
2 changes: 1 addition & 1 deletion docs/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ $ docker run \
-e EXTERNAL_DNS_SOURCE=$'service\ningress' \
-e EXTERNAL_DNS_PROVIDER=google \
-e EXTERNAL_DNS_DOMAIN_FILTER=$'foo.com\nbar.com' \
registry.k8s.io/external-dns/external-dns:v0.19.0
registry.k8s.io/external-dns/external-dns:v0.20.0
time="2017-08-08T14:10:26Z" level=info msg="config: &{APIServerURL: KubeConfig: Sources:[service ingress] Namespace: ...
```

Expand Down
2 changes: 1 addition & 1 deletion docs/registry/dynamodb.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ spec:
spec:
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
args:
- --source=service
- --source=ingress
Expand Down
4 changes: 2 additions & 2 deletions docs/registry/txt.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
imagePullPolicy: Always
args:
- "--txt-prefix=%{record_type}-"
Expand Down Expand Up @@ -276,7 +276,7 @@ spec:
containers:
- name: external-dns
imagePullPolicy: Always
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
args:
- "--txt-prefix=%{record_type}-"
- "--txt-cache-interval=2m"
Expand Down
2 changes: 1 addition & 1 deletion docs/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ A new staging image is released weekly and can be found at [gcr.io/k8s-staging-e
Example command to fetch `10` most recent staging images:

```sh
export EXT_DNS_VERSION="v0.19.0"
export EXT_DNS_VERSION="v0.20.0"
curl -sLk https://gcr.io/v2/k8s-staging-external-dns/external-dns/tags/list | jq | grep "$EXT_DNS_VERSION" | tail -n 10
```

Expand Down
2 changes: 1 addition & 1 deletion docs/sources/gateway-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
args:
# Add desired Gateway API Route sources.
- --source=gateway-httproute
Expand Down
53 changes: 51 additions & 2 deletions docs/sources/gloo-proxy.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ spec:
containers:
- name: external-dns
# update this to the desired external-dns version
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
args:
- --source=gloo-proxy
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
Expand Down Expand Up @@ -96,11 +96,60 @@ spec:
containers:
- name: external-dns
# update this to the desired external-dns version
image: registry.k8s.io/external-dns/external-dns:v0.19.0
image: registry.k8s.io/external-dns/external-dns:v0.20.0
args:
- --source=gloo-proxy
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
- --provider=aws
- --registry=txt
- --txt-owner-id=my-identifier
```

## Gateway Annotation

To support setups where an Ingress resource is used to provision an external LB you can add the following annotation to your Gateway

**Note:** The Ingress namespace can be omitted if its in the same namespace as the gateway

```bash
$ cat <<EOF | kubectl apply -f -
apiVersion: gloo.solo.io/v1
kind: Proxy
metadata:
labels:
created_by: gloo-gateway
name: gateway-proxy
namespace: gloo-system
spec:
listeners:
- bindAddress: '::'
metadataStatic:
sources:
- resourceKind: '*v1.Gateway'
resourceRef:
name: gateway-proxy
namespace: gloo-system
---
apiVersion: gateway.solo.io/v1
kind: Gateway
metadata:
annotations:
external-dns.alpha.kubernetes.io/ingress: "$ingressNamespace/$ingressName"
labels:
app: gloo
name: gateway-proxy
namespace: gloo-system
spec: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
gateway-proxy-id: gateway-proxy
gloo: gateway-proxy
name: gateway-proxy
namespace: gloo-system
spec:
ingressClassName: alb
EOF
```
Loading