---
id: "external-dns"
type: "component"
kind: "dns"
provider: "default"
category: "edge"
docs: "https://kubernetes-sigs.github.io/external-dns/latest/"
url: "https://localhost:3000/catalogue/components/external-dns"
---

# ExternalDNS

Kubernetes controller that writes Services and Ingresses into an external DNS provider.

| | |
|---|---|
| Provider | [default](https://localhost:3000/catalogue?provider=default) |
| Kind | [DNS](https://localhost:3000/catalogue/kinds/dns) |
| Category | Edge |
| Official docs | [https://kubernetes-sigs.github.io/external-dns/latest/](https://kubernetes-sigs.github.io/external-dns/latest/) |

## Properties

| property | type | values | required | kind default | this component |
|---|---|---|---|---|---|
| `anycast` | boolean | — | no | false | **false** |
| `deletesRecords` | boolean | — | no | false | inherited |
| `geoRouting` | boolean | — | no | false | **false** |
| `healthChecked` | boolean | — | no | false | **false** |
| `managed` | boolean | — | no | true | **false** |
| `policy` | enum | `upsert-only`, `sync` | no | "upsert-only" | inherited |
| `redundantProviders` | boolean | — | no | false | inherited |
| `registry` | enum | `txt`, `noop` | no | "txt" | inherited |
| `ttlSeconds` | integer | — | no | — | inherited |

Bold values are the ones this component pins.

## Rules that apply · 1

### Shared dependency without redundancy `shared-dependency-without-redundancy` (error)

- Page: https://localhost:3000/catalogue/rules/shared-dependency-without-redundancy.md
- Why: The design requires redundant discovery, but this DNS or coordination service, which everything depends on, runs on a single provider or a single replica. Its failure is the whole system's failure.
- Applies to: every node of kind dns or coordination-service
- Message: Shared dependency '{{node.id}}' is not redundant, but the design requires redundant discovery.

It fires when:

- all of these hold:
  - the design requirement `availability.discoveryRedundant` is true
  - any of these hold:
    - the node's `redundantProviders` is false
    - the node's `replicated` is false

## Other products of the same kind · 33

- [Alibaba Cloud DNS](https://localhost:3000/catalogue/components/alibaba-dns.md) `alibaba-dns` — alibabacloud
- [Alibaba Cloud Domain Names](https://localhost:3000/catalogue/components/alibaba-domains.md) `alibaba-domains` — alibabacloud
- [Alibaba Cloud DNS PrivateZone](https://localhost:3000/catalogue/components/alibaba-private-zone.md) `alibaba-private-zone` — alibabacloud
- [Amazon Application Recovery Controller (ARC)](https://localhost:3000/catalogue/components/aws-application-recovery-controller.md) `aws-application-recovery-controller` — aws
- [Amazon Route 53 Global Resolver](https://localhost:3000/catalogue/components/aws-route53-global-resolver.md) `aws-route53-global-resolver` — aws
- [Amazon Route 53 Resolver endpoint](https://localhost:3000/catalogue/components/aws-route53-resolver.md) `aws-route53-resolver` — aws
- [Amazon Route 53](https://localhost:3000/catalogue/components/route53.md) `route53` — aws
- [Azure DNS](https://localhost:3000/catalogue/components/azure-dns.md) `azure-dns` — azure
- [Azure DNS Private Resolver](https://localhost:3000/catalogue/components/azure-dns-private-resolver.md) `azure-dns-private-resolver` — azure
- [Azure Private DNS](https://localhost:3000/catalogue/components/azure-private-dns.md) `azure-private-dns` — azure
- [Azure Traffic Manager](https://localhost:3000/catalogue/components/azure-traffic-manager.md) `azure-traffic-manager` — azure
- [Cloudflare DNS](https://localhost:3000/catalogue/components/cloudflare-dns.md) `cloudflare-dns` — cloudflare
- [Cloudflare Internal DNS](https://localhost:3000/catalogue/components/cloudflare-internal-dns.md) `cloudflare-internal-dns` — cloudflare
- [Cloudflare Registrar](https://localhost:3000/catalogue/components/cloudflare-registrar.md) `cloudflare-registrar` — cloudflare
- [Cloudflare Secondary DNS](https://localhost:3000/catalogue/components/cloudflare-secondary-dns.md) `cloudflare-secondary-dns` — cloudflare
- [BIND 9](https://localhost:3000/catalogue/components/bind.md) `bind` — default
- [CoreDNS](https://localhost:3000/catalogue/components/coredns.md) `coredns` — default
- [Generic DNS](https://localhost:3000/catalogue/components/dns.md) `dns` — default
- [DNS](https://localhost:3000/catalogue/components/dns-resolver.md) `dns-resolver` — default
- [dnsmasq](https://localhost:3000/catalogue/components/dnsmasq.md) `dnsmasq` — default
- [Knot DNS](https://localhost:3000/catalogue/components/knot-dns.md) `knot-dns` — default
- [IBM NS1 Connect](https://localhost:3000/catalogue/components/ns1.md) `ns1` — default
- [Pi-hole](https://localhost:3000/catalogue/components/pi-hole.md) `pi-hole` — default
- [PowerDNS Authoritative Server](https://localhost:3000/catalogue/components/powerdns.md) `powerdns` — default
- [Unbound](https://localhost:3000/catalogue/components/unbound.md) `unbound` — default
- [DigitalOcean DNS](https://localhost:3000/catalogue/components/digitalocean-dns.md) `digitalocean-dns` — digitalocean
- [Google Cloud DNS](https://localhost:3000/catalogue/components/google-cloud-dns.md) `google-cloud-dns` — gcp
- [Cloud Domains](https://localhost:3000/catalogue/components/google-cloud-domains.md) `google-cloud-domains` — gcp
- [IBM Cloud DNS Services](https://localhost:3000/catalogue/components/ibm-dns-services.md) `ibm-dns-services` — ibm
- [DNS Private Zone](https://localhost:3000/catalogue/components/oci-dns-private-zone.md) `oci-dns-private-zone` — oci
- [DNS Public Zone](https://localhost:3000/catalogue/components/oci-dns-zone.md) `oci-dns-zone` — oci
- [Traffic Management Steering Policy](https://localhost:3000/catalogue/components/oci-traffic-management.md) `oci-traffic-management` — oci
- [OpenStack Designate](https://localhost:3000/catalogue/components/openstack-designate.md) `openstack-designate` — openstack

## Use it in a design

```yaml
nodes:
  - { id: "external-dns", component: "external-dns" }
```

## Source (`component` YAML, verbatim)

```yaml
# yaml-language-server: $schema=../../schema/component.schema.json
# ExternalDNS: a Kubernetes controller that "synchronizes exposed Kubernetes Services and Ingresses
# with DNS providers". It is not a DNS server; it writes records into Route 53, Cloud DNS and the
# rest. It marks the records it owns with TXT registry entries keyed by --txt-owner-id, and deleting a
# record needs --policy=sync, so the default upsert-only policy never removes one ("ExternalDNS").
schemaVersion: "1"
type: "component"
id: "external-dns"
kind: "dns"
provider: "default"
docs: "https://kubernetes-sigs.github.io/external-dns/latest/"
defaults:
  managed: false
  anycast: false
  geoRouting: false
  healthChecked: false
properties:
  policy:
    type: "enum"
    values: ["upsert-only", "sync"]
    default: "upsert-only"
  registry:
    type: "enum"
    values: ["txt", "noop"]
    default: "txt"
  deletesRecords:
    type: "boolean"
    default: false
```

Human page: https://localhost:3000/catalogue/components/external-dns
