全部產品
Search
文件中心

Container Service for Kubernetes:分析和監控CoreDNS日誌

更新時間:Jun 19, 2024

阿里雲Container ServiceACK部署了CoreDNS作為叢集內的DNS伺服器,您可以通過查看CoreDNS日誌來分析CoreDNS解析慢、訪問高危請求網域名稱等問題。本文介紹如何開啟CoreDNS日誌分析與監控能力。

前提條件

  • 已安裝日誌組件logtail-ds。

    在建立叢集時,ACK預設選中日誌組件logtail-ds。如果您未安裝日誌組件logtail-ds,關於如何手動安裝的操作,請參見通過Log Service採集Kubernetes容器日誌

  • 確保日誌應用alibaba-log-controller版本不低於0.2.0.0-76648ee-aliyun。logcontroller

    如果alibaba-log-controller版本低,可直接升級logtail-ds組件。關於如何升級組件,請參見管理組件

步驟一:開啟CoreDNS日誌外掛程式

注意事項

  • 開啟前,請確保CoreDNS組件為最新版本。升級具體操作,請參見管理組件

  • 全新部署的CoreDNS預設開啟log外掛程式,如已開啟請忽略本步驟。

操作步驟

說明

開啟CoreDNS日誌會消耗額外的CPU(約10%,與實際請求有關)及網路流量。如果當前已經部署的CoreDNS副本CPU使用量較高,您可以對CoreDNS進行擴容。關於如何擴容CoreDNS副本數,請參見手動伸縮容器組

在命名空間kube-system下,ACK叢集有一個coredns配置項。您可以通過在coredns配置項中的Corefile欄位中加上log外掛程式,開啟CoreDNS網域名稱解析的日誌。關於如何修改配置項的具體步驟,請參見修改配置項

預設日誌格式的coredns的配置如下。

Corefile: |
    .:53 {
        errors
        log # 此處添加Log外掛程式。
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
    # 如果有其它的域,且該域容器需要被採集日誌,也需要增加Log外掛程式,格式一致。
    demo.com:53 {
        ... 
        log # 此處添加Log外掛程式。
    }

步驟二:開啟CoreDNSLog Service

方式一:通過ACK控制台開啟

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 日誌中心

  3. 日誌中心頁面,單擊網路組件日誌頁簽,然後單擊開始安裝

    控制台會自動安裝相關組件,開啟CoreDNSLog Service。

方式二:通過命令列開啟

日誌採集配置針對ACK進行了自訂資源CRD擴充,您可以直接部署AliyunLogConfig的CRD配置,Log Controller會自動建立Log Service相關採集配置和報表資源。關於如何建立自訂資源AliyunLogConfig的具體步驟,請參見管理自訂資源

    重要

    下述配置只針對預設CoreDNS中的日誌格式生效。如果您自訂了CoreDNS的日誌格式,請修改上述CRD配置中的RegexRegex部分。

    關於自訂CoreDNS的日誌格式的更多資訊,請參見log

    關於更詳細的日誌採集流程及採集配置,請參見通過DaemonSet-CRD方式採集容器日誌

  1. 建立YAML檔案k8s-coredns-log.yaml,YAML檔案完整範例如下。

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      #     Your config name, must be unique in you k8s cluster.
      name: k8s-coredns-log
      namespace: kube-system
    spec:
      # logstore name to upload log
      logstore: coredns-log
      # logtail config detail
      productCode: k8s-coredns
      logtailConfig:
        inputType: plugin
        # logtail config name, should be same with [metadata.name]
        configName: k8s-coredns-log
        inputDetail:
          plugin:
            inputs:
            - type: service_docker_stdout
              detail:
                IncludeLabel:
                  io.kubernetes.container.name: coredns
                Stderr: true
                Stdout: true
            processors:
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - level
                - remote
                - port
                - id
                - type
                - class
                - name
                - proto
                - size
                - do
                - bufsize
                - rcode
                - rflags
                - rsize
                - duration
                NoKeyError: true
                NoMatchError: false
                FullMatch: false
                Regex: \[([^]]+)]\s([^:]+):(\S+)\s+-\s+(\S+)\s+"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+([^"]+)"\s+(\S+)\s+(\S+)\s+(\S+)\s+([\d\.]+).*
                SourceKey: content
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - error
                - rcode
                - name
                - type
                - errorMsg
                NoKeyError: false
                NoMatchError: false
                FullMatch: false
                Regex: \[ERROR]\s+(plugin/errors):\s+(\S)+\s+(\S+)\s+([^:]*):\s+(.*)
                SourceKey: content
  2. 執行以下命令,開啟CoreDNSLog Service。

    kubectl apply -f k8s-coredns-log.yaml

