全部產品
Search
文件中心

Simple Log Service:通過DaemonSet方式採集Kubernetes容器標準輸出

更新時間:Nov 27, 2024

本文介紹如何通過控制台建立iLogtail採集配置,並以DaemonSet採集方式採集容器標準輸出。

前提條件

  • 已安裝Logtail組件。具體操作,請參見安裝Logtail組件(阿里雲Kubernetes叢集)
  • 在您安裝Logtail組件時所使用的Project中已完成Logstore建立。具體操作,請參見建立Logstore
  • 目標容器持續產生日誌。
    重要 Logtail只採集增量日誌。如果下發Logtail配置後,記錄檔無更新,則Logtail不會採集該檔案中的日誌。更多資訊,請參見讀取日誌

功能特點

Logtail支援採集容器內產生的標準輸出,並附加容器的相關中繼資料資訊一起上傳到Log Service。Logtail具備以下功能特點。

  • 支援採集標準輸出資訊(stdout)和標準出錯資訊(stderr)。

  • 支援通過容器Label白名單指定待採集的容器。

  • 支援通過容器Label黑名單排除不要採集的容器。

  • 支援通過環境變數白名單指定待採集的容器。

  • 支援通過環境變數黑名單排除不要採集的容器。

  • 支援採集多行日誌(例如Java Stack日誌)。

  • 支援上報容器日誌時自動關聯Meta資訊(例如容器名、鏡像、Pod、Namespace、環境變數等)。

  • 當容器運行於Kubernetes時,Logtail還具有以下功能。

    • 支援通過Kubernetes Namespace名稱、Pod名稱、容器名稱指定待採集的容器。

    • 支援通過Kubernetes Label白名單指定待採集的容器。

    • 支援通過Kubernetes Label黑名單排除不要採集的容器。

    • 支援上報容器日誌時自動關聯Kubernetes Label資訊。

實現原理

Logtail與Docker的Domain Socket進行通訊,查詢該Docker上啟動並執行所有容器,並根據容器中的Label和環境變數定位需要被採集的容器。Logtail通過容器元資訊擷取容器標準輸出log-file的位置進行資料擷取。

Logtail在採集容器的標準輸出時,會定期將採集的點位資訊儲存到checkpoint檔案中。如果Logtail停止後再次啟動,會從上一次儲存的點位開始採集。實現原理

使用限制

  • 此功能目前僅支援Linux作業系統,依賴Logtail 0.16.0及以上版本。版本查看與升級,請參見安裝Logtail(Linux系統)

  • Logtail支援Docker和Containerd兩種容器引擎的資料擷取,訪問路徑說明如下:

    • Docker:Logtail通過/run/docker.sock訪問Docker,請確保該路徑存在且具備存取權限。

    • Containerd:Logtail通過/run/containerd/containerd.sock訪問Containerd,請確保該路徑存在且具備存取權限。

  • 多行日誌限制:為保證多行組成的一條日誌不因為輸出延遲而被分割成多條,多行日誌情況下,採集的最後一條日誌預設都會緩衝一段時間。預設緩衝時間為3秒,可通過BeginLineTimeoutMs參數修改,但此值不能低於1000(毫秒),否則容易出現誤判。

  • 採集停止策略:當容器被停止後,Logtail監聽到容器die的事件後會停止採集該容器的標準輸出。如果此時採集出現延遲,則可能丟失停止前的部分輸出。

  • Docker容器引擎節流:目前標準輸出採集僅支援JSON類型的日誌驅動。

  • 上下文限制:預設同一Logtail配置下的所有容器的標準輸出處於同一上下文中,即無法使用控制台的上下文查詢及Livetail功能直接查看某一容器標準輸出的上下文。如果需要使用這些功能,請添加日誌上下文彙總外掛程式。更多資訊,請參見aggregators配置

  • 資料處理:採集到的資料預設儲存在content欄位中。Logtail對於採集到的容器標準輸出,支援資料處理。更多資訊,請參見使用Logtail外掛程式處理資料

建立Logtail採集配置(舊版)

