全部產品
Search
文件中心

:Nginx Ingress訪問日誌分析與監控

更新時間:Feb 28, 2024

阿里雲Ingress組件除了提供外部可訪問的URL、負載平衡、SSL、基於名稱的虛擬機器主機外,還支援將所有您的HTTP請求日誌記錄到標準輸出中。您可以在建立叢集時啟用Log Service,在阿里雲Log ServiceSLS查看Nginx Ingress的訪問日誌分析報表和監控Nginx Ingress即時狀態。本文介紹Nginx Ingress訪問日誌的部署及查看。

索引

前提條件

  1. 安裝日誌組件。

    叢集建立時,預設會安裝日誌組件,如未安裝,請參見通過Log Service採集Kubernetes容器日誌進行手動安裝。

  2. 升級Log Controller。

    通過執行kubectl edit deployment alibaba-log-controller -n kube-system命令修改鏡像版本進行升級。

開啟Nginx Ingress日誌採集配置

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

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

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

  3. 組件管理頁面,單擊網路頁簽,找到Nginx Ingress Controller組件,然後在組件所在卡片的右下角單擊image.png,選擇開啟日誌,最後根據頁面提示完成日誌開啟。

方式二:通過命令列開啟

日誌採集配置針對ACK進行了CRD擴充,您可以直接部署AliyunLogConfig的CRD配置,Log Controller會自動建立Log Service相關採集配置和報表資源。

重要

部署AliyunLogConfig的CRD時需要注意以下事項:

  • 對於已經正在啟動並執行nginx-ingress-controller, 建立AliyunLogConfig之後,需要重建nginx-ingress-controller Pod,使其採集日誌生效。

  • 請確保日誌組件alibaba-log-controller版本不低於0.2.0.0-76648ee-aliyun。更新版本後,若已經應用了該CRD配置,請刪除該配置並重新應用。

  • 部署AliyunLogConfig的CRD只針對ACK預設Ingress Controller中的日誌格式生效。若您修改過Ingress Controller的訪問日誌格式,請修改CRD配置中的Regex提取processor_regex部分。具體操作,請參見通過DaemonSet-CRD方式採集容器日誌

  • IncludeLabel為Docker inspect中的Label資訊。

  • Kubernetes中的命名空間和容器名會映射到Docker的Label中,分別為io.kubernetes.pod.namespaceio.kubernetes.container.name。例如,您建立的Pod所屬命名空間為backend-prod,容器名為worker-server。

    • 如果配置Label白名單為io.kubernetes.pod.namespace : backend-prod,則收集對應Pod中所有容器的日誌。

    • 如果配置Label白名單為io.kubernetes.container.name : worker-server,則收集對應容器的日誌。

  • Kubernetes不建議使用除io.kubernetes.pod.namespaceio.kubernetes.container.name之外的其他Label。其他情況請使用IncludeEnv或ExcludeEnv,具體操作,請參見通過DaemonSet-控制台方式採集容器標準輸出

如果不需要Ingress日誌採集,刪除AliyunLogConfig配置即可。

  1. 建立設定檔k8s-nginx-ingress.yaml,YAML檔案完整範例如下。

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 配置名稱,不能夠重名。
      name: k8s-nginx-ingress
      # 命名空間,放置於ingress controller所在命名空間,請按需修改。
      namespace: kube-system
    spec:
      # logstore名稱。
      logstore: nginx-ingress
      # 產品Code,請勿更改。
      productCode: k8s-nginx-ingress
      # 詳細配置。
      logtailConfig:
        inputType: plugin
        # logtail配置名稱,需要和metadata.name保持一致。
        configName: k8s-nginx-ingress
        inputDetail:
          plugin:
            inputs:
              - type: service_docker_stdout
                detail:
                  IncludeLabel: # docker容器中的標籤資訊。
                    # 容器名稱為nginx-ingress-controller。
                    # 如果配置多個ingress controller請注意預防日誌重複採集,詳細請閱讀注意事項中IncludeLabel釋義。
                    io.kubernetes.container.name: nginx-ingress-controller
                  Stderr: true
                  Stdout: true
            processors:
              - type: processor_regex # 使用Regex提取欄位。
                detail:
                  KeepSource: false
                  Keys: # 提取出的欄位名稱,按照順序排列。
                    - client_ip
                    - x_forward_for
                    - remote_user
                    - time
                    - method
                    - url
                    - version
                    - status
                    - body_bytes_sent
                    - http_referer
                    - http_user_agent
                    - request_length
                    - request_time
                    - proxy_upstream_name
                    - upstream_addr
                    - upstream_response_length
                    - upstream_response_time
                    - upstream_status
                    - req_id
                    - host
                    - proxy_alternative_upstream_name
                  NoKeyError: true
                  NoMatchError: true
                  # 提取欄位使用的Regex。符合該格式的日誌,會將每個擷取的群組中內容映射到對應的欄位上。
                  Regex: ^(\S+)\s-\s\[([^]]+)]\s-\s(\S+)\s\[(\S+)\s\S+\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\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+)\s*(\S*)\s*\[*([^]]*)\]*.*
                  SourceKey: content
  2. 執行以下命令,部署AliyunLogConfig的CRD配置。

    kubectl apply -f k8s-nginx-ingress.yaml

