ACK集群的ACK CoreDNS DNSTAP Analyser组件,可以从CoreDNS和客户端之间,CoreDNS和上游DNS服务器之间的请求和响应过程中,对所有产生的DNS网络报文进行归类和识别。借助此工具,您可以快速定位域名无法解析的原因。
前提条件
背景信息
DNSTAP是一种DNS报文日志格式协议,可以用于诊断DNS服务器上的异常解析问题。更多信息,请参见dnstap。
步骤一:安装ACK CoreDNS DNSTAP Analyser
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在Helm页面,单击创建。参考如下信息完成基本信息配置。 - 参数 - 示例值 - 应用名 - ack-coredns-dnstap-analyser - 命名空间 - kube-system - 来源 - 默认为应用市场 - Chart - 应用场景:选择全部。 
- 支持架构:选择amd64。 
- 搜索框:搜索ack-coredns-dnstap-analyser。 
 - 选中ack-coredns-dnstap-analyser,单击下一步。 
- 在参数配置页面,选择Chart 版本,然后单击确定。 
步骤二:配置CoreDNS的DNSTAP插件
CoreDNS中内置了发送DNSTAP报文的DNSTAP插件,DNSTAP插件收到和发出的DNS报文可以发送至ACK CoreDNS DNSTAP Analyser。使用ACK CoreDNS DNSTAP Analyser诊断CoreDNS域名解析异常前,您需要先配置并启用CoreDNS的DNSTAP插件。插件配置完成后,CoreDNS会将接收和发送到的DNS报文转发至ACK CoreDNS DNSTAP Analyser进行自动化诊断。
- 执行以下命令,获取并记录kube-system命名空间下ACK CoreDNS DNSTAP Analyser服务的ClusterIP地址(例如172.21.0.10)用于配置DNSTAP插件。 - kubectl -n kube-system get svc dnstap-analyser
- 执行以下命令,编辑CoreDNS配置文件。 - kubectl -n kube-system edit cm coredns -o yaml
- 参考以下注释修改CoreDNS的默认配置。 - 修改配置的目的是启用DNSTAP插件,并指向地址至CoreDNS DNSTAP Analyser的ClusterIP地址,从而将DNSTAP插件收到和发出的DNS报文发送至ACK CoreDNS DNSTAP Analyser。 - Corefile: | .:53 { # 省略 ready # 添加以下一行,需将172.21.0.10替换成获取到的CoreDNS DNSTAP Analyser ClusterIP地址。 dnstap tcp://172.21.0.10:6000 full kubernetes cluster.local in-addr.arpa ip6.arpa { # 省略 } # 省略 reload loadbalance }
- 执行以下命令,查看当前CoreDNS的所有容器组。 - kubectl -n kube-system get pod | grep coredns- 预期输出: - coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
- 执行以下命令,持续查看CoreDNS日志。 - kubectl -n kube-system logs -f --tail=500 coredns-7d56l说明- 替换容器组名称coredns-7d56l为上述步骤4中出现的任意一个容器组名称。 - 等待约一分钟,观察日志中出现以下输出,并无其它异常时,表明配置修改成功。 - [INFO] Reloading complete
步骤三:查看ACK CoreDNS DNSTAP Analyser日志
- 执行以下命令,查看ACK CoreDNS DNSTAP Analyser的所有Pod。 - kubectl -n kube-system get pod | grep dnstap-analyser- 预期输出: - dnstap-analyser-bbdf879-g**** 1/1 Running 0 30m
- 执行以下命令,查看ACK CoreDNS DNSTAP Analyser日志。 - kubectl -n kube-system logs -f dnstap-analyser-bbdf879-g****说明- 替换Pod名称dnstap-analyser-bbdf879-gpfkm为上述步骤1中出现的Pod名称。 
步骤四:分析ACK CoreDNS DNSTAP Analyser日志
在ACK CoreDNS DNSTAP Analyser日志中,每一行是一个经过聚合的DNS请求上下文(Session),包含了从客户端、CoreDNS、上游DNS服务器之间的所有请求和响应的报文。DNS请求上下文(Session)包括:
- Status字段:不同的Status代表不同的场景。 - 上下文状态 - 描述 - Succeeded - 完整的域名查询请求,域名的响应是正常的(状态为NXDOMAIN、NOERROR)。 - Failed - 有问题的域名查询请求,域名响应中状态码异常或上游服务器连接超时等情况。 - SampleLoss - CoreDNS或Analyser负载较高,导致DNSTAP报文丢失,出现这类状态时,应调整CoreDNS或Analyser副本数,使单个容器的负载下降,提高诊断可信度。 
- BitMap字段:BitMap的值代表了该请求上下文中截取到的DNSTAP报文的种类,根据截取到的不同种类,得到可能的异常原因。 - 上下文Session BitMap值 - 含义 - 1 - CoreDNS接收到了客户端的查询请求,但未返回结果给客户端。 - 3 - 一次完整的内部域名查询,从客户端发起了请求,CoreDNS本地缓存中或Kubernetes中存在命中该域名的解析结果,将结果返回给了客户端。 - 5 - 无法连接到上游服务器,从客户端发起了请求,CoreDNS将请求转发给上游服务器进行查询,上游服务器未返回结果。 - 15 - 一次完整的外部域名查询,从客户端发起请求,CoreDNS将请求转发给上游服务器进行查询,上游服务器完成查询并返回,CoreDNS又将结果返回给客户端。 
- Messages字段:DNS请求上下文Session中Messages字段记录了DNS请求、响应的原始报文的JSON输出,可以根据dns-parameters-6对报文内容进行问题诊断。 
(可选)步骤五:卸载DNSTAP
定位到原因后,建议您卸载DNSTap以避免不必要的日志开销。卸载流程如下。
- 删除CoreDNS配置文件中包含 - dnstap的一行。- 执行以下命令,编辑CoreDNS配置文件。 - kubectl -n kube-system edit cm coredns -o yaml
- 参考以下注释删除CoreDNS配置文件中包含 - dnstap的一行。- Corefile: | .:53 { # 省略 ready # 删除您此前添加的以下一行 dnstap tcp://10.10.10.10:6000 full kubernetes cluster.local in-addr.arpa ip6.arpa { # 省略 } # 省略 reload loadbalance }
- 执行以下命令,查看当前CoreDNS的所有容器组。 - kubectl -n kube-system get pod | grep coredns- 预期输出: - coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
- 执行以下命令,持续查看CoreDNS日志。 - kubectl -n kube-system logs -f --tail=500 coredns-7d56l说明- 替换容器组名称coredns-7d56l为上述步骤c中出现的任意一个容器组名称。 - 等待约一分钟,观察日志中出现以下输出,并无其它异常时,说明配置修改成功。 - [INFO] Reloading complete
 
- 卸载ACK CoreDNS DNSTAP Analyser组件。 - 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在集群管理页左侧导航栏中,单击。 
- 在Helm页面,单击ack-coredns-dnstap-analyser操作列的删除,根据页面提示完成删除。