表單配置方式

  1. 登入Log Service控制台,在Project列表,單擊開啟目標Project。

  2. 日誌儲存 > 日誌庫頁簽中,單擊目標Logstore。

  3. 展開Logstore功能表列,單擊Logtail配置,然後單擊添加Logtail配置image

  4. 快速資料接入頁面,單擊K8S-標準輸出-舊版image

  5. 機器組配置步驟中,選擇Logtail組件自動建立的機器組,一般命名為k8s-group-*。然後單擊下一步

    image

  6. Logtail配置步驟中,完成如下配置。image

    重要參數說明如下:

    全域配置

    配置項

    說明

    配置名稱

    Logtail採集配置名稱在Project中全域唯一,且建立後不可修改。

    進階參數

    其他可選的與配置全域相關的進階功能參數,請參見建立Logtail流水線配置

    輸入配置

    參數

    說明

    標準輸出

    開啟標準輸出後,Logtail將採集容器標準輸出。

    標準錯誤

    開啟標準錯誤後,Logtail將採集容器標準錯誤。

    啟用容器元資訊預覽

    開啟啟用容器元資訊預覽後,您可以在建立Logtail配置後,查看容器元資訊,包括匹配容器資訊和全量容器資訊。

    容器過濾

    Logtail版本

    • Logtail 1.0.34以下版本,只支援通過環境變數容器Label進行容器過濾。

    • Logtail 1.0.34及以上版本,推薦使用Kubernetes層級的資訊(K8s Pod名稱正則匹配K8s Namespace正則匹配K8s容器名稱正則匹配K8s Pod標籤白名單等)進行容器過濾。

    過濾條件說明

    重要
    • 容器Label為Docker inspect中的Label,不是Kubernetes中的Label。如何擷取,請參見擷取容器Label

    • 環境變數為容器啟動中配置的環境變數資訊。如何擷取,請參見擷取容器環境變數

    1. Kubernetes中的Namespace和容器名稱會映射到容器Label中,分別為io.kubernetes.pod.namespaceio.kubernetes.container.name,推薦使用這兩個容器Label進行容器過濾。例如,某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prodio.kubernetes.container.name : worker-server

    2. 如果以上兩個容器Label不滿足過濾需求,請使用環境變數的黑白名單進行容器過濾。

    K8s Pod名稱正則匹配

    通過Pod名稱指定待採集的容器,支援正則匹配。例如設定為^(nginx-log-demo.*)$,,表示匹配以nginx-log-demo開頭的Pod下的所有容器。

    說明

    Logtail 1.0.34及以上版本支援該參數。

    K8s Namespace正則匹配

    通過Namespace名稱指定採集的容器,支援正則匹配。例如設定為^(default|nginx)$,表示匹配nginx命名空間、default命名空間下的所有容器。

    說明

    Logtail 1.0.34及以上版本支援該參數。

    K8s容器名稱正則匹配

    通過容器名稱指定待採集的容器(Kubernetes容器名稱是定義在spec.containers中),支援正則匹配。例如設定為^(container-test)$,表示匹配所有名為container-test的容器。

    說明

    Logtail 1.0.34及以上版本支援該參數。

    容器label白名單

    容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
    • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。

      LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:配置LabelKeyio.kubernetes.container.name,配置LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

    多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。

    容器label黑名單

    容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
    • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。

      LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:設定LabelKeyio.kubernetes.container.name,設定LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

    多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。

    環境變數白名單

    環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。

    • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
    • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。

      EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_SERVICE_PORT,設定EnvValue^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。

    多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。

    環境變數黑名單

    環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。

    • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
    • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。

      EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_SERVICE_PORT,設定EnvValue^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。

    多個黑名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被排除。

    K8s Pod標籤白名單

    通過Kubernetes Label白名單指定待採集的容器。如果您要設定Kubernetes Label白名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都匹配。
    • 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。

      LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定LabelValue^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。

    多個白名單之間為或關係,即只要Kubernetes Label滿足任一白名單即可被匹配。

    說明
    • Logtail 1.0.34及以上版本支援該參數。

    • 由於在Kubernetes管控類資源(例如Deployment)運行時更改Label,不會重啟具體的工作資源Pod,因此Pod無法感知此變更,可能導致匹配規則失效。設定K8s Label黑白名單時,請以Pod中的Kubernetes Label為準。關於Kubernetes Label的更多資訊,請參見Labels and Selectors

    K8s Pod標籤黑名單

    通過Kubernetes Label黑名單排除不採集的容器。如果您要設定Kubernetes Label黑名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都被排除。
    • 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才會被排除。

      LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定LabelValue^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。

    多個黑名單之間為或關係,即只要Kubernetes Label滿足任一黑名單對即可被排除。

    說明
    • Logtail 1.0.34及以上版本支援該參數。

    • 由於在Kubernetes管控類資源(例如Deployment)運行時更改Label,不會重啟具體的工作資源Pod,因此Pod無法感知此變更,可能導致匹配規則失效。設定K8s Label黑白名單時,請以Pod中的Kubernetes Label為準。關於Kubernetes Label的更多資訊,請參見Labels and Selectors

    日誌標籤富化

    如果您使用的是Logtail 1.0.34及以上版本,您可以將環境變數和Kubernetes Label添加到日誌,作為日誌標籤。

    環境變數相關

    設定環境變數擴充欄位後,Log Service將在日誌中新增環境變數相關欄位。例如設定環境變數名VERSION,設定tag名env_version,當容器中包含環境變數VERSION=v1.0.0時,會將該資訊添加到日誌中,即添加欄位__tag__:__env_version__: v1.0.0

    Pod標籤相關

    設定Kubernetes Pod擴充欄位後,Log Service將在日誌中新增Kubernetes Pod相關欄位。例如設定Pod標籤名app,設定tag名k8s_pod_app,當Kubernetes中包含Labelapp=serviceA時,會將該資訊添加到日誌中,即添加欄位__tag__:__k8s_pod_app__: serviceA

    日誌最大長度(位元組)

    日誌最大長度,預設值為524288位元組。取值範圍為[1024, 20971520],單位:位元組。

    如果日誌長度超過該值,則不再繼續尋找行首,直接上傳。

    首次採集回溯歷史資料長度(位元組)

    首次採集時回溯歷史資料長度,預設值為131072位元組(128 KB)。建議取值範圍為[131072,1048576],單位:位元組。

    進階參數

    Logtail配置的部分參數需要手動輸入,請參見建立Logtail流水線配置

    處理配置

    配置項

    說明

    多行模式

    行首Regex

    Logtail通過行首Regex去匹配一條日誌的行首,如果匹配成功,則將該行作為一條新的日誌,否則將此行拼接到上一條日誌。

    行首正則匹配長度(位元組)

    行首匹配的長度,預設值為10240位元組。

    如果行首匹配的Regex在前N個位元組即可體現,推薦設定此參數,提升行首匹配效率。

    行首匹配逾時時間(毫秒)

    行首匹配的逾時時間,預設值為3000毫秒。

    如果3000毫秒內沒有出現新日誌,則結束匹配,將最後一條日誌上傳到Log Service。

    說明

    如果日誌為多行日誌,請使用該選項。

    處理模式

    處理外掛程式支援拓展外掛程式。有關處理外掛程式的更多資訊,請參見處理外掛程式概述

  7. 後續步驟根據嚮導完成即可。

