如果需要只使用一個Logtail執行個體收集Kubernetes節點上所有容器的日誌,可以使用DaemonSet方式在Kubernetes叢集上部署Logtail。本文介紹DaemonSet方式採集容器文本日誌的工作原理、使用限制、前提條件、操作步驟等資訊。
工作原理
DaemonSet模式
在DaemonSet模式中,Kubernetes叢集確保每個節點(Node)只運行一個Logtail容器,用於採集當前節點內所有容器(Containers)的日誌。
當新節點加入叢集時,Kubernetes叢集會自動在新節點上建立Logtail容器;當節點退出叢集時,Kubernetes叢集會自動銷毀當前節點上的Logtail容器。通過DaemonSet的自動擴縮容機制以及標識型機器組,無需您手動管理Logtail執行個體。
容器發現
Logtail容器採集其他容器的日誌,必鬚髮現和確定哪些容器正在運行,這個過程稱為容器發現。在容器發現階段,Logtail容器不與Kubernetes叢集的kube-apiserver進行通訊,而是直接和節點上的容器運行時守護進程(Container Runtime Daemon)進行通訊,從而擷取當前節點上的所有容器資訊,避免容器發現對叢集kube-apiserver產生壓力。
Logtail支援通過Namespace名稱、Pod名稱、Pod標籤、容器環境變數等條件指定或排除採集相應容器的日誌。
容器檔案路徑映射
在Kubernetes叢集中,因為Pod之間資源隔離,所以Logtail容器無法直接存取其他Pod中的容器的檔案。但是,容器內的檔案系統都是由宿主機的檔案系統掛載形成,通過將宿主機根目錄所在的檔案系統掛載到Logtail容器,就可以訪問宿主機上的任意檔案,從而間接採集業務容器檔案系統的檔案。容器內檔案路徑與宿主機檔案路徑之間的關係被稱為檔案路徑映射。
記錄檔在當前容器內的路徑是/log/app.log
,假設映射後的宿主機路徑是/var/lib/docker/containers/<container-id>/log/app.log
。Logtail預設將宿主機根目錄所在的檔案系統掛載到自身的/logtail_host
目錄下,因此Logtail實際採集的檔案路徑為/logtail_host/var/lib/docker/containers/<container-id>/log/app.log
。
使用限制
容器運行時:Logtail只支援Docker和Containerd兩種容器引擎。對於Docker只支援overlay、overlay2這兩種儲存驅動,其他儲存驅動需將日誌所在目錄通過資料卷掛載為臨時目錄。
儲存卷掛載方式:如果NAS以PVC的方式掛載到資料目錄,不支援使用DaemonSet方式部署Logtail,建議使用Sidecar方式或Deployment方式部署Logtail並完成日誌採集。具體操作,請參見通過Sidecar方式採集Kubernetes容器文本日誌。
記錄檔路徑:
容器內檔案路徑暫不支援存在軟連結,請按實際路徑配置採集目錄。
如果業務容器的資料目錄通過資料卷(Volume)掛載,則填寫的檔案路徑不能短於掛載點路徑。例如
/var/log/service
目錄是資料卷掛載的路徑,則設定採集目錄為/var/log
將無法採集該目錄下的日誌,因為採集目錄比掛載路徑短。必須設定採集目錄為/var/log/service
或更深的目錄。
記錄檔採集停止:
docker:當容器被停止時,Logtail會立刻釋放容器檔案控制代碼,容器可正常退出。如果在容器停止前,出現因網路延遲、資源佔用多等原因導致的採集延時,可能會丟失容器停止前的部分日誌。
containerd:當容器被停止時,Logtail會持續持有容器內檔案的控制代碼(即保持對記錄檔的開啟狀態),直至所有記錄檔內容發送完畢。因此,當出現網路延遲、資源佔用多等原因導致的採集延時時,可能會導致業務容器不能及時銷毀。
前提條件
已安裝Logtail組件。具體操作,請參見安裝Logtail組件(阿里雲Kubernetes叢集)。
安裝Logtail的主機需要在出口方向開放80(HTTP)連接埠和443(HTTPS)連接埠。ECS執行個體的連接埠由安全性群組規則控制,添加安全性群組規則的步驟請參見添加安全性群組規則。
目標容器持續新增日誌。Logtail只採集增量日誌。如果下發logtail採集配置後,記錄檔無更新,則Logtail不會採集該檔案中的日誌。更多資訊,請參見讀取日誌。
對於不同容器引擎,必須確認對應的UNIX域通訊端存在,並確保Logtail有相應UNIX域通訊端的存取權限。
Docker:
/run/docker.sock
。Containerd:
/run/containerd/containerd.sock
。
建立Logtail採集配置
通過CRD方式建立的配置,在控制台上對其修改不會同步到CRD中。因此,如需修改由CRD建立的配置內容,只能修改CRD資源,不要直接在控制台操作,避免iLogtail採集配置不一致。
Log Service控制台
單擊控制台右側的快速接入資料,在接入資料地區單擊Kubernetes-檔案卡片。
選擇目標Project和Logstore,單擊下一步。選擇您在安裝Logtail組件時所使用的Project。Logstore為您自訂建立的Logstore。
在機器組配置頁面。
根據實際情境,單擊以下頁簽:
- 重要
不同頁簽的後續配置步驟不同,請根據實際需求正確選擇。
確認目標機器組已在應用機器組列表中,然後單擊下一步。在ACK中安裝Logtail組件後,Simple Log Service自動建立名為
k8s-group-${your_k8s_cluster_id}
的機器組,您可以直接使用該機器組。重要如果需要建立機器組,請單擊建立機器組,按照右側面板進行建立。更多資訊,請參見通過控制台配置。
如果機器組心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
建立Logtail採集配置,單擊下一步建立Logtail採集配置,Log Service開始採集日誌。
說明Logtail採集配置生效時間最長需要3分鐘,請耐心等待。
建立索引和預覽資料,然後單擊下一步。Log Service預設開啟全文索引。您也可以根據採集到的日誌,手動建立欄位索引,或者單擊自動產生索引,Log Service將自動產生欄位索引。更多資訊,請參見建立索引。
重要如果需要查詢日誌中的所有欄位,建議使用全文索引。如果只需查詢部分欄位、建議使用欄位索引,減少索引流量。如果需要對欄位進行分析(SELECT語句),必須建立欄位索引。
單擊查詢日誌,系統將跳轉至Logstore查詢分析頁面。
您需要等待1分鐘左右,待索引生效後,才能在原始日誌頁簽中,查看已採集到的日誌。更多資訊,請參見查詢和分析日誌。
(推薦)CRD-AliyunPipelineConfig
建立Logtail採集配置
使用AliyunPipelineConfig,需要日誌組件版本最低為0.5.1。
您只需要建立AliyunPipelineConfig CR即可建立iLogtail採集配置,建立完成後自動生效。對於通過CR建立的iLogtail採集配置,其修改只能通過更新相應的CR來實現。
執行如下命令建立一個YAML檔案。
cube.yaml
為檔案名稱,請根據實際情況替換。vim cube.yaml
在YAML檔案輸入如下指令碼,並根據實際情況設定其中的參數。
重要請確保
configName
欄位值在安裝Logtail組件的Project中唯一。每個iLogtail採集配置必須單獨設定一個對應的CR,如果多個CR關聯同一個Logtail配置,後配置的CR將不會生效。
AliyunPipelineConfig
的參數,請參見【推薦】使用AliyunPipelineConfig管理採集配置。本文的iLogtail採集配置範例包含基礎的文本日誌採集功能,參數說明參見CreateLogtailPipelineConfig - 建立Logtail流水線配置。請確保config.flushers.Logstore參數配置的Logstore已存在,可以通過配置spec.logstore參數自動建立Logstore。
採集指定容器內的單行文本日誌
建立名為
example-k8s-file
的iLogtail採集配置,對於叢集內名稱包含app
的所有容器,以單行文字模式採集/data/logs/app_1
路徑下的test.LOG
檔案,直接發送到名稱為
k8s-file
的Logstore,該Logstore屬於名稱為k8s-log-test
的Project。apiVersion: telemetry.alibabacloud.com/v1alpha1 # 建立一個 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的iLogtail採集配置名 name: example-k8s-file spec: # 指定目標project project: name: k8s-log-test # 建立用於儲存日誌的 Logstore logstores: - name: k8s-file # 定義iLogtail採集配置 config: # 定義輸入外掛程式 inputs: # 使用input_file外掛程式採集容器內文本日誌 - Type: input_file # 容器內的檔案路徑 FilePaths: - /data/logs/app_1/**/test.LOG # 啟用容器發現功能。 EnableContainerDiscovery: true # 添加容器資訊過濾條件,多個選項之間為“且”的關係。 ContainerFilters: # 指定待採集容器所在 Pod 所屬的命名空間,支援正則匹配。 K8sNamespaceRegex: default # 指定待採集容器的名稱,支援正則匹配。 K8sContainerRegex: ^(.*app.*)$ # 定義輸出外掛程式 flushers: # 使用flusher_sls外掛程式輸出到指定Logstore。 - Type: flusher_sls # 需要確保該 Logstore 存在 Logstore: k8s-file # 需要確保 endpoint 正確 Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
採集所有容器內的多行文本日誌並正則解析
建立名為
example-k8s-file
的iLogtail採集配置,以多行文字模式採集叢集內所有容器內的/data/logs/app_1
路徑下的test.LOG
檔案,對採集到的資料進行JSON解析,直接發送到名稱為k8s-file
的Logstore,該Logstore屬於名稱為k8s-log-test
的Project。下面範例中的日誌原文通過input_file外掛程式讀取後格式為
{"content": "2024-06-19 16:35:00 INFO test log\nline-1\nline-2\nend"}
,會被正則解析外掛程式解析為{"time": "2024-06-19 16:35:00", "level": "INFO", "msg": "test log\nline-1\nline-2\nend"}
apiVersion: telemetry.alibabacloud.com/v1alpha1 # 建立一個 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的iLogtail採集配置名 name: example-k8s-file spec: # 指定目標project project: name: k8s-log-test # 建立用於儲存日誌的 Logstore logstores: - name: k8s-file # 定義iLogtail採集配置 config: # 日誌範例(可不填寫) sample: | 2024-06-19 16:35:00 INFO test log line-1 line-2 end # 定義輸入外掛程式 inputs: # 使用input_file外掛程式採集容器內多行文本日誌 - Type: input_file # 容器內的檔案路徑 FilePaths: - /data/logs/app_1/**/test.LOG # 啟用容器發現功能。 EnableContainerDiscovery: true # 開啟多行能力 Multiline: # 選擇自訂行首Regex模式 Mode: custom # 配置行首Regex StartPattern: \d+-\d+-\d+.* # 定義處理外掛程式 processors: # 使用正則解析外掛程式解析日誌 - Type: processor_parse_regex_native # 源欄位名 SourceKey: content # 解析用的Regex,用擷取的群組"()"捕獲待提取的欄位 Regex: (\d+-\d+-\d+\s*\d+:\d+:\d+)\s*(\S+)\s*(.*) # 提取的欄位列表 Keys: ["time", "level", "msg"] # 定義輸出外掛程式 flushers: # 使用flusher_sls外掛程式輸出到指定Logstore。 - Type: flusher_sls # 需要確保該 Logstore 存在 Logstore: k8s-file # 需要確保 endpoint 正確 Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
執行如下命令使iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的文本日誌,並發送到Log Service中。
cube.yaml
為檔案名稱,請根據實際情況替換。kubectl apply -f cube.yaml
重要採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引。
CRD-AliyunLogConfig
您只需要建立AliyunLogConfig CR即可建立iLogtail採集配置,建立完成後自動生效。對於通過CR建立的iLogtail採集配置,其修改只能通過更新相應的CR來實現。
執行如下命令建立一個YAML檔案。
cube.yaml
為檔案名稱,請根據實際情況替換。vim cube.yaml
在YAML檔案輸入如下指令碼,並根據實際情況設定其中的參數。
重要請確保
configName
欄位值在安裝Logtail組件的Project中唯一。如果多個CR關聯同一個iLogtail採集配置,則刪除或修改任意一個CR均會影響到該iLogtail採集配置,導致其他關聯該iLogtail採集配置的CR狀態與Log Service中iLogtail採集配置的狀態不一致。
CR欄位的格式請參見使用AliyunLogConfig管理採集配置。本文的iLogtail採集配置範例包含基礎的文本日誌採集功能,具體參數參見CreateConfig - 建立Logtail採集配置。
採集指定容器內的單行文本日誌
“建立名為
example-k8s-file
的iLogtail採集配置,以單行文字模式採集叢集內所有名稱開頭為app
的Pod的容器內的/data/logs/app_1
路徑下的test.LOG
檔案,直接發送到名稱為k8s-file
的Logstore,該Logstore屬於名稱為k8s-log-test
的Project。”apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 設定資源名,在當前Kubernetes叢集內唯一。 name: example-k8s-file namespace: kube-system spec: # 設定目標project名稱(可不填寫,預設為k8s-log-<your_cluster_id>) project: k8s-log-test # 設定Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。 logstore: k8s-file # 設定iLogtail採集配置。 logtailConfig: # 設定採集的資料來源類型。採集文本日誌時,需設定為file。 inputType: file # 設定iLogtail採集配置的名稱。 configName: example-k8s-file inputDetail: # 指定通過極簡模式採集文本日誌。 logType: common_reg_log # 設定記錄檔所在路徑。 logPath: /data/logs/app_1 # 設定記錄檔的名稱。支援萬用字元星號(*)和半形問號(?),例如log_*.log。 filePattern: test.LOG # 採集容器的文本日誌時,需設定dockerFile為true。 dockerFile: true #設定容器過濾條件。 advanced: k8s: K8sPodRegex: '^(app.*)$'
執行如下命令使其iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的文本日誌,並發送到Log Service中。
cube.yaml
為檔案名稱,請根據實際情況替換。kubectl apply -f cube.yaml
重要採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引。
查看Logtail採集配置
控制台
在Project列表地區,單擊目標Project。
在 頁簽中,單擊目標日誌庫前面的>,依次選擇 。
單擊目標Logtail採集配置,查看Logtail採集配置詳情。
(推薦)CRD-AliyunPipelineConfig
查看由AliyunPipelineConfig建立的Logtail採集配置
查看由AliyunPipelineConfig建立的Logtail採集配置的詳細資料
CRD-AliyunLogConfig
查看由AliyunLogConfig建立的iLogtail採集配置
查看由AliyunLogConfig建立的iLogtail採集配置的詳細資料
查詢分析已採集的日誌
在Project列表中,單擊目標Project,進入對應的Project詳情頁面。
在對應的日誌庫右側的表徵圖,選擇查詢分析,查看Kubernetes叢集輸出的日誌。
容器日誌文本預設欄位
每條容器文本日誌預設包含的欄位如下表所示。
欄位名稱 | 說明 |
__tag__:__hostname__ | 容器宿主機的名稱。 |
__tag__:__path__ | 容器內記錄檔的路徑。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的鏡像名稱。 |
__tag__:_pod_name_ | Pod的名稱。 |
__tag__:_namespace_ | Pod所屬的命名空間。 |
__tag__:_pod_uid_ | Pod的唯一識別碼(UID)。 |
相關文檔
當您使用Logtail採集容器(標準容器、Kubernetes)日誌遇到異常情況時,您可以參見如何排查容器日誌採集異常進行排查。
採集Kubernetes容器標準輸出的步驟,請參見通過DaemonSet方式採集Kubernetes容器標準輸出。