在ACK集群中部署NodeLocal DNSCache可以提升服务发现的稳定性和性能,NodeLocal DNSCache通过在集群节点上作为DaemonSet运行DNS缓存代理来提高集群DNS性能。本文介绍如何安装NodeLocal DNSCache,并在应用中使用NodeLocal DNSCache。
前提条件
- 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
- 使用kubectl命令连接集群。具体操作,请参见通过kubectl工具连接集群。
使用限制
- NodeLocal DNSCache不支持ASK集群、以及托管版、专有版集群中部署的ECI类型的Pod。
- 如果集群网络类型为Terway,请更新Terway至v1.0.10.301及以上版本。如果是基于IPVLAN的Terway多IP模式,需要对Terway进行配置修改。更多信息,请参见修改Terway配置。
- 组件管理中的NodeLocal DNSCache和应用目录中的ack-node-local-dns为同一应用,不需要重复安装。
- NodeLocal DNSCache不提供Hosts、Rewrite等插件能力,仅作为CoreDNS的透明缓存代理。如有需要,可在CoreDNS配置中修改。
- 使用NodeLocal DNSCache前,您需要对CoreDNS配置进行修改,否则可能导致集群外部域名解析异常。具体操作,请参见配置Forward插件与上游VPC DNS服务器的默认协议。
NodeLocal DNSCache简介
- DNSConfig动态注入控制器Deployment,基于Admission Webhook机制拦截Pod创建的请求,自动注入使用DNS缓存的Pod DNSConfig信息。
说明 如果不启用DNSConfig动态注入控制器Deployment,您需要手动注入DNS域名相关配置至Pod配置中。具体操作,请参见在应用中使用NodeLocal DNSCache下的方式二:手动指定DNSConfig。
- DNS缓存DaemonSet可以在每个节点上创建一个虚拟网络接口(默认监听IP 169.254.20.10,如需修改请提交工单咨询),配合Pod的DNSConfig和节点上的网络配置,Pod内产生的DNS请求会被该DaemonSet服务所代理。
注意 DaemonSet服务内同样基于CoreDNS提供服务,但其仅具有代理和缓存的功能,请勿启用额外的插件能力(如Hosts、Rewrite等)。
关于NodeLocal DNSCache的缓存策略,请参见DNS解析及缓存策略说明。