CRD-AliyunPipelineConfig(推薦)

警告

如果使用AliyunPipelineConfig,需要日誌組件版本最低為0.5.1。

您只需要建立AliyunPipelineConfig CR即可建立iLogtail採集配置。建立完成後,系統自動應用該iLogtail採集配置

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 執行如下命令建立一個YAML檔案。

    cube.yaml為檔案名稱,請根據實際情況替換。

    vim cube.yaml
  3. 在YAML檔案中輸入如下指令碼,並根據實際情況設定其中的參數。

    重要

    多行模式採集指定容器的標準輸出

    建立名為k8s-stdout-的iLogtail採集配置,對於叢集內名稱包含app的所有容器,以多行模式採集標準輸出,直接發送到名稱為k8s-stdout的Logstore,該Logstore屬於名稱為k8s-log-clusterid的Project。

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 建立一個 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的iLogtail採集配置名
      name: example-k8s-stdout
    spec:
      # 指定目標project
      project:
        name: k8s-log-clusterid
      # 建立用於儲存日誌的 Logstore
      logstores:
        - name: k8s-stdout
      # 定義iLogtail採集配置
      config:
        # 日誌範例(可不填寫)
        sample: |
          2024-06-19 16:35:00 INFO test log
          line-1
          line-2
          end
        # 定義輸入外掛程式
        inputs:
          # 使用service_docker_stdout外掛程式採集容器內文本日誌
          - Type: service_docker_stdout
            Stdout: true
            Stderr: true
            # 配置容器資訊過濾條件,多個選項之間為“且”的關係。
            # 指定待採集容器所在 Pod 所屬的命名空間,支援正則匹配。
            K8sNamespaceRegex: "^(default)$"
            # 指定待採集容器的名稱,支援正則匹配。
            K8sContainerRegex: "^(.*app.*)$"
            # 配置多行切分配置
            # 配置行首Regex
            BeginLineRegex: \d+-\d+-\d+.*
        # 定義輸出外掛程式
        flushers:
          # 使用flusher_sls外掛程式輸出到指定Logstore。
          - Type: flusher_sls
            Logstore: k8s-stdout
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs
  4. 執行如下命令使iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的標準輸出,並發送到Log Service中。

    cube.yaml為檔案名稱,請根據實際情況替換。

    kubectl apply -f cube.yaml
    重要

    採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引

