全部產品
Search
文件中心

Container Service for Kubernetes:使用DNSTAP Analyser診斷網域名稱解析異常

更新時間:Jun 19, 2024

ACK叢集的ACK CoreDNS DNSTAP Analyser組件,可以從CoreDNS和用戶端之間,CoreDNS和上遊DNS伺服器之間的請求和響應過程中,對所有產生的DNS網路報文進行歸類和識別。藉助此工具,您可以快速定位網域名稱無法解析的原因。

前提條件

背景資訊

DNSTAP是一種DNS報文日誌格式協議,可以用於診斷DNS伺服器上的異常解析問題。更多資訊,請參見dnstap

步驟一:安裝ACK CoreDNS DNSTAP Analyser

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. Helm頁面,單擊建立。參考如下資訊完成基礎資訊配置。

    參數

    樣本值

    應用程式名稱

    ack-coredns-dnstap-analyser

    命名空間

    kube-system

    來源

    預設為應用市場

    Chart

    • 應用情境:選擇全部

    • 支援架構:選擇amd64

    • 搜尋方塊:搜尋ack-coredns-dnstap-analyser

    選中ack-coredns-dnstap-analyser,單擊下一步

  4. 參數配置頁面,選擇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進行自動化診斷。

  1. 執行以下命令,擷取並記錄kube-system命名空間下ACK CoreDNS DNSTAP Analyser服務的ClusterIP地址(例如172.21.0.10)用於配置DNSTAP外掛程式。

    kubectl -n kube-system get svc dnstap-analyser
  2. 執行以下命令,編輯CoreDNS設定檔。

    kubectl -n kube-system edit cm coredns -o yaml
  3. 參考以下注釋修改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
            }
  4. 執行以下命令,查看當前CoreDNS的所有容器組。

    kubectl -n kube-system get pod | grep coredns

    預期輸出:

    coredns-7d56l         1/1     Running   0          30m
    coredns-s7m2t         1/1     Running   0          30m
  5. 執行以下命令,持續查看CoreDNS日誌。

    kubectl -n kube-system logs -f --tail=500 coredns-7d56l
    說明

    替換容器組名稱coredns-7d56l為上述步驟4中出現的任意一個容器組名稱。

    等待約一分鐘,觀察日誌中出現以下輸出,並無其它異常時,表明配置修改成功。

    [INFO] Reloading complete

步驟三:查看ACK CoreDNS DNSTAP Analyser日誌

  1. 執行以下命令,查看ACK CoreDNS DNSTAP Analyser的所有Pod。

    kubectl -n kube-system get pod | grep dnstap-analyser

    預期輸出:

    dnstap-analyser-bbdf879-g****         1/1     Running   0          30m
  2. 執行以下命令,查看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以避免不必要的日誌開銷。卸載流程如下。

  1. 刪除CoreDNS設定檔中包含dnstap的一行。

    1. 執行以下命令,編輯CoreDNS設定檔。

      kubectl -n kube-system edit cm coredns -o yaml
    2. 參考以下注釋刪除CoreDNS設定檔中包含dnstap的一行。

      Corefile: |
              .:53 {
                  # 省略
                  ready
      
                  # 刪除您此前添加的以下一行
                  dnstap tcp://10.10.10.10:6000 full
      
                  kubernetes cluster.local in-addr.arpa ip6.arpa {
                  # 省略
                  }
                  # 省略
                  reload
                  loadbalance
              }
    3. 執行以下命令,查看當前CoreDNS的所有容器組。

      kubectl -n kube-system get pod | grep coredns

      預期輸出:

      coredns-7d56l         1/1     Running   0          30m
      coredns-s7m2t         1/1     Running   0          30m
    4. 執行以下命令,持續查看CoreDNS日誌。

      kubectl -n kube-system logs -f --tail=500 coredns-7d56l
      說明

      替換容器組名稱coredns-7d56l為上述步驟c中出現的任意一個容器組名稱。

      等待約一分鐘,觀察日誌中出現以下輸出,並無其它異常時,說明配置修改成功。

      [INFO] Reloading complete
  2. 卸載ACK CoreDNS DNSTAP Analyser組件。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

    3. 在叢集管理頁左側導覽列中,單擊應用 > Helm

    4. Helm頁面,單擊ack-coredns-dnstap-analyser操作列的刪除,根據頁面提示完成刪除。