ExternalName Services

ExternalName Services and Service Topology

An ExternalName Service is a DNS CNAME to an outside host, a local name for a dependency such as a managed database. The listing also sets a topology preference on the API:

An in-cluster name that points outsideShell
kubectl create service externalname docs --external-name=example.com
kubectl exec client -- nslookup docs 2>/dev/null | grep -m1 canonical
kubectl patch service api -p '{"spec": {"trafficDistribution": "PreferSameNode"}}' >/dev/null
F='{range .items[*].endpoints[*]}{.addresses[0]} hint: {.hints.forNodes[0].name}{"\n"}{end}'
kubectl get endpointslices -l kubernetes.io/service-name=api -o jsonpath="$F"
Output
service/docs created
docs.booknest.svc.cluster.local   canonical name = example.com
10.244.1.105 hint: l3-booknest-worker
10.244.1.106 hint: l3-booknest-worker
10.244.1.104 hint: l3-booknest-worker

ExternalName does no proxying or port mapping, and HTTPS clients see the real host's certificate. By default kube-proxy spreads traffic over all ready endpoints, even across zones that bill for it. trafficDistribution (stable since 1.33) prefers close ones, PreferSameZone or PreferSameNode (stable since 1.35), published as the hints above. The stricter internalTrafficPolicy: Local and externalTrafficPolicy: Local allow only node-local endpoints; the latter also keeps the client's source IP.