CRD-AliyunLogConfig

您只需要建立AliyunLogConfig CR即可建立iLogtail採集配置。建立完成後,系統自動應用該iLogtail採集配置。

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 執行如下命令建立一個YAML檔案。cube.yaml為檔案名稱,請根據實際情況替換。

    vim cube.yaml
  3. 在YAML檔案中輸入如下指令碼,並根據實際情況設定其中的參數。

    重要
    • 請確保configName欄位值在安裝Logtail組件的Project中唯一。

    • 如果多個CR關聯同一個iLogtail採集配置,則刪除或修改任意一個CR均會影響到該iLogtail採集配置,導致其他關聯該iLogtail採集配置的CR狀態與Log Service中iLogtail採集配置的狀態不一致。

    • CR欄位的格式請參見使用AliyunLogConfig管理採集配置。本文的iLogtail採集配置範例包含基礎的標準輸出採集功能,具體參數參見CreateConfig - 建立Logtail採集配置

    單行模式採集指定容器的標準輸出

    建立名為example-stdout-example的Logtail採集配置,以單行文字模式採集叢集內所有名稱開頭為app的Pod的容器內的標準輸出,直接發送到名稱為k8s-stdout的Logstore,該Logstore屬於名稱為k8s-log-clusterid的Project。

    # 標準輸出配置
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 設定資源名,在當前Kubernetes叢集內唯一。
      name: simple-stdout-example
    spec:
      # 設定Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。
      logstore: k8s-stdout
      # 設定Logtail採集配置。
      logtailConfig:
        # 設定採集的資料來源類型。採集標準輸出時,需設定為plugin。
        inputType: plugin
        # 設定Logtail採集配置的名稱,必須與資源名(metadata.name)相同。
        configName: simple-stdout-example
        inputDetail:
          plugin:
            inputs:
              -
                # input type
                type: service_docker_stdout
                detail:
                  # 指定採集stdout和stderr。
                  Stdout: true
                  Stderr: true
                  K8sPodRegex: "^(app.*)$"
  4. 執行如下命令使iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的標準輸出,並發送到Log Service中。

    cube.yaml為檔案名稱,請根據實際情況替換。

    kubectl apply -f cube.yaml
    重要

    採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引

預覽容器元資訊

建立Logtail配置後,您可以在Logtail配置頁面查看容器元資訊以及容器未匹配過濾條件的原因。

重要

僅Linux Logtail 1.4.0及以上版本或Windows Logtail 1.4.0.0及以上版本支援該功能。

  1. Project列表中,單擊您在建立Logtail配置所使用的Project。

  2. 日誌儲存 > 日誌庫頁簽中,選擇您在建立Logtail配置所使用的Logstore,然後單擊Logstore左側的>,選擇資料接入 > Logtail配置

  3. 在Logtail配置列表中,單擊目標Logtail配置。

  4. Logtail配置頁面中,單擊編輯

  5. 開啟啟用容器元資訊預覽開關。

  6. 單擊容器元資訊預覽

  7. 容器預覽對話方塊中,查看容器的元資訊。

    • 匹配容器頁簽中展示匹配您所設定的過濾條件的容器的元資訊。

    • 全量容器頁簽中展示當前Kubernetes叢集中所有容器的元資訊以及容器未匹配過濾條件的原因。

日誌欄位

Kubernetes叢集的每條日誌預設上傳的欄位如下所示。

欄位名稱

說明

_time_

日誌採集時間。

_source_

日誌源類型,stdout或stderr。

_image_name_

鏡像名

_container_name_

容器名

_pod_name_

Pod名

_namespace_

Pod所在的命名空間

_pod_uid_

Pod的唯一標識

問題排查

當您使用Logtail採集容器(標準容器、Kubernetes)日誌遇到異常情況時,您可以參見如下內容進行排查。

當標準錯誤日誌與訪問日誌格式不同,無法正常解析時,建議針對content加索引去搜尋error。Log Service不支援使用提取欄位的外掛程式來做解析。更多資訊,請參見建立索引