通过在集群上运行一个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"