關於如何配置儲存、網路、Auto Scaling等資源的AliyunLogConfig的CRD,請參見步驟一:建立系統外掛程式的日誌設定檔

步驟三:查詢和分析日誌(日誌庫)

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 日誌中心

  3. 日誌中心頁面,單擊網路組件日誌頁簽,然後在CoreDNS頁簽下單擊日誌庫,即可查詢和分析DNS日誌。

  4. 在輸入框中輸入查詢和分析語句,然後單擊1周(相對),設定查詢的時間範圍。

  5. 單擊查詢/分析,查看查詢分析結果。

    Log Service為您提供日誌分布長條圖、原始日誌和統計圖表形式的展示查詢分析結果。關於查詢和分析日誌的詳細資料,請參見查詢和分析日誌

    • 日誌長條圖

      日誌分布長條圖主要展示查詢到的日誌在時間上的分布。

      image..png

    • 原始日誌

      原始日誌頁簽中展示當前查詢結果,您可單擊表格原始查看日誌,通過分析日誌來確認當前網域名稱解析是否存在異常。請重點關注返回碼RCODE的值,關於ROCDE的釋義,請參見 DNS解析異常問題排查

      image..png

      各個欄位含義如下所示。

      欄位

      含義

      樣本值

      {level}

      記錄層級

      INFO

      {remote}

      用戶端IP地址

      172.16.0.10

      {port}

      用戶端連接埠

      58008

      {id}

      查詢ID

      34518

      {type}

      請求類型

      A

      {class}

      請求類別

      IN

      {name}

      請求網域名稱的名稱

      kube-dns.kube-system.svc.cluster.local.

      {proto}

      使用的協議

      tcp

      {size}

      請求大小(位元組)

      56

      {do}

      查詢中是否設定了EDNS0 DO(DNSSEC OK)位

      false

      {bufsize}

      在查詢中定義的EDNS0緩衝區大小(位元組)

      65535

      {rcode}

      響應代碼

      NOERROR

      {rflags}

      響應標誌位,設定的每個標誌位都會顯示

      qr,aa,rd

      {rsize}

      未壓縮的響應大小(位元組)

      110

      {duration}

      回應時間(秒)

      0.00011

    • 統計圖表

      執行查詢分析語句後,您可以在統計圖表頁簽中查看可視化的查詢分析結果。

    • 日誌聚類

      日誌聚類頁簽中,單擊開啟日誌聚類,可實現在採集日誌時將相似性高的日誌彙總。更多資訊,請參見日誌聚類

步驟四:查看CoreDNS日誌採集(儀錶盤)

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 日誌中心

  3. 日誌中心頁面,單擊網路組件日誌頁簽,然後在CoreDNS頁簽下單擊儀錶盤,即可查看Kubernetes CoreDNS日誌分析

    Kubernetes CoreDNS日誌分析頁面,您可以查看CoreDNS請求數、請求成功率和請求延遲等彙總資訊,同時提供了各類Top網域名稱請求列表、錯誤網域名稱列表、慢解析網域名稱列表和高危請求網域名稱訪問分析。

步驟五:建立CoreDNS日誌警示

Kubernetes CoreDNS日誌分析儀錶盤頁面中,您可以根據儀錶盤中單個圖表進行警示設定。此操作僅支援在Log Service控制台上進行操作。

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

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

  3. 叢集資訊頁面,單擊叢集資源頁簽,然後單擊Log ServiceProject右側的連結跳轉至Log Service控制台。

  4. 在日誌庫頁面左側導覽列,單擊儀錶盤儀錶盤表徵圖,然後單擊在儀錶盤列表中找到並單擊Kubernetes CoreDNS日誌分析

  5. Kubernetes CoreDNS日誌分析頁面的靶心圖表表卡片右上方,選擇more > 另存新檔警示

    關於警示配置的參數設定,請參見建立日誌警示監控規則alert

    建立完成警示規則後,您可以查看、修改警示規則,關閉警示規則等。更多資訊,請參見管理警示監控規則

相關操作

關閉日誌採集

如果您不再需要CoreDNS日誌採集,執行以下命令,可以通過卸載日誌採集自訂資源的方式停止採集。

kubectl -n kube-system delete AliyunLogConfig k8s-coredns-log

刪除成功後,CoreDNS輸出的日誌將不再上報到Log ServiceSLS中。