README.md 14.9 KB
Newer Older
1
2
3
4
<p align="center">
	<img src="img/external-dns.png" width="40%" align="center" alt="ExternalDNS">
</p>

Lauri Apple's avatar
Lauri Apple committed
5
# ExternalDNS
6
7
8
9
10
[![Build Status](https://travis-ci.org/kubernetes-sigs/external-dns.svg?branch=master)](https://travis-ci.org/kubernetes-sigs/external-dns)
[![Coverage Status](https://coveralls.io/repos/github/kubernetes-sigs/external-dns/badge.svg?branch=master)](https://coveralls.io/github/kubernetes-sigs/external-dns?branch=master)
[![GitHub release](https://img.shields.io/github/release/kubernetes-sigs/external-dns.svg)](https://github.com/kubernetes-sigs/external-dns/releases)
[![go-doc](https://godoc.org/github.com/kubernetes-sigs/external-dns?status.svg)](https://godoc.org/github.com/kubernetes-sigs/external-dns)
[![Go Report Card](https://goreportcard.com/badge/github.com/kubernetes-sigs/external-dns)](https://goreportcard.com/report/github.com/kubernetes-sigs/external-dns)
Henning Jacobs's avatar
title    
Henning Jacobs committed
11

Lauri Apple's avatar
Lauri Apple committed
12
ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers.
Henning Jacobs's avatar
Henning Jacobs committed
13

Lauri Apple's avatar
Lauri Apple committed
14
## What It Does
Henning Jacobs's avatar
Henning Jacobs committed
15

16
Inspired by [Kubernetes DNS](https://github.com/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](https://kubernetes.io/docs/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](https://aws.amazon.com/route53/) or [Google Cloud DNS](https://cloud.google.com/dns/docs/).
Henning Jacobs's avatar
Henning Jacobs committed
17

Lauri Apple's avatar
Lauri Apple committed
18
In a broader sense, ExternalDNS allows you to control DNS records dynamically via Kubernetes resources in a DNS provider-agnostic way.
19

20
21
The [FAQ](docs/faq.md) contains additional information and addresses several questions about key concepts of ExternalDNS.

vanhumbeecka's avatar
vanhumbeecka committed
22
To see ExternalDNS in action, have a look at this [video](https://www.youtube.com/watch?v=9HQ2XgL9YVI) or read this [blogpost](https://medium.com/wearetheledger/deploying-test-environments-with-azure-devops-eks-and-externaldns-67abe647e4e).
23

24
## The Latest Release: v0.6
25

26
ExternalDNS' current release is `v0.6`. This version allows you to keep selected zones (via `--domain-filter`) synchronized with Ingresses and Services of `type=LoadBalancer` in various cloud providers:
27
* [Google Cloud DNS](https://cloud.google.com/dns/docs/)
28
* [AWS Route 53](https://aws.amazon.com/route53/)
29
* [AWS Cloud Map](https://docs.aws.amazon.com/cloud-map/)
30
* [AzureDNS](https://azure.microsoft.com/en-us/services/dns)
31
* [CloudFlare](https://www.cloudflare.com/dns)
32
* [RcodeZero](https://www.rcodezero.at/)
33
* [DigitalOcean](https://www.digitalocean.com/products/networking)
34
* [DNSimple](https://dnsimple.com/)
35
* [Infoblox](https://www.infoblox.com/products/dns/)
Julian Vassev's avatar
Julian Vassev committed
36
* [Dyn](https://dyn.com/dns/)
37
38
* [OpenStack Designate](https://docs.openstack.org/designate/latest/)
* [PowerDNS](https://www.powerdns.com/)
Nick Jüttner's avatar
Nick Jüttner committed
39
* [CoreDNS](https://coredns.io/)
40
* [Exoscale](https://www.exoscale.com/dns/)
41
* [Oracle Cloud Infrastructure DNS](https://docs.cloud.oracle.com/iaas/Content/DNS/Concepts/dnszonemanagement.htm)
42
* [Linode DNS](https://www.linode.com/docs/networking/dns/)
43
* [RFC2136](https://tools.ietf.org/html/rfc2136)
44
* [NS1](https://ns1.com/)
Reinier Schoof's avatar
Reinier Schoof committed
45
* [TransIP](https://www.transip.eu/domain-name/)
Dave Grizzanti's avatar
Dave Grizzanti committed
46
* [VinylDNS](https://www.vinyldns.io)
Henning Jacobs's avatar
Henning Jacobs committed
47

48
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.
49

50
51
52
53
Note that all flags can be replaced with environment variables; for instance,
`--dry-run` could be replaced with `EXTERNAL_DNS_DRY_RUN=1`, or
`--registry txt` could be replaced with `EXTERNAL_DNS_REGISTRY=txt`.

54
55
## Status of providers

56
ExternalDNS supports multiple DNS providers which have been implemented by the [ExternalDNS contributors](https://github.com/kubernetes-sigs/external-dns/graphs/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](#Contributing) section, we encourage contributors to step in as maintainers for the individual providers and help by testing the integrations.
57
58
59
60
61
62
63

End-to-end testing of ExternalDNS is currently
[performed](https://github.com/zalando-incubator/kubernetes-on-aws/blob/dev/test/e2e/external_dns.go)
in the separate
[kubernetes-on-aws](https://github.com/zalando-incubator/kubernetes-on-aws)
repository.

64
65
66
67
68
69
70
71
72
73
74
75
We define the following stability levels for providers:

- **Stable**: Used for smoke tests before a release, used in production and maintainers are active.
- **Beta**: Community supported, well tested, but maintainers have no access to resources to execute integration tests on the real platform and/or are not using it in production.
- **Alpha**: Community provided with no support from the maintainers apart from reviewing PRs.

The following table clarifies the current status of the providers according to the aforementioned stability levels:

| Provider | Status |
| -------- | ------ |
| Google Cloud DNS | Stable |
| AWS Route 53 | Stable |
76
| AWS Cloud Map | Beta |
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| AzureDNS | Beta |
| CloudFlare | Beta
| RcodeZero | Alpha |
| DigitalOcean | Alpha |
| DNSimple | Alpha |
| Infoblox | Alpha |
| Dyn | Alpha |
| OpenStack Designate | Alpha |
| PowerDNS | Alpha |
| CoreDNS | Alpha |
| Exoscale | Alpha |
| Oracle Cloud Infrastructure DNS | Alpha |
| Linode DNS | Alpha |
| RFC2136 | Alpha |
91
| NS1 | Alpha |
Reinier Schoof's avatar
Reinier Schoof committed
92
| TransIP | Alpha |
Dave Grizzanti's avatar
Dave Grizzanti committed
93
| VinylDNS | Alpha |
Jason-ZW's avatar
Jason-ZW committed
94
| RancherDNS | Alpha |
95
| Akamai FastDNS | Alpha |
96
97
98
99
100

## Running ExternalDNS:

The are two ways of running ExternalDNS:

101
102
103
* Deploying to a Cluster
* Running Locally

104
### Deploying to a Cluster
105
106
107

The following tutorials are provided:

xianlubird's avatar
xianlubird committed
108
* [Alibaba Cloud](docs/tutorials/alibabacloud.md)
109
110
111
112
* AWS
	* [ALB Ingress Controller](docs/tutorials/alb-ingress.md)
	* [Route53](docs/tutorials/aws.md)
		* [Same domain for public and private Route53 zones](docs/tutorials/public-private-route53.md)
113
	* [Cloud Map](docs/tutorials/aws-sd.md)
114
115
* [Azure DNS](docs/tutorials/azure.md)
* [Azure Private DNS](docs/tutorials/azure-private-dns.md)
116
* [Cloudflare](docs/tutorials/cloudflare.md)
117
* [CoreDNS](docs/tutorials/coredns.md)
118
* [DigitalOcean](docs/tutorials/digitalocean.md)
119
* [DNSimple](docs/tutorials/dnsimple.md)
Julian Vassev's avatar
Julian Vassev committed
120
* [Dyn](docs/tutorials/dyn.md)
121
122
* [Exoscale](docs/tutorials/exoscale.md)
* [ExternalName Services](docs/tutorials/externalname.md)
123
124
125
* Google Container Engine
	* [Using Google's Default Ingress Controller](docs/tutorials/gke.md)
	* [Using the Nginx Ingress Controller](docs/tutorials/nginx-ingress.md)
126
127
128
129
* [Headless Services](docs/tutorials/hostport.md)
* [Infoblox](docs/tutorials/infoblox.md)
* [Istio Gateway Source](docs/tutorials/istio.md)
* [Kubernetes Security Context](docs/tutorials/security-context.md)
cliedeman's avatar
cliedeman committed
130
* [Linode](docs/tutorials/linode.md)
131
* [Nginx Ingress Controller](docs/tutorials/nginx-ingress.md)
132
* [NS1](docs/tutorials/ns1.md)
133
134
135
136
137
138
* [OpenStack Designate](docs/tutorials/designate.md)
* [Oracle Cloud Infrastructure (OCI) DNS](docs/tutorials/oracle.md)
* [PowerDNS](docs/tutorials/pdns.md)
* [RcodeZero](docs/tutorials/rcodezero.md)
* [RancherDNS (RDNS)](docs/tutorials/rdns.md)
* [RFC2136](docs/tutorials/rfc2136.md)
Reinier Schoof's avatar
Reinier Schoof committed
139
* [TransIP](docs/tutorials/transip.md)
140
* [VinylDNS](docs/tutorials/vinyldns.md)
141

142
### Running Locally
143

144
#### Technical Requirements
Henning Jacobs's avatar
Henning Jacobs committed
145

Lauri Apple's avatar
Lauri Apple committed
146
147
Make sure you have the following prerequisites:
* A local Go 1.7+ development environment.
148
* Access to a Google/AWS account with the DNS API enabled.
Lauri Apple's avatar
Lauri Apple committed
149
150
* Access to a Kubernetes cluster that supports exposing Services, e.g. GKE.

151
#### Setup Steps
Lauri Apple's avatar
Lauri Apple committed
152
153

First, get ExternalDNS:
Henning Jacobs's avatar
Henning Jacobs committed
154

155
```console
156
$ git clone https://github.com/kubernetes-sigs/external-dns.git && cd external-dns
njuettner's avatar
njuettner committed
157
158
159
160
161
162
163
164
165
166
```

**This project uses [Go modules](https://github.com/golang/go/wiki/Modules) as
introduced in Go 1.11 therefore you need Go >=1.11 installed in order to build.**
If using Go 1.11 you also need to [activate Module
support](https://github.com/golang/go/wiki/Modules#installing-and-activating-module-support).

Assuming Go has been setup with module support it can be built simply by running:

```console
167
$ make
168
```
Henning Jacobs's avatar
Henning Jacobs committed
169

170
171
This will create external-dns in the build directory directly from master.

Lauri Apple's avatar
Lauri Apple committed
172
Next, run an application and expose it via a Kubernetes Service:
Henning Jacobs's avatar
Henning Jacobs committed
173

174
175
176
177
```console
$ kubectl run nginx --image=nginx --replicas=1 --port=80
$ kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
```
178

179
Annotate the Service with your desired external DNS name. Make sure to change `example.org` to your domain.
180

181
182
183
```console
$ kubectl annotate service nginx "external-dns.alpha.kubernetes.io/hostname=nginx.example.org."
```
184

185
186
187
188
189
190
191
192
Optionally, you can customize the TTL value of the resulting DNS record by using the `external-dns.alpha.kubernetes.io/ttl` annotation:

```console
$ kubectl annotate service nginx "external-dns.alpha.kubernetes.io/ttl=10"
```

For more details on configuring TTL, see [here](docs/ttl.md).

193
Locally run a single sync loop of ExternalDNS.
194

195
```console
196
$ external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service --once --dry-run
197
```
Henning Jacobs's avatar
Henning Jacobs committed
198

199
200
201
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](docs/faq.md) 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.
Henning Jacobs's avatar
Henning Jacobs committed
202

203
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:
204
205

```console
206
$ external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service
207
208
```

Lauri Apple's avatar
Lauri Apple committed
209
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:
210
211
212
213
214
215
216
217
218
219
220
221

```console
$ dig +short nginx.example.org.
104.155.60.49
```

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:
* Change the desired hostname by modifying the Service's annotation.
* Recreate the Service and see that the DNS record will be updated to point to the new load balancer IP.
* Add another Service to create more DNS records.
* Remove Services to clean up your managed zone.

Lauri Apple's avatar
Lauri Apple committed
222
The [tutorials](docs/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.
223

224
225
226
227
# Note

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.

228
229
# Roadmap

Lauri Apple's avatar
Lauri Apple committed
230
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.
231

232
Here's a rough outline on what is to come (subject to change):
233
234
235

### v0.1

236
237
- [x] Support for Google CloudDNS
- [x] Support for Kubernetes Services
238
239
240

### v0.2

241
242
- [x] Support for AWS Route 53
- [x] Support for Kubernetes Ingresses
243

244
### v0.3
245

246
247
248
- [x] Support for AWS Route 53 via ALIAS
- [x] Support for multiple zones
- [x] Ownership System
249

250
### v0.4
251
252
253
254
255
256

- [x] Support for AzureDNS
- [x] Support for CloudFlare
- [x] Support for DigitalOcean
- [x] Multiple DNS names per Service

257
### v0.5 - _current version_
258

259
260
261
- [x] Support for creating DNS records to multiple targets (for Google and AWS)
- [x] Support for OpenStack Designate
- [x] Support for PowerDNS
262
- [x] Support for Linode
njuettner's avatar
njuettner committed
263
- [x] Support for RcodeZero
264
- [x] Support for NS1
265
- [x] Support for TransIP
266
- [x] Support for Azure Private DNS
267
268
269
270
271

### v0.6

- [ ] Ability to replace Kops' [DNS Controller](https://github.com/kubernetes/kops/tree/master/dns-controller) (This could also directly become `v1.0`)

272
273
### v1.0

274
- [ ] Ability to replace Kops' [DNS Controller](https://github.com/kubernetes/kops/tree/master/dns-controller)
275
- [x] Ability to replace Zalando's [Mate](https://github.com/linki/mate)
276
- [x] Ability to replace Molecule Software's [route53-kubernetes](https://github.com/wearemolecule/route53-kubernetes)
277
278
279

### Yet to be defined

280
* Support for CoreDNS
281
282
283
* Support for record weights
* Support for different behavioral policies
* Support for Services with `type=NodePort`
284
* Support for CRDs
285
286
* Support for more advanced DNS record configurations

287
Have a look at [the milestones](https://github.com/kubernetes-sigs/external-dns/milestones) to get an idea of where we currently stand.
288

Lauri Apple's avatar
Lauri Apple committed
289
## Contributing
290

291
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.
292

293
294
295
296
297
298
299
300
301
302
303
Providers which currently need maintainers:

* Azure
* Cloudflare
* Digital Ocean
* Google Cloud Platform

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.
304

305
306
307
308
309
Read the [contributing guidelines](CONTRIBUTING.md) and have a look at [the contributing docs](docs/contributing/getting-started.md) to learn about building the project, the project structure, and the purpose of each package.

If you are interested please reach out to us on the [Kubernetes slack](http://slack.k8s.io) in the #external-dns channel.

For an overview on how to write new Sources and Providers check out [Sources and Providers](docs/contributing/sources-and-providers.md).
310

Lauri Apple's avatar
Lauri Apple committed
311
## Heritage
312

Lauri Apple's avatar
Lauri Apple committed
313
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:
314
315

* Kops' [DNS Controller](https://github.com/kubernetes/kops/tree/master/dns-controller)
316
* Zalando's [Mate](https://github.com/linki/mate)
317
* Molecule Software's [route53-kubernetes](https://github.com/wearemolecule/route53-kubernetes)
318

319
### User Demo How-To Blogs and Examples
JPantsjoha's avatar
JPantsjoha committed
320
* A full demo on GKE Kubernetes. See [How-to Kubernetes with DNS management (ssl-manager pre-req)](https://medium.com/@jpantjsoha/how-to-kubernetes-with-dns-management-for-gitops-31239ea75d8d)
321

Lauri Apple's avatar
Lauri Apple committed
322
323
324
### Code of conduct

Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md).