Service source¶
The service source creates DNS entries based on Service
resources.
Filtering the Services considered¶
The --service-type-filter
flag filters Service resources by their spec.type
.
The flag may be specified multiple times to allow multiple service types.
This source supports the --label-filter
flag, which filters Service resources
by a set of labels.
Domain names¶
The domain names of the DNS entries created from a Service are sourced from the following places:
-
Adds the domain names from any
external-dns.alpha.kubernetes.io/hostname
and/or
external-dns.alpha.kubernetes.io/internal-hostname
annotation.
This behavior is suppressed if the--ignore-hostname-annotation
flag was specified. -
If no DNS entries were produced for a Service by the previous steps
and the--compatibility
flag was specified, then adds DNS entries per the
selected compatibility mode. -
If no DNS entries were produced for a Service by the previous steps
or the--combine-fqdn-annotation
flag was specified, then adds domain names
generated from any--fqdn-template
flag.
Domain names for headless service pods¶
If a headless Service (without an external-dns.alpha.kubernetes.io/target
annotation) creates DNS entries with targets from
a Pod that has a non-empty spec.hostname
field, additional DNS entries are created for that Pod, containing the targets from that Pod.
For each domain name created for the Service, the additional DNS entry for the Pod has that domain name prefixed with
the value of the Pod’s spec.hostname
field and a .
.
Targets¶
If the Service has an external-dns.alpha.kubernetes.io/target
annotation, uses
the values from that. Otherwise, the targets of the DNS entries created from a service are sourced depending
on the Service’s spec.type
:
LoadBalancer¶
-
If the hostname came from an
external-dns.alpha.kubernetes.io/internal-hostname
annotation, uses
the Service’sspec.clusterIP
field. If that field has the valueNone
, does not generate
any targets for the hostname. -
Otherwise, if the Service has one or more
spec.externalIPs
, uses the values in that field. -
Otherwise, iterates over each
status.loadBalancer.ingress
, adding any non-emptyip
and/orhostname
.
If the --resolve-service-load-balancer-hostname
flag was specified, any non-empty hostname
is queried through DNS and any resulting IP addresses are added instead.
A DNS query failure results in zero targets being added for that load balancer’s ingress hostname.
ClusterIP (headless)¶
Iterates over all of the Service’s Endpoints’s subsets.addresses
.
If the Service’s spec.publishNotReadyAddresses
is true
or the --always-publish-not-ready-addresses
flag is specified,
also iterates over the Endpoints’s subsets.notReadyAddresses
.
-
If an address does not target a
Pod
that matches the Service’sspec.selector
, it is ignored. -
If the target pod has an
external-dns.alpha.kubernetes.io/target
annotation, uses
the values from that. -
Otherwise, if the Service has an
external-dns.alpha.kubernetes.io/endpoints-type: NodeExternalIP
annotation, uses the addresses from the Pod’s Node’sstatus.addresses
that are either of type
ExternalIP
or IPv6 addresses of typeInternalIP
. -
Otherwise, if the Service has an
external-dns.alpha.kubernetes.io/endpoints-type: HostIP
annotation
or the--publish-host-ip
flag was specified, uses the Pod’sstatus.hostIP
field. -
Otherwise uses the
ip
field of the address from the Endpoints.
ClusterIP (not headless)¶
-
If the hostname came from an
external-dns.alpha.kubernetes.io/internal-hostname
annotation
or the--publish-internal-services
flag was specified, uses thespec.ServiceIP
. -
Otherwise, does not create any targets.
NodePort¶
If spec.ExternalTrafficPolicy
is Local
, iterates over each Node that both matches the Service’s spec.selector
and has a status.phase
of Running
. Otherwise iterates over all Nodes, of any phase.
Iterates over each relevant Node’s status.addresses
:
-
If there is an
external-dns.alpha.kubernetes.io/access: public
annotation on the Service, uses both addresses with
atype
ofExternalIP
and IPv6 addresses with atype
ofInternalIP
. -
Otherwise, if there is an
external-dns.alpha.kubernetes.io/access: private
annotation on the Service, uses addresses with
atype
ofInternalIP
. -
Otherwise, if there is at least one address with a
type
ofExternalIP
, uses both addresses with
atype
ofExternalIP
and IPv6 addresses with atype
ofInternalIP
. -
Otherwise, uses addresses with a
type
ofInternalIP
.
Also iterates over the Service’s spec.ports
, creating a SRV record for each port which has a nodePort
.
The SRV record has a service of the Service’s name
, a protocol taken from the port’s protocol
field,
a priority of 0
and a weight of 50
.
In order for SRV records to be created, the --managed-record-types
must have been specified, including SRV
as one of the values.
ExternalName¶
- If the Service has one or more
spec.externalIPs
, uses the values in that field. - Otherwise, creates a target with the value of the Service’s
externalName
field.