使用DNSTAP Analyser診斷域名解析異常
ACK集群的ACK CoreDNS DNSTAP Analyser組件,可以從CoreDNS和客戶端之間,CoreDNS和上游DNS服務(wù)器之間的請求和響應(yīng)過程中,對所有產(chǎn)生的DNS網(wǎng)絡(luò)報文進(jìn)行歸類和識別。借助此工具,您可以快速定位域名無法解析的原因。
前提條件
背景信息
DNSTAP是一種DNS報文日志格式協(xié)議,可以被用于診斷DNS服務(wù)器上異常解析問題。更多信息,請參見dnstap。
步驟一:安裝ACK CoreDNS DNSTAP Analyser
在控制臺左側(cè)導(dǎo)航欄,選擇 。
在應(yīng)用目錄頁簽搜索ack-coredns-dnstap-analyser,找到并單擊ack-coredns-dnstap-analyser。
在ack-coredns-dnstap-analyser頁面,單擊一鍵部署。
在創(chuàng)建面板中選擇目標(biāo)集群和命名空間,然后單擊下一步。在參數(shù)配置頁簽中根據(jù)需求設(shè)置參數(shù),然后單擊確定。
步驟二:配置CoreDNS的DNSTAP插件
CoreDNS中內(nèi)置了發(fā)送DNSTAP報文的DNSTAP插件,DNSTAP插件收到和發(fā)出的DNS報文可以發(fā)送至ACK CoreDNS DNSTAP Analyser。使用ACK CoreDNS DNSTAP Analyser診斷CoreDNS域名解析異常前,您需要先配置并啟用CoreDNS的DNSTAP插件。插件配置完成后,CoreDNS會將接收和發(fā)送到的DNS報文轉(zhuǎn)發(fā)至ACK CoreDNS DNSTAP Analyser進(jìn)行自動化診斷。
執(zhí)行以下命令,獲取并記錄kube-system命名空間下ACK CoreDNS DNSTAP Analyser服務(wù)的ClusterIP地址(例如172.21.0.10)用于配置DNSTAP插件。
kubectl -n kube-system get svc dnstap-analyser
執(zhí)行以下命令,編輯CoreDNS配置文件。
kubectl -n kube-system edit cm coredns -o yaml
參考以下注釋修改CoreDNS的默認(rèn)配置。
修改配置的目的是啟用DNSTAP插件,并指向地址至CoreDNS DNSTAP Analyser的ClusterIP地址,從而將DNSTAP插件收到和發(fā)出的DNS報文發(fā)送至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 }
執(zhí)行以下命令,查看當(dāng)前CoreDNS的所有容器組。
kubectl -n kube-system get pod | grep coredns
預(yù)期輸出:
coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
執(zhí)行以下命令,持續(xù)查看CoreDNS日志。
kubectl -n kube-system logs -f --tail=500 coredns-7d56l
說明替換容器組名稱coredns-7d56l為上述步驟4中出現(xiàn)的任意一個容器組名稱。
等待約一分鐘,觀察日志中出現(xiàn)以下輸出,并無其它異常時,表明配置修改成功。
[INFO] Reloading complete
步驟三:查看ACK CoreDNS DNSTAP Analyser日志
執(zhí)行以下命令,查看ACK CoreDNS DNSTAP Analyser的所有Pod。
kubectl -n kube-system get pod | grep dnstap-analyser
預(yù)期輸出:
dnstap-analyser-bbdf879-g**** 1/1 Running 0 30m
執(zhí)行以下命令,查看ACK CoreDNS DNSTAP Analyser日志。
kubectl -n kube-system logs -f dnstap-analyser-bbdf879-g****
說明替換Pod名稱dnstap-analyser-bbdf879-gpfkm為上述步驟1中出現(xiàn)的Pod名稱。
步驟四:分析ACK CoreDNS DNSTAP Analyser日志
在ACK CoreDNS DNSTAP Analyser日志中,每一行是一個經(jīng)過聚合的DNS請求上下文(Session),包含了從客戶端、CoreDNS、上游DNS服務(wù)器之間的所有請求和響應(yīng)的報文。DNS請求上下文(Session)包括:
Status字段:不同的Status代表不同的場景。
上下文狀態(tài)
描述
Succeeded
完整的域名查詢請求,域名的響應(yīng)是正常的(狀態(tài)為NXDOMAIN、NOERROR)。
Failed
有問題的域名查詢請求,域名響應(yīng)中狀態(tài)碼異常或上游服務(wù)器連接超時等情況。
SampleLoss
CoreDNS或Analyser負(fù)載較高,導(dǎo)致DNSTAP報文丟失,出現(xiàn)這類狀態(tài)時,應(yīng)調(diào)整CoreDNS或Analyser副本數(shù),使單個容器的負(fù)載下降,提高診斷可信度。
BitMap字段:BitMap的值代表了該請求上下文中截取到的DNSTAP報文的種類,根據(jù)截取到的不同種類,得到可能的異常原因。
上下文Session BitMap值
含義
1
CoreDNS接收到了客戶端的查詢請求,但未返回結(jié)果給客戶端。
3
一次完整的內(nèi)部域名查詢,從客戶端發(fā)起了請求,CoreDNS本地緩存中或Kubernetes中存在命中該域名的解析結(jié)果,將結(jié)果返回給了客戶端。
5
無法連接到上游服務(wù)器,從客戶端發(fā)起了請求,CoreDNS將請求轉(zhuǎn)發(fā)給上游服務(wù)器進(jìn)行查詢,上游服務(wù)器未返回結(jié)果。
15
一次完整的外部域名查詢,從客戶端發(fā)起請求,CoreDNS將請求轉(zhuǎn)發(fā)給上游服務(wù)器進(jìn)行查詢,上游服務(wù)器完成查詢并返回,CoreDNS又將結(jié)果返回給客戶端。
Messages字段:DNS請求上下文Session中Messages字段記錄了DNS請求、響應(yīng)的原始報文的JSON輸出,可以根據(jù)dns-parameters-6對報文內(nèi)容進(jìn)行問題診斷。
(可選)步驟五:卸載DNSTAP
定位到原因后,建議您卸載DNSTap以避免不必要的日志開銷。卸載流程如下。
刪除CoreDNS配置文件中包含
dnstap
的一行。執(zhí)行以下命令,編輯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 }
執(zhí)行以下命令,查看當(dāng)前CoreDNS的所有容器組。
kubectl -n kube-system get pod | grep coredns
預(yù)期輸出:
coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
執(zhí)行以下命令,持續(xù)查看CoreDNS日志。
kubectl -n kube-system logs -f --tail=500 coredns-7d56l
說明替換容器組名稱coredns-7d56l為上述步驟c中出現(xiàn)的任意一個容器組名稱。
等待約一分鐘,觀察日志中出現(xiàn)以下輸出,并無其它異常時,說明配置修改成功。
[INFO] Reloading complete
卸載ACK CoreDNS DNSTAP Analyser組件。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在集群管理頁左側(cè)導(dǎo)航欄中,單擊
。在Helm頁面,單擊ack-coredns-dnstap-analyser操作列的刪除,根據(jù)頁面提示完成刪除。