## 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
~~~