天天看點

采集 Kubernetes 容器日志最佳實踐

作者:觀測雲

前言

名額、日志、鍊路是可觀測的三大支柱,日志主要用于記錄代碼執行的痕迹,友善定位和排查問題。目前主流的應用都是以容器的方式運作在 Kubernetes 叢集,由于容器的動态性,容器可能會頻繁地建立和銷毀。日志的采集和持久化變得尤為重要,以確定在容器生命周期結束後,仍然能夠通路到運作時的資訊。以下内容介紹如何利用觀測雲采集 Kubernetes 容器日志,并對采集的日志進行解析、查詢、可視化分析和備份的整個流程。

接入方案

部署 DataKit 采集器

采集 Kubernetes 容器日志需要先部署 DataKit。

登入觀測雲控制台,點選「內建」 -「DataKit」 - 「Kubernetes」,下載下傳 datakit.yaml ,拷貝第 3 步中的 token 。

采集 Kubernetes 容器日志最佳實踐

編輯 datakit.yaml ,把 token 粘貼到 ENV_DATAWAY 環境變量值中“token=”後面,設定環境變量 ENV_CLUSTER_NAME_K8S 的值并增加環境變量 ENV_NAMESPACE,這兩個環境變量的值一般和叢集名稱對應,一個工作空間叢集名稱要唯一。

- name: ENV_NAMESPACE
          value: k8s-prod
           
采集 Kubernetes 容器日志最佳實踐

把 datakit.yaml 上傳到可以連接配接到 Kubernetes 叢集的主機上,執行如下指令。

kubectl apply -f datakit.yaml
kubectl get pod -n datakit
           

當看到狀态是 “Running”後表示部署 DataKit 成功。

采集 Kubernetes 容器日志最佳實踐

控制台日志采集

DataKit 預設采集了所有容器輸出到控制台的日志(stdout/stderr),這些日志的特點是通過 kubectl logs 可以檢視到。登入觀測雲控制台,點選「日志」 -「檢視器」 ,可以看到已經采集到的日志,其中資料源預設展示的是容器的名稱,接下來的采集中,會使用自定義資料來源。

采集 Kubernetes 容器日志最佳實踐

DataKit 也提供了自監控功能,實時檢視采集情況。DataKit 預設部署在 datakit namespace 下面,執行 kubectl exec 指令進入 DataKit 容器。

kubectl exec -it datakit-6rjjp -n datakit bash
           

再執行 datakit monitor,右下方的 logging/ 開頭的行即是采集容器日志的實時監控資料。

采集 Kubernetes 容器日志最佳實踐

預設的采集方式不是太靈活,這裡推薦一種最佳的采集方式,把預設采集所有輸出到控制台的日志關掉,通過染色的方式,在需要采集日志的 Deployment 部署檔案中增加 annotation 方式指定是否需要采集、更改資料源名稱以及為日志打 tags。

在 datakit.yaml 中增加下面的環境變量,即不采集任何控制台日志。

- name: ENV_INPUT_CONTAINER_CONTAINER_EXCLUDE_LOG
          value: image:*
           
采集 Kubernetes 容器日志最佳實踐

然後在應用的 Deployment yaml 檔案中添加 annotation。

annotations:
        datakit/logs: |
          [
            {
             "disable" : false,
             "source": "log_stdout_demo",
             "tags": {
               "region": "hangzhou"
               }
            }
          ]
           
采集 Kubernetes 容器日志最佳實踐

字段說明:

  • disable 是否禁用該容器的日志采集,預設是 false。
  • source 日志來源,非必填項。
  • tags key/value 鍵值對,添加額外的 tags,非必填項。

登入觀測雲控制台,點選「日志」 -「檢視器」 ,可以看到已經采集到的日志。

采集 Kubernetes 容器日志最佳實踐

容器内日志檔案采集

對于容器内日志檔案的采集,也是通過添加 annotations 的方式來實作采集的。

annotations:
        datakit/logs: |
          [
            {
             "disable": false,
             "type": "file",
             "path":"/data/app/logs/log.log",
             "source": "log_file_demo",
             "tags": {
               "region": "beijing"
               }
            }
          ]
           
采集 Kubernetes 容器日志最佳實踐

字段說明:

  • disable 是否禁用該容器的日志采集,預設是 false。
  • type 預設為空是采集 stdout/stderr,采集檔案必須寫 file。
  • path 配置檔案路徑。如果是采集容器内檔案,必須填寫 volume 的 path,注意不是容器内的檔案路徑,是容器外能通路到的路徑。
  • source 日志來源,非必填項。
  • tags key/value 鍵值對,添加額外的 tags,非必填項。

注意:需要把日志路徑目錄挂載到 emptyDir,這裡挂的是 /data/app/logs。

volumeMounts:
        - mountPath: /data/app/logs
          name: varlog
      ......
      volumes:
      - name: varlog
        emptyDir: {}         
           

日志路徑支援 glob 規則 進行批量指定,比如日志檔案是 /tmp/opt/**/*.log ,挂載的目錄必須高于通配的目錄,比如挂載 /tmp 或 /tmp/opt。

登入觀測雲控制台,點選「日志」 -「檢視器」 ,可以看到已經采集到的日志,當然也可以使用自定義的 tags 進行檢索。

采集 Kubernetes 容器日志最佳實踐

日志解析

為了通過日志中特定内容進行快捷篩選、關聯分析,就需要使用 Pipeline 對日志進行結構化處理,比如提取trace_id、日志狀态等。

下面是一條業務日志和對應的 Pipeline。

