It's recommended to try this version with --dry-run=true first, see upgrade instructions.
Action required before upgrade
- ⚠️
gateway-tcproutesource now watches TCPRoutev1(#6755).- Requires Gateway API CRDs >= v1.6.0.
- ⚠️
skipper-routegroupsource now uses informers (#6714): the RouteGroup CRD must be installed.- ℹ️
.Metadatain--fqdn-templateis deprecated: use{{.Name}}instead of{{.Metadata.Name}}.
- ℹ️
- ⚠️
DNSEndpointandDNSRecordCRDs are now validated at admission (#6620).- Re-apply the CRDs. Existing objects violating the new rules cannot be updated until fixed.
- ⚠️ Packagers: version ldflags moved to
sigs.k8s.io/external-dns/pkg/version.{Version,GitCommit}(#6774).- The old path builds fine but reports version
unknown.
- The old path builds fine but reports version
Important
- ℹ️ gateway-httproute: a hostname from annotation or FQDN template now suppresses the listener hostname fallback (#6746).
- With
--policy=sync, wildcard or listener records previously created this way get deleted.
- With
- ℹ️ scaleway:
ALIASrecords are now read back, and apexCNAMEare created asALIAS(#6543).- With
--registry=noopand--policy=sync, pre-existingALIASrecords may be updated or deleted.
- With
- ℹ️
--namespaceaccepts multiple values (--namespace=a,b) forserviceandcrdsources (#6763, #6764).Config.Namespaceis nowConfig.Namespaces []stringfor importers ofpkg/apis/externaldns.
- ℹ️
$KUBECONFIGis now honored, and--serveris no longer ignored in-cluster (#6736). - ℹ️ Endpoints without targets are now skipped instead of crashing providers (#6752).
- ℹ️ coredns: deleting a record now also deletes its TXT registry entry (#6747).
- TXT entries orphaned by earlier versions remain in etcd; remove them manually.
⚠️ Breaking Changes
- [config] accept multiple values in --namespace by @mloiseleur in #6763
- [gateway] let a hostname annotation suppress the listener fallback by @KR-Ravindra in #6746
- [pkg] move version info into leaf pkg/version by @mrueg in #6774
- [scaleway] support ALIAS records for zone apex and alias annotation by @vdhpieter in #6543
- [source] migrate TCPRoute source to Gateway API v1 by @pratikwayal01 in #6755
- [source] skipper-routegroup refactored to use client-go informers by @szuecs in #6714
🚀 Features
- [awssd] support dual-stack load balancer aliases by @dlanov in #6665
- [client] honor $KUBECONFIG and apply --server to in-cluster config by @vflaux in #6736
- [controller] report sync outcome to a DNSEndpoint status writer by @mloiseleur in #6767
- [crd] validate DNSEndpoint schema at admission by @mloiseleur in #6620
- [crd] wire DNSEndpoint status-sync client (log-only) by @ivankatliarchuk in #6760
- [events] emit RecordDeleted using the registry resource label by @mloiseleur in #6766
- [rfc2136] insecure axfr upstream by @dembykumorion in #6519
- [rfc2136] support TLSA records by @rissson in #6721
- [source] watch multiple namespaces in service and crd sources by @mloiseleur in #6764
🐛 Bug fixes
- [coredns] delete endpoint should also delete the registry TXT entry by @mloiseleur in #6747
- [endpoint] reject endpoints without targets by @mloiseleur in #6752
- [gateway] stop applying --annotation-filter to ListenerSets by @cyril-corbon in #6794
- [mx] keep null MX and strip trailing dot by @mloiseleur in #6661
- [source] keep RefObjects on endpoints built from --default-targets by @mloiseleur in #6765
- [targetfiltersource] skip network address filtering for non-address records by @castorw in #6366
📝 Documentation
- [proposal] generic target-from resource dereference by @mloiseleur in #6536
- [proposal] record rejected multi-provider CRD design by @mloiseleur in #6512
- [webhook] add DNScale provider by @dnscale-ops in #6828
- document multi-cluster shared DNS records guide by @mloiseleur in #6608
- enable version warning banner for outdated documentation versions by @Sun-Wukhan in #6790
📦 Docker Image
# This pull command only works when it's released
docker pull registry.k8s.io/external-dns/external-dns:v0.24.0📦 Others
chore
- [release] updates kustomize & docs with v0.23.0 by @mloiseleur in #6740
- update to go 1.27.3 by @Raffo in #6825
ci
- [build] keep multi-arch image build temp files off /tmp by @mloiseleur in #6832
- add Go dependency license check workflow by @ivankatliarchuk in #6334
deps
- [go] remove dependabot ignore by @ivankatliarchuk in #6742
- bump gitpython from 3.1.60 to 3.1.62 in /docs/scripts by @app/dependabot in #6782
- bump mkdocs-git-revision-date-localized-plugin from 1.5.4 to 1.6.0 in /docs/scripts in the mkdocs-deps group by @app/dependabot in #6743
- bump the dev-dependencies group across 1 directory with 11 updates by @app/dependabot in #6831
- bump the dev-dependencies group with 18 updates by @app/dependabot in #6784
- bump the dev-dependencies group with 19 updates by @app/dependabot in #6813
- bump the dev-dependencies group with 3 updates by @app/dependabot in #6744
- bump the dev-dependencies group with 5 updates by @app/dependabot in #6745
- bump the dev-dependencies group with 5 updates by @app/dependabot in #6779
- bump the dev-dependencies group with 7 updates by @app/dependabot in #6756
- bump the dev-dependencies group with 7 updates by @app/dependabot in #6795
- bump urllib3 from 2.7.0 to 2.8.0 in /docs/scripts by @app/dependabot in #6781
perf
- [registry] compute only the TXT name when checking for missing records by @spicysharkco in #6805
refactor
- [endpoint] drop dependency on pkg/events by @mrueg in #6775
- [exoscale] reduce ApplyChanges cyclomatic complexity by @somaz94 in #6709
- [plan] drop go-cmp from HasChanges by @mrueg in #6773
- [source] use ListIndexed helper for indexer scans by @ivankatliarchuk in #6759
- standardise on internal/sets by @mloiseleur in #6735
test
- [provider/aws] store DNS names in the Route 53 stub lowercased by @thc1006 in #6705
- [source] cover legacy compatibility endpoints by @pratikwayal01 in #6789
- [testifylint] enable require-error checker by @andrew-c-hay in #6637