DNS
DNS within Kubernetes serves as one of its core functionalities, offering naming services through extensions like kube-dns or CoreDNS.
CoreDNS: The Preferred Choice for Kubernetes
Starting with version 1.11, CoreDNS is available for naming services and was adopted as the default DNS service from v1.13 onward. CoreDNS distinguishes itself by its increased efficiency and reduced resource consumption, making it the recommended replacement for kube-dns in cluster DNS service provision.
The process of upgrading from kube-dns to CoreDNS involves:
For new deployments, click here to view the configuration method for the CoreDNS extension.
Supported DNS Record Types
Service
A record: Generates
my-svc.my-namespace.svc.cluster.local
with IP resolution in two scenarios:Normal Service resolves to Cluster IP.
Headless Service resolves to a specified list of Pod IPs.
SRV record: Generates
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
.
Pod
A record:
pod-ip-address.my-namespace.pod.cluster.local
.Specific hostname and subdomain:
hostname.custom-subdomain.default.svc.cluster.local
as illustrated below:
Configuring Private and Upstream DNS Servers
As of Kubernetes 1.6, customization of stub domains and upstream name servers is possible by providing a ConfigMap to kube-dns. For example, the following setup inserts a separate private root DNS server along with two upstream DNS servers.
Using the specific configuration mentioned above, query requests are initially sent to the DNS cache layer of kube-dns (the Dnsmasq server). The server first checks the request's suffix, sending those with a cluster suffix (e.g., ”.cluster.local”) to kube-dns and names with a stub domain suffix (e.g., ”.acme.local”) to the designated private DNS server [“1.2.3.4”]. Lastly, requests not matching any of these suffixes will be forwarded to the upstream DNS [“8.8.8.8”, “8.8.4.4”].
kube-dns
Deploying a kube-dns Example
DNS services are generally deployed as extensions, for instance by placing the kube-dns.yaml in the /etc/kubernetes/addons
directory on the Master node. Manual deployment is also an option:
This action will initiate a Pod within Kubernetes that contains three containers running the three DNS-related services:
Kubernetes v1.10 also supports the Beta version of CoreDNS which has performance advantages over kube-dns. This can be deployed as an extension by placing coredns.yaml in the /etc/kubernetes/addons
directory on the Master node, or deployed manually:
How kube-dns Works
As the diagram below illustrates, kube-dns is comprised of three containers:
kube-dns: The core component of DNS services, mainly consisting of KubeDNS and SkyDNS
KubeDNS is responsible for monitoring changes in Services and Endpoints, and updating the relevant information in SkyDNS.
SkyDNS handles DNS resolution, listening on port 10053 (tcp/udp), as well as port 10055 for metrics.
The kube-dns service also listens on port 8081 for health checks.
dnsmasq-nanny: Responsible for starting dnsmasq and restarting it upon configuration changes.
dnsmasq's upstream is SkyDNS, meaning internal DNS resolution within the cluster is managed by SkyDNS.
sidecar: Responsible for health checks and serving DNS metrics (listening on port 10054).
A Glimpse at the Source Code
The code for kube-dns has been separated from the main Kubernetes repository, now housed at https://github.com/kubernetes/dns.
The code for kube-dns, dnsmasq-nanny, and sidecar all start at cmd/<cmd-name>/main.go
, and they call on pkg/dns
, pkg/dnsmasq
, and pkg/sidecar
respectively to execute their tasks. The core DNS resolution, however, directly utilizes code from github.com/skynetservices/skydns/server
with specific implementation visible at skynetservices/skydns.
Common Issues
DNS Resolution Issues in Ubuntu 18.04
Ubuntu 18.04 by default enables systemd-resolved, which places nameserver 127.0.0.53
in the system's /etc/resolv.conf. Since this is a local address, it may cause CoreDNS or kube-dns to fail in resolving external web addresses.
The solution involves replacing the systemd-resolved generated resolv.conf file:
Alternatively, manually specify the resolv.conf path for the DNS service:
Reference Materials
最后更新于