2024-04-11 11:10:17.921 [http-nio-9201-exec-9] INFO  c.r.s.c.SysRoleController - [list,48] - ry-system-dd 2350624413051873476 1032190468283316 - 查詢角色清單開始
           
grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] - %{DATA:service} %{DATA:trace_id} %{DATA:span_id} - %{GREEDYDATA:msg}")
default_time(time, "Asia/Shanghai")
           
采集 Kubernetes 容器日志最佳實踐
采集 Kubernetes 容器日志最佳實踐

成功解析出 trace_id、span_id、service 等标簽,友善後續的快捷篩選、關聯分析。

日志查詢

觀測雲支援通過多種操作對日志資料進行查詢和分析。

文本搜尋

日志檢視器支援關鍵詞查詢、通配符查詢,* 表示比對 0 或多個任意字元,? 表示比對 1 個任意字元;若要将多個術語組合到一個複雜查詢中,可以使用布爾運算符(AND/OR/NOT)連接配接。

術語可以是單詞或者短語。比如:

  • 單個單詞:guance;
  • 多個單詞:guance test;(等同于 guance AND test)
  • 短語:"guance test"; (使用雙引号可以将一組單詞轉換為短語)

搜尋查詢示例:

采集 Kubernetes 容器日志最佳實踐

JSON 搜尋

檢視器原生支援對 JSON 格式 message 内容進行精确檢索,搜尋格式為: @key:value ,若為多層級 JSON 可用 “.” 承接,即 @key1.key2:value ,如圖所示:

采集 Kubernetes 容器日志最佳實踐

日志可視化分析

場景圖表

觀測雲内置多種資料監控視圖模版,使用者可導入模闆建立儀表闆和檢視器,并進行自定義編輯配置;或選擇自定義建立方式,通過一系列設定建構資料洞察場景。比如,根據前面解析出來的 status 字段,統計一下 info、error 狀态的日志分别有多少,可以通過以下步驟來建立可視化儀表闆。

第一步:在場景->建立空白儀表闆中,選擇自己想要的視圖類型。

采集 Kubernetes 容器日志最佳實踐

第二步:選擇日志資料源,設定過濾條件和分組,點選建立。

采集 Kubernetes 容器日志最佳實踐

強大的關聯能力

1、視圖配置跳轉連結

觀測雲提供連結功能,可以平滑跳轉儀表闆 & 檢視器,實作資料關聯分析、系統全面可觀測。

  • 在視圖設定頁面,配置連結位址。
采集 Kubernetes 容器日志最佳實踐
  • 再點選視圖中的資料,即可跳轉到對應的日志檢視器,快速實作視圖與檢視器關聯分析。
采集 Kubernetes 容器日志最佳實踐
采集 Kubernetes 容器日志最佳實踐

2、綁定内置視圖

觀測雲還支援将視圖儲存為内置視圖,并綁定到檢視器中,友善在檢視日志資料的同時,分析其他次元的資料。

采集 Kubernetes 容器日志最佳實踐

檢視日志詳情時,即可檢視上面綁定的内置視圖,也可以綁定其他次元的視圖,比如主機的名額視圖等等。

采集 Kubernetes 容器日志最佳實踐

日志告警

觀測雲提供開箱即用的監控模闆來建立監控器;也支援自定義建立監控器,通過門檻值檢測、日志檢測、突變檢測、區間檢測等十餘種檢測規則來設定檢測規則和觸發條件。開啟監控器後,即可接收到由檢測規則觸發的相關異常事件告警。

其中,日志檢測用于監控工作空間内基于日志采集器産生的的全部日志資料。支援基于日志的關鍵字設定告警,及時發現不符合預估行為的異常模式(如:日志文本資料中存在異常的标簽),多适用于 IT 監控場景下的代碼異常或任務排程檢測等。

第一步:在監控->建立日志檢測監控器。

采集 Kubernetes 容器日志最佳實踐

第二步:設定檢測規則和觸發條件。

這裡以日志内容包含"WARN"為例,設定超過100條時就觸發告警。

采集 Kubernetes 容器日志最佳實踐

第三步:編輯事件通知内容和告警政策,點選建立即可。

采集 Kubernetes 容器日志最佳實踐

日志備份

觀測雲提供日志資料轉發到觀測雲的對象存儲及轉發到外部存儲的功能(包含觀測雲備份日志、AWS S3、華為雲 OBS、阿裡雲 OSS 和 Kafka 消息隊列)。使用者可以自由選擇存儲對象,靈活管理日志備份資料。

日志備份

第一步:點選日志->資料轉發

采集 Kubernetes 容器日志最佳實踐

第二步:點選轉發規則->建立規則

采集 Kubernetes 容器日志最佳實踐

第三步:設定需要備份的資料源,和相關篩選條件,點選确定即可。

采集 Kubernetes 容器日志最佳實踐

注意:該規則下的日志資料最低存儲預設為 180 天,可以前往管理 > 設定 > 變更資料存儲政策中修改資料轉發存儲政策。

檢視備份資料

第一步:點選日志->資料轉發,在下拉框標明規則。

采集 Kubernetes 容器日志最佳實踐

第二步:自定義時間範圍查詢,可選擇多個日期及定義開始時間和結束時間,時間會精确到小時,即可查詢到備份資料。

采集 Kubernetes 容器日志最佳實踐

更多日志備份相關操作,也可以閱讀官方文檔的詳細介紹。

總結

通過以上方式,可以快速将部署在 Kubernetes 叢集的各個業務系統的日志采集到觀測雲平台,實作日志采集、日志解析、查詢分析、監控告警、歸檔備份等一整套解決方案。