序号 | 描述 |
---|---|
① | 已注入DNS本地缓存的Pod,默认会通过NodeLocal DNSCache监听于节点上的IP(169.254.20.10)解析域名。 |
② | NodeLocal DNSCache本地若无缓存应答解析请求,则会通过kube-dns服务请求CoreDNS进行解析。 |
③ | CoreDNS对于非集群内域名,会通过VPC DNS服务器进行解析。 |
④ | 已注入DNS本地缓存的Pod,当无法连通NodeLocal DNSCache时,会继而直接通过kube-dns服务连接到CoreDNS进行解析,此链路为备用链路。 |
⑤ | 未注入DNS本地缓存的Pod,会通过标准的kube-dns服务链路连接到CoreDNS进行解析。 |
安装NodeLocal DNSCache
您可以通过组件管理或者应用目录页面安装NodeLocal DNSCache,建议您通过组件管理安装NodeLocal DNSCache。
通过组件管理安装NodeLocal DNSCache
- 登录容器服务管理控制台,在左侧导航栏中选择集群。
- 在集群列表页面中,选择目标集群名称或者目标集群右侧操作列下的 。
- 在组件管理页面单击网络页签,找到ACK NodeLocal DNSCache。
- 单击ACK NodeLocal DNSCache的安装,在弹出的对话框中单击确定。
通过应用目录安装NodeLocal DNSCache
在应用中使用NodeLocal DNSCache
- 方式一:借助DNSConfig动态注入控制器在Pod创建时配置DNSConfig自动注入,推荐使用此方式。
- 方式二:创建Pod时手动指定DNSConfig。
- 方式三:修改kubelet参数,并重启节点kubelet。存在业务中断风险,不推荐使用此方式。
node-local-dns-injection=enabled
标签的命名空间中新建Pod的请求,您可以通过以下命令给命名空间打上Label标签。kubectl label namespace default node-local-dns-injection=enabled
- 上述命令仅会开启default命名空间的自动注入,如需对其它命名空间开启自动注入,则需要替换
default
为目标命名空间名称。 - 在命名空间DNSConfig自动注入开启的情况下,如需对部分Pod进行豁免(即不进行注入),可以调整其Pod Template中Labels标签字段,加上
node-local-dns-injection=disabled
标签。 - ECI不支持NodeLocal DNSCache。当Deployment动态弹性扩容至ECI节点时,ECI上Pod会因无法连通NodeLocal DNSCache导致域名解析超时,此时必须对整个Deployment进行注入豁免,可以调整其Pod
Template中的Labels标签字段加上
node-local-dns-injection=disabled
。
dnsConfig:
nameservers:
- 169.254.20.10
- 172.21.0.10
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
dnsPolicy: None
自动注入需满足以下条件。如果自动注入失败,请检查是否满足:
- 新建Pod不位于kube-system和kube-public命名空间。
- 新建Pod所在命名空间的Labels标签包含
node-local-dns-injection=enabled
。 - 新建Pod所在命名空间的Labels不包含ECI Pod相关标签,例如
virtual-node-affinity-injection
、eci
、alibabacloud.com/eci
等。 - 新建Pod没有被打上
eci
、alibabacloud.com/eci
等ECI相关标签,或打上禁用DNS注入node-local-dns-injection=disabled
标签。 - 新建Pod的网络为
hostNetwork
且DNSPolicy为ClusterFirstWithHostNet
,或Pod为非hostNetwork
且DNSPolicy为ClusterFirst
。
方式二:手动指定DNSConfig
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","172.21.0.10"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
- dnsPolicy:必须为
None
。 - nameservers:配置成169.254.20.10和kube-dns的ClusterIP对应的IP地址。
- searches:设置搜索域,保证集群内部域名能够被正常解析。
- ndots:默认为5,可以适当降低ndots以提升解析效率。更多信息,请参见resolv.conf。
方式三:配置kubelet启动参数
systemctl daemon-reload
和systemctl restart kubelet
来生效。--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns ip> --cluster-domain=<search domain>
- cluster-dns:部署Pod时,默认采用的DNS服务器地址,默认只引用了
`kube-dns`
的服务IP,需要增加一个对链路本地地址169.254.20.10的引用。 - cluster-domain:部署Pod时,默认采用的DNS搜索域,保持原有搜索域即可,一般为
`cluster.local`
。
配置应用使用NodeLocal DNSCache示例
通过在default命名空间下部署Deployment类型示例应用,演示如何配置应用使用NodeLocal DNSCache。
升级NodeLocal DNSCache
如果您是在组件管理页面安装NodeLocal DNSCache,您需要在组件管理页面升级NodeLocal DNSCache。如果您是在应用目录页面安装NodeLocal DNSCache,您需要在Helm页面卸载NodeLocal DNSCache,然后再重新安装NodeLocal DNSCache。
通过组件管理页面升级NodeLocal DNSCache
通过应用目录页面升级NodeLocal DNSCache
如果您是通过应用目录页面安装NodeLocal DNSCache,您可以先卸载NodeLocal DNSCache,再重新安装。具体操作,请参见卸载NodeLocal DNSCache和安装NodeLocal DNSCache。
卸载NodeLocal DNSCache
如果您是在组件管理页面安装NodeLocal DNSCache,您需要在组件管理页面卸载NodeLocal DNSCache。如果您是在应用目录页面安装NodeLocal DNSCache,您需要在Helm页面卸载NodeLocal DNSCache。
通过组件管理页面卸载NodeLocal DNSCache
通过应用目录页面卸载NodeLocal DNSCache
- 卸载前检查。
- 卸载NodeLocal DNSCache。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择 。
- 在Helm页面单击ack-node-local-dns-default操作列的删除,在弹出的对话框中选中清除发布记录,然后单击确定。