通過在叢集上運作一個dnsCache daemonset來提高clusterDNS性能和可靠性。在ACK叢集上的一些測試表明:相比于純coredns方案,nodelocaldns + coredns方案能夠大幅降低DNS查詢timeout的頻次,提升服務穩定性。
本文将介紹如何在ACK叢集上部署node local dns。
部署nodelocaldns
nodelocaldns通過添加iptables規則能夠接收節點上所有發往
169.254.20.10
的dns查詢請求,把針對叢集内部域名查詢請求路由到coredns;把叢集外部域名請求直接通過host網絡發往叢集外部dns伺服器。
# 下載下傳部署腳本
$ curl https://node-local-dns.oss-cn-hangzhou.aliyuncs.com/install-nodelocaldns.sh
# 部署。確定kubectl能夠連接配接叢集
$ bash install-nodelocaldns.sh
DNS優化方案的具體實施仍在探索中,該腳本部署不對叢集現有業務有任何影響,需要使用node local dns的業務容器也需要定制其dnsConfig。
定制業務容器dnsConfig
為了使業務容器能夠使用nodelocaldns,需要将nameserver配置為
169.254.20.10
,而不是ClusterDNS。定制dnsConfig有以下幾點需要注意到:
- dnsPolicy: None。不使用ClusterDNS。
- 配置searches,保證叢集内部域名能夠被正常解析。
- 适當降低ndots值 。目前ACK叢集ndots值預設為5,降低ndots值有利于加速叢集外部域名通路。如果業務容器沒有使用帶多個dots的叢集内部域名,建議将值設為2。
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.20.10"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"