如需採集Knative服務的容器文本日誌,您可以通過DaemonSet的方式,在每個節點上自動運行一個日誌代理,以提升營運效率。ACK叢集已相容Log ServiceSLS,支援無侵入式採集日誌。您可以安裝日誌組件Logtail,該組件會在節點上部署一個Logtail執行個體,用於收集節點上所有容器的日誌,便於後續的管理和分析。
工作原理
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
。
前提條件
已在叢集中部署Knative,請參見部署Knative。
已建立一個Knative服務,請參見快速部署一個Knative服務。
已開通Log Service,請參見開通Log Service。
步驟一:安裝Logtail組件
Logtail是SLS提供的日誌採集Agent,支援無侵入式採集ACK叢集中產生的日誌。您無需修改應用程式代碼,Logtail採集日誌時不會影響您的應用程式運行。您可以在ACK叢集中安裝Logtail組件,安裝完成後,Logtail會自動部署logtail-ds DaemonSet,用於採集節點的日誌。
請確保僅使用一款日誌採集工具例如Logtail,來採集並發送容器日誌到SLS。同時使用這兩個組件可能會導致容器日誌被重複採集和發送,帶來額外的費用和資源消耗。
升級Logtail、查看Logtail版本及IP地址、查看Logtail的作業記錄等操作步驟,請參見安裝Logtail組件(阿里雲Kubernetes叢集)。
建立叢集時安裝
在控制台左側導覽列,單擊叢集。
在叢集列表頁面中,單擊頁面右上方的建立叢集。
以下僅介紹開啟Log Service的關鍵步驟。關於建立叢集的具體操作,請參見建立ACK託管叢集。
在組件配置配置項頁中,選中使用Log Service,表示在建立的Kubernetes叢集中安裝日誌外掛程式。
當選中使用Log Service後,會出現建立專案(Project)的提示。關於Log Service管理日誌的組織圖,請參見專案(Project)。有以下兩種建立Project的方式。
單擊使用已有Project,選擇一個現有的Project來管理採集的日誌。
單擊建立新Project,自動建立一個新的Project來管理採集的日誌,Project會自動命名為
k8s-log-{ClusterID}
,其中,ClusterID是您建立的Kubernetes叢集的唯一標識。
配置完成後,單擊右下角的建立叢集,在彈出的視窗中單擊確定,完成建立。
完成建立後,您可在叢集列表頁面查看開啟了Logtail的ACK叢集。
為已有叢集安裝
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列中,選擇營運管理>組件管理,並在日誌與監控地區找到logtail-ds。
在logtail-ds組件右側,單擊安裝,並在安裝組件對話方塊中單擊確定。
如果您已安裝的Log Service組件為舊版本,可以在logtail-ds組件右側,單擊升級。
升級logtail-ds組件後,會重設組件參數。如果您曾自訂logtail-ds或alibaba-log-controller的配置和環境變數,參數將被覆蓋,請重新設定。具體操作,請參見手動升級。
步驟二:配置Logtail採集配置
建議您只選擇以下一種方式配置Logtail採集配置。
CRD:可以通過Kubernetes的工具進行大量設定和版本控制,適合集中管理多個Logtail採集配置。通過CRD建立的Logtail採集配置不會同步到控制台,因此如需修改這些配置,必須直接修改CRD資源,不要直接在控制台操作,否則導致Logtail採集配置不一致。
Log Service控制台:適合少量Logtail採集配置的建立和管理,無需登入Kubernetes叢集,操作步驟簡單但無法大量設定,配置的優先順序低於CRD。
環境變數:只支援單行文本,如果要配置多行文本或其他日誌格式,必須使用CRD或在Log Service控制台配置。
Logtail採集配置項包括:是否過濾某些容器、是否忽略指定的目錄或檔案(採集黑名單)、是否允許檔案多次採集等。
(推薦)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中查詢和分析日誌。具體操作,請參見建立索引。
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分鐘左右,待索引生效後,才能在原始日誌頁簽中,查看已採集到的日誌。更多資訊,請參見查詢和分析日誌。
環境變數
1. 建立服務時配置Log Service
您可以在建立Knative服務時參見下方YAML模板配置日誌採集。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊服務管理頁簽,選擇命名空間後單擊使用模組建立,選擇樣本模板為自訂模板,按照頁面指引參見以下YAML檔案完成建立。
YAML模板的文法同Kubernetes文法,但是為了給容器指定採集配置,需要使用
env
來為容器增加採集配置和自訂Tag,並根據採集配置,建立對應的volumeMounts
和volumes
。以下是一個簡單的Pod樣本。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go-log spec: template: spec: containers: - name: my-demo-app image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest' env: # 配置環境變數 - name: aliyun_logs_log-stdout value: stdout - name: aliyun_logs_log-varlog value: /var/demo/*.log - name: aliyun_logs_mytag1_tags value: tag1=v1 # 配置volume mount volumeMounts: - name: volumn-sls-mydemo mountPath: /var/demo # 如果Pod不斷重啟,啟動參數可以添加sleep command: ["sh", "-c"] # 使用shell來運行命令 args: ["sleep 3600"] # 設定休眠時間為1小時(3600秒) volumes: - name: volumn-sls-mydemo emptyDir: {}
根據您的需求,按照以下順序進行配置。
說明如果您有更多的日誌採集需求,請參見(可選)2. 配置環境變數的進階參數。
通過環境變數來建立您的採集配置和自訂Tag,所有與配置相關的環境變數都採用
aliyun_logs_
作為首碼。建立採集配置的規則如下:
- name: aliyun_logs_log-stdout value: stdout - name: aliyun_logs_log-varlog value: /var/demo/*.log
樣本中建立了兩個採集配置,格式為
aliyun_logs_{key}
,對應的{key}
分別為log-stdout
和log-varlog
。aliyun_logs_log-stdout
:該env表示建立一個名為log-stdout
的Logstore
,日誌採集路徑為stdout
的配置,對應的Log Service採集配置名稱也是log-stdout
,目的是將容器的標準輸出採集到log-stdout
這個Logstore
中。aliyun_logs_log-varlog
:該env表示建立一個Logstore
名為log-varlog
,日誌採集路徑為/var/demo/*.log的配置,對應的Log Service採集配置名稱也是log-varlog
,目的是將容器的/var/demo/*.log檔案內容採集到log-varlog
這個Logstore
中。
建立自訂Tag的規則如下:
- name: aliyun_logs_mytag1_tags value: tag1=v1
配置Tag後,當採集到該容器的日誌時,會自動附加對應的欄位到Log Service。其中
mytag1
為任意不包含'_'的名稱
。
如果您的採集配置中指定了非stdout的採集路徑,需要在此部分建立相應的
volumeMounts
。樣本中採集配置添加了對/var/demo/*.log的採集,因此相應地添加了/var/demo的
volumeMounts
。
當YAML編寫完成後,單擊建立,即可將相應的配置交由Kubernetes叢集執行。
(可選)2. 配置環境變數的進階參數
通過容器環境變數配置採集支援多種配置參數。您可以根據實際需求設定進階參數,以滿足日誌採集的特殊需求。
通過容器環境變數配置採集日誌的方式不適用於邊緣情境。
欄位 | 說明 | 樣本 | 注意事項 |
aliyun_logs_{key} |
|
|
|
aliyun_logs_{key}_tags | 可選。值為{tag-key}={tag-value}類型,用於對日誌進行標識。 |
| 不涉及。 |
aliyun_logs_{key}_project | 可選。值為指定的Log ServiceProject。當不存在該環境變數時,為您安裝時所選的Project。 |
| Project需與您的Logtail工作所在的Region一致。 |
aliyun_logs_{key}_logstore | 可選。值為指定的Log ServiceLogstore。當不存在該環境變數時,Logstore和{key}一致。 |
| 不涉及。 |
aliyun_logs_{key}_shard | 可選。值為建立Logstore時的shard數,取值範圍為[1 , 10]。當不存在該環境變數時,值為2。 說明 若logstore已經存在,則該參數不生效。 |
| 不涉及。 |
aliyun_logs_{key}_ttl | 可選。值為指定的日誌儲存時間,取值範圍為[1 , 3650]。
說明 若Logstore已經存在,則該參數不生效。 |
| 不涉及。 |
aliyun_logs_{key}_machinegroup | 可選。值為應用的機器組。當不存在該環境變數時與安裝Logtail的預設機器組一致。關於該參數的詳細使用方法,請參見下文的定製需求2:將不同應用資料擷取到不同的Project。 |
| 不涉及。 |
aliyun_logs_{key}_logstoremode | 可選。值為指定的Log ServiceLogstore的類型,不指定該參數的話,預設值為standard,取值: 說明 若Logstore已經存在,則該參數不生效。
|
| 該參數需要logtail-ds鏡像版本>=1.3.1。 |
步驟三:查詢分析日誌
Logtail採集到的容器日誌會儲存在SLS Logstore中。您可以在Log Service控制台查看,也可以在ACK控制台查看。查詢文法的介紹,請參見查詢概述。
ACK控制台
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在日誌中心頁面,單擊應用日誌頁簽,設定檢索條件後單擊選擇日誌庫,查看應用程式容器的相關日誌。
SLS控制台
安裝成功後,進入Log Service控制台。
在進入控制台後,在Project列表地區選取項目Kubernetes叢集對應的Project(預設為k8s-log-{Kubernetes叢集ID}),進入日誌庫列表頁簽。
在列表中找到相應的Logstore(採集配置中指定),將滑鼠懸浮在相應的Logstore名稱的右側,單擊表徵圖,並單擊查詢分析。
本例中,在日誌查詢頁面,您可以查看Tomcat應用的標準輸出日誌和容器內文本日誌,並可以發現自訂tag附加到日誌欄位中。
容器日誌文本預設欄位
每條容器文本日誌預設包含的欄位如下表所示。
欄位名稱 | 說明 |
__tag__:__hostname__ | 容器宿主機的名稱。 |
__tag__:__path__ | 容器內記錄檔的路徑。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的鏡像名稱。 |
__tag__:_pod_name_ | Pod的名稱。 |
__tag__:_namespace_ | Pod所屬的命名空間。 |
__tag__:_pod_uid_ | Pod的唯一識別碼(UID)。 |
相關文檔
如過在使用SLS Logstore時遇到問題,例如如何變更日誌儲存天數、關閉日誌採集等,請參見Logstore相關問題排查。
關於如何進行異常排查,請參見Logtail採集日誌失敗的排查思路。
您可以查看Knative應用的監控大盤,請參見查看Knative服務監控大盤。
您可以基於SLS實現監控警示,請參見為Knative服務開啟監控警示。