|Vladimir Smagin 67222a2c82||5 days ago|
|.github||1 month ago|
|controller||1 month ago|
|docs||1 week ago|
|endpoint||3 months ago|
|img||3 years ago|
|internal||1 month ago|
|kustomize||2 weeks ago|
|pkg||1 month ago|
|plan||2 months ago|
|provider||5 days ago|
|registry||2 months ago|
|scripts||1 year ago|
|source||1 month ago|
|.gitignore||2 years ago|
|.golangci.yml||2 months ago|
|.zappr.yaml||3 years ago|
|CHANGELOG.md||1 week ago|
|CONTRIBUTING.md||2 years ago|
|Dockerfile||1 month ago|
|Dockerfile.mini||3 months ago|
|LICENSE||3 years ago|
|Makefile||2 months ago|
|OWNERS||1 month ago|
|README.md||1 week ago|
|SECURITY_CONTACTS||1 month ago|
|cloudbuild.yaml||7 months ago|
|code-of-conduct.md||2 years ago|
|go.mod||5 days ago|
|go.sum||5 days ago|
|main.go||1 month ago|
ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers.
Inspired by Kubernetes DNS, Kubernetes’ cluster-internal DNS server, ExternalDNS makes Kubernetes resources discoverable via public DNS servers. Like KubeDNS, it retrieves a list of resources (Services, Ingresses, etc.) from the Kubernetes API to determine a desired list of DNS records. Unlike KubeDNS, however, it’s not a DNS server itself, but merely configures other DNS providers accordingly—e.g. AWS Route 53 or Google Cloud DNS.
In a broader sense, ExternalDNS allows you to control DNS records dynamically via Kubernetes resources in a DNS provider-agnostic way.
The FAQ contains additional information and addresses several questions about key concepts of ExternalDNS.
ExternalDNS’ current release is
v0.7. This version allows you to keep selected zones (via
--domain-filter) synchronized with Ingresses and Services of
type=LoadBalancer in various cloud providers:
From this release, ExternalDNS can become aware of the records it is managing (enabled via
--registry=txt), therefore ExternalDNS can safely manage non-empty hosted zones. We strongly encourage you to use
v0.5 (or greater) with
--registry=txt enabled and
--txt-owner-id set to a unique value that doesn’t change for the lifetime of your cluster. You might also want to run ExternalDNS in a dry run mode (
--dry-run flag) to see the changes to be submitted to your DNS Provider API.
Note that all flags can be replaced with environment variables; for instance,
--dry-run could be replaced with
--registry txt could be replaced with
ExternalDNS supports multiple DNS providers which have been implemented by the ExternalDNS contributors. Maintaining all of those in a central repository is a challenge and we have limited resources to test changes. This means that it is very hard to test all providers for possible regressions and, as written in the Contributing section, we encourage contributors to step in as maintainers for the individual providers and help by testing the integrations.
We define the following stability levels for providers:
The following table clarifies the current status of the providers according to the aforementioned stability levels:
|Google Cloud DNS||Stable|
|AWS Route 53||Stable|
|AWS Cloud Map||Beta|
|Oracle Cloud Infrastructure DNS||Alpha|
The are two ways of running ExternalDNS:
The following tutorials are provided:
Make sure you have the following prerequisites:
First, get ExternalDNS:
$ git clone https://github.com/kubernetes-sigs/external-dns.git && cd external-dns
Assuming Go has been setup with module support it can be built simply by running:
This will create external-dns in the build directory directly from the default branch.
Next, run an application and expose it via a Kubernetes Service:
$ kubectl run nginx --image=nginx --replicas=1 --port=80 $ kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
Annotate the Service with your desired external DNS name. Make sure to change
example.org to your domain.
$ kubectl annotate service nginx "external-dns.alpha.kubernetes.io/hostname=nginx.example.org."
Optionally, you can customize the TTL value of the resulting DNS record by using the
$ kubectl annotate service nginx "external-dns.alpha.kubernetes.io/ttl=10"
For more details on configuring TTL, see here.
Locally run a single sync loop of ExternalDNS.
$ external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service --once --dry-run
This should output the DNS records it will modify to match the managed zone with the DNS records you desire. It also assumes you are running in the
default namespace. See the FAQ for more information regarding namespaces.
Note: TXT records will have
my-cluster-id value embedded. Those are used to ensure that ExternalDNS is aware of the records it manages.
Once you’re satisfied with the result, you can run ExternalDNS like you would run it in your cluster: as a control loop, and not in dry-run mode:
$ external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service
Check that ExternalDNS has created the desired DNS record for your Service and that it points to its load balancer’s IP. Then try to resolve it:
$ dig +short nginx.example.org. 126.96.36.199
Now you can experiment and watch how ExternalDNS makes sure that your DNS records are configured as desired. Here are a couple of things you can try out:
The tutorials section contains examples, including Ingress resources, and shows you how to set up ExternalDNS in different environments such as other cloud providers and alternative Ingress controllers.
If using a txt registry and attempting to use a CNAME the
--txt-prefix must be set to avoid conflicts. Changing
--txt-prefix will result in lost ownership over previously created records.
ExternalDNS was built with extensibility in mind. Adding and experimenting with new DNS providers and sources of desired DNS records should be as easy as possible. It should also be possible to modify how ExternalDNS behaves—e.g. whether it should add records but never delete them.
Here’s a rough outline on what is to come (subject to change):
Have a look at the milestones to get an idea of where we currently stand.
We encourage you to get involved with ExternalDNS, as users, contributors or as new maintainers that can take over some parts like different providers and help with code reviews.
Providers which currently need maintainers:
Any provider should have at least one maintainer. It would be nice if you run it in production, but it is not required. You should check changes and make sure your provider is working correctly.
It would be also great to have an automated end-to-end test for different cloud providers, so help from Kubernetes maintainers and their idea on how this can be done would be valuable.
If you are interested please reach out to us on the Kubernetes slack in the #external-dns channel.
For an overview on how to write new Sources and Providers check out Sources and Providers.
ExternalDNS is an effort to unify the following similar projects in order to bring the Kubernetes community an easy and predictable way of managing DNS records across cloud providers based on their Kubernetes resources:
Participation in the Kubernetes community is governed by the Kubernetes Code of Conduct.