ACK叢集的ACK CoreDNS DNSTAP Analyser組件,可以從CoreDNS和用戶端之間,CoreDNS和上遊DNS伺服器之間的請求和響應過程中,對所有產生的DNS網路報文進行歸類和識別。藉助此工具,您可以快速定位網域名稱無法解析的原因。
前提條件
背景資訊
DNSTAP是一種DNS報文日誌格式協議,可以被用於診斷DNS伺服器上異常解析問題。更多資訊,請參見dnstap。
步驟一:安裝ACK CoreDNS DNSTAP Analyser
在控制台左側導覽列,選擇 。
在應用目錄頁簽搜尋ack-coredns-dnstap-analyser,找到並單擊ack-coredns-dnstap-analyser。
在ack-coredns-dnstap-analyser頁面,單擊一鍵部署。
在建立面板中選擇目的地組群和命名空間,然後單擊下一步。在參數配置頁簽中根據需求設定參數,然後單擊確定。
步驟二:配置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組件。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在叢集管理頁左側導覽列中,單擊
。在Helm頁面,單擊ack-coredns-dnstap-analyser操作列的刪除,根據頁面提示完成刪除。