kubernetes下的DNS

Kubernetes中的DNS主要用作服务发现,在集群中调度Pod和Service,并且配置kubelet使得容器可以使用DNS Service的IP解析域名

skyDNS(Kubernetes 1.3)—>kubeDNS(Kubernetes1.3之后)—>CoreDNS(Kubernetes 1.11之后GA)

stubdomains、upstreamnameservers(1.6增加)、federation

DNS

svc

A记录(域名解析IP的记录):

SRV记录:

Pod:

kube-DNS

CoreDNS和kube-DNS主要差异

实现差异

kube-dns中一个pod内使用了数个容器:kubedns、dnsmasq 和 sidecar。 kubedns 进程监视 Kubernetes master 对 Service 和 Endpoint 操作的变更,并维护一个内存查询结构去处理 DNS 请求。dnsmasq 容器增加了一个 DNS 缓存来改善性能。为执行对 dnsmasq 和 kubedns 的健康检查,sidecar容器提供了一个单独的健康检查 Endpoint

dnsmasq中的安全漏洞导致过去需要发布Kubernetes安全补丁。此外,由于dnsmasq处理存根域,但kubedns处理External Services,因此你无法在外部服务中使用存根域

一体化解决方案

区别于 kube-dns,CoreDNS 编译出来就是一个单独的二进制可执行文件,内置了 cache,backend storage ,health check 等功能,无需第三方组件来辅助实现其他功能,从而使得部署更方便,内存管理更为安全;

bug修复和增强功能

——dns#55:kube-dns的自定义DNS条目可以通过使用kubernetes插件中的“fallthrough”机制、使用重写插件或者仅使用不同的插件(如文件插件)提供子区域来处理。

——dns#116:只有一个A记录集用于具有单个主机名的pod无头服务。此问题已修复,无需任何其他配置。

——dns#131: externalName不使用stubDomains设置。此问题已修复,无需任何其他配置。

——dns#167:启用skyDNS循环A / AAAA记录。可以使用负载均衡插件配置等效功能。

——dns#190:kube-dns无法以非root用户身份运行。现在通过使用非默认镜像解决了此问题,但在将来的版本中它将成为默认的CoreDNS行为。

——dns#232:将pod hostname修复为dns srv记录的podname,这是通过下面描述的“endpoint_pod_names”功能支持的增强功能。

CoreDNS实现原理

插件化

Kube-dns三个容器,CoreDNS****一个容器

区别于**kube-DNSCoreDNS编译出为一个单独二进制可执行文件,内置了** cachebackend storage ,****health check 等功能,无需第三方组件来辅助实现其他功能,从而使得部署更方便,内存管理更为安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}

example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}

example.net:53 {
file /etc/coredns/zones/example.net.db
}

.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
kubernetes cluster.local 10.0.0.0/24
file /etc/coredns/example.db example.org
proxy . /etc/resolv.conf
cache 30
}

从kube-dns迁移到CoreDNS

在Kubernetes1.10之后,CoreDNS支持将kube-dns的ConfigMap转换成CoreDNS的Corefile。也就是说,当你在kube-dns中已经通过ConfigMap配置了stubdomainsupstreamnameserversfederation 等参数, 在通过kubeadm upgrade 来安装CoreDNS后,将自动转换原来的ConfigMap到CoreDNS下的Corefile。

kube-dns下的ConfigMap:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
data:
federations: |
{"foo" : "foo.feddomain.com"}
stubDomains: |
{"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
upstreamNameservers: |
["8.8.8.8", "8.8.4.4"]
kind: ConfigMap
metadata:
creationTimestamp: 2018-01-22T20:21:56Z
name: kube-dns
namespace: kube-system

转换后的CoreDNS Corefile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
upstream 8.8.8.8 8.8.4.4
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
federation cluster.local {
foo foo.feddomain.com
}
prometheus :9153
proxy . 8.8.8.8 8.8.4.4
cache 30
}
abc.com:53 {
errors
cache 30
proxy . 1.2.3.4
}
my.cluster.local:53 {
errors
cache 30
proxy . 2.3.4.5
}

检查可以升级的CoreDNS版本

1
kubeadm upgrade plan  --feature-gates CoreDNS=true

升级成CoreDNS并且设为默认DNS

1
kubeadm upgrade apply <version> --feature-gates CoreDNS=true

新建集群设置CoreDNS为默认

1
kubeadm init --feature-gates CoreDNS=true

kubeadm upgrade

References

coredns-ga-for-kubernetes-cluster-dns

How Queries Are Processed in CoreDNS

migration-from-kube-dns-to-coredns

deploying-kubernetes-with-coredns-using-kubeadm



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!