查看Nginx Ingress日誌與報表

  1. 登入Log Service控制台

  2. 在Project列表地區,選擇建立叢集時設定的日誌Project,單擊名稱進入日誌Project頁面(預設建立的project名稱為k8s-log-{cluster-id})。

  3. 在左側導覽列單擊Nginx Ingress.png儀錶盤表徵圖,然後在儀錶盤列表中選擇儀錶盤名稱,查看對應的分析報表。

Ingress概覽

Ingress概覽報表主要展示當前Nginx Ingress的整體狀態,主要包括以下幾類資訊:

  • 整體架構狀態(1天),包括PV、UV、流量、響應延遲、移動端佔比和錯誤比例等。

  • 網站即時狀態(1分鐘),包括訪問PV、訪問UV、訪問成功率、平均延遲、P95延遲和P99延遲等。

  • 使用者請求類資訊(1天),包括1天訪問PV對比、7天訪問PV對比、地區分布、TOP訪問省份、TOP訪問城市、移動端佔比和Android/iOS佔比等。

  • TOP URL統計(1小時),包括訪問TOP10、延遲TOP10、5XX錯誤TOP10和404錯誤TOP10。

Ingress訪問中心

Ingress訪問中心主要側重於用於訪問請求相關的統計資訊,一般用於營運分析,包括今日UV、今日PV、UV分布、PV分布、TOP訪問省份、TOP訪問城市、TOP訪問瀏覽器、TOP訪問IP、移動端佔比和Android/iOS佔比等。

ingress訪問中心

Ingress監控中心

Ingress監控中心主要側重於網站即時監控資料,一般用於完整即時監控與警示,包括請求成功率、錯誤比例、5XX比例、請求未轉寄比例、平均延遲、P95延遲、P99延遲、P999延遲、狀態代碼分布、Ingress壓力分布、Service訪問TOP10、Service錯誤TOP10、Service延遲TOP10和Service流量TOP10等。

Ingress監控中心

Ingress藍綠髮布監控中心

Ingress藍綠髮布監控中心主要用於版本發布時的即時監控與對比(版本前後對比以及藍綠版本當前對比),以便您在服務發布時快速檢測異常並進行復原。在該報表中您需要選擇進行對比的藍綠版本(ServiceAServiceB),報表將根據您的選擇動態顯示藍綠版本相關指標,包括PV、5XX比例、成功率、平均延遲、P95延遲、P99延遲、P999延遲和流量等。

Ingress藍綠髮布監控中心

Ingress異常檢測中心

Ingress異常檢測中心基於Log Service提供的機器學習演算法,通過多種時序分析演算法從Nginx Ingress的指標中自動檢測異常點,提高問題發現的效率。

Ingress異常檢測中心

配置警示

Log Service除提供互動式分析、可視化報表之外,您可直接基於上述報錶快速配置警示,警示支援通知DingTalkWebHook、簡訊、郵件和自訂WebHook等。

警示詳細配置方法請參見設定警示

下述樣本為Nginx Ingress配置5XX比例的警示,警示每5分鐘執行一次,當5XX比例超過1%時觸發。

  1. 進入Ingress監控中心報表,滑鼠滑動到圖表5XX比例右上方的提示表徵圖,在彈出的提示框中單擊另存新檔警示(舊版)

    配置警示

  2. 建立警示面板中,填入警示名稱關聯圖表頻率觸發條件,查詢語句中的total為5XX的百分比,因此觸發條件輸入total > 1

  3. 在下一步的通知中,根據您的需求選擇對應的通知方式,並填入對應參數,然後單擊提交,即可完成警示建立。

訂閱定時報告

Log Service除支援通過警示方式通知外,還支援報告訂閱功能,您可使用該功能將報表定期渲染成圖片並通過郵件、DingTalk群等方式發送。

訂閱功能詳細使用方法請參見訂閱儀錶盤

下述樣本為Ingress概覽配置訂閱功能,每天上午10點將報表發送到指定DingTalk群。

  1. 進入Ingress概覽V1.2報表,選擇報表右上方的訂閱 > 建立

  2. 建立訂閱面板中,頻率選擇每天10:00,關閉添加浮水印選項,單擊下一步

  3. 通知類型中選擇WebHookDingTalk機器人,填入DingTalk機器人的WebHook地址,然後單擊提交,即可完成訂閱。

相關文檔

如果您需要對日誌採集進行過濾,請參見過濾日誌