## skydns
在kubernetes1.3版本之前,kubernetes默认的dns方案是使用kube2sky监听kubernetes api,将service相关变化写入到etcd集群,通过skydns来完成kubernetes内部域名解析。
优点:kubernetes原生支持
缺点:
1. skydns没有缓存,所有解析都直接从etcd读取,性能较差。
2. kube2sky官方已停止支持,在后续kubernetes版本中,该方案被kube-dns取代。
## containerdns
京东containerdns是在原生skydns上做了若干改进的开源产品,其中最明显的改进的三大特性为:
1. 支持多域名解析
2. 在container本地添加缓存,尽量将解析缓存到内存中,以提升解析速度
3. 提供监控插件,可以监控解析的失败率以及解析失败后的故障转移
目前该方案应用于京东JDOS2.0系统中。
缺点:
1. 方案虽然开源,但社区活跃度极低。
2. 在实际使用过程中,经常出现解析间歇性丢失的情况
3. 针对clusterIP的解析,未经过实际生产验证
## kube-dns
kube-dns是kubernetes 1.3到1.8版本默认使用的dns,用于取代1.3版本之前的skydns方案,然而本质上,kube-dns的核心仍然是skydns。kube-dns组件负责监听kubernetes api,获取service的变化,并在内存中维护lookup结构用于dns请求。并使用dnsmasq容器增加dns缓存,进一步提升解析性能。
优点: kubernetes原生方案,性能更好,同时kubernetes提供原生的dns扩缩容解决方案
缺点:
1. 完全摒弃了写磁盘的方式,将所有解析都写入内存以提高解析效率,但同时一旦内存分配不足,解析数据会直接丢失,且未在大规模应用中验证
2. 从1.9开始,kubernetes官方也放弃了这种方式,转而采用coredns
## coredns
从kubernetes 1.9开始,kubernetes的默认dns变更为coredns。在1.9版本中,coredns还是alpha版,然后在最新的kubernetes 1.10版本中,升级到了beta版。截止目前为止,coredns也已发布v1.1.2版本,趋于稳定。
coredns与skydns2的作者是同一个人。按照官方的说法,coredns采用更模块化,可扩展的框架构建。CoreDNS利用作为Web服务器Caddy的一部分而开发的服务器框架。该框架具有非常灵活,可扩展的模型,用于通过各种中间件组件传递请求。这些中间件组件根据请求提供不同的操作,例如记录,重定向,修改或维护。虽然它一开始作为Web服务器,但是Caddy并不是专门针对HTTP协议的,而是构建了一个基于CoreDNS的理想框架。
在这种灵活的模型中添加对Kubernetes的支持,相当于创建了一个Kubernetes中间件。该中间件使用Kubernetes API来满足针对特定Kubernetes pod或服务的DNS请求。
优点:在新版本kubernetes中原生支持。完全兼容kube-dns,且做了大量改进。
缺点:该方案较新,目前尚未在社区经过大规模验证。
* * * * *
**### 我们这里采用集群外部安装coredns**
Coredns的安装
~~~
root@ubuntu:~# wget https://github.com/coredns/coredns/releases/download/v1.2.1/coredns_1.2.1_linux_amd64.tgz
root@ubuntu:~# tar xf coredns_1.2.1_linux_amd64.tgz
root@ubuntu:~# chmod +x coredns && mv coredns /opt/kubernetes/bin/
配置corefile配置文件
root@ubuntu:~# vim /opt/kubernetes/cfg/Corefile
.:53 {
kubernetes {{ CLUSTER_DNS_DOMAIN }} {
resyncperiod 10s
endpoint http://127.0.0.1:8080
pods verified
endpoint_pod_names
upstream /etc/resolv.conf
}
health :18080
log
errors
prometheus :9153
proxy . /etc/resolv.conf
cache 30
reload 10s
}
配置服务启动配置文件
root@ubuntu:~# vim /lib/systemd/system/coredns.service
Description=coredns: The Coredns Server
Documentation=https://coredns.io/
[Service]
ExecStart=/opt/kubernetes/bin/coredns -conf /opt/kubernetes/cfg/Corefile
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
root@ubuntu:~# systemctl start coredns
~~~