Log Service提供DaemonSet與Sidecar兩種方式部署Logtail以供採集K8s日誌,兩種方式的差異請參考K8s叢集情境Logtail安裝採集指引。本文介紹如何通過DaemonSet方式部署Logtail採集阿里雲ACK叢集文本日誌的流程。
前提條件
已開通Log Service。具體操作,請參見開通Log Service。
注意事項
本文僅適用於ACK託管與專有叢集。
如果您要採集ACK託管與專有叢集中容器的標準輸入,請參見採集阿里雲ACK叢集標準輸出-舊版(DaemonSet方式部署Logtail)。
如果您要採集ACK Serverless叢集中的容器應用日誌,請參見通過Pod環境變數採集應用日誌。
當您使用自建的K8s叢集,或您的阿里雲ACK叢集與Log Service屬於不同的阿里雲帳號,請參見採集自建K8s叢集文本日誌(DaemonSet方式部署Logtail)。
方案預覽
在使用DaemonSet方式部署Logtail並採集ACK叢集文本日誌時,主要有三個步驟:
安裝Logtail組件:為您的ACK叢集安裝Logtail組件,包含DaemonSet logtail-ds,ConfigMap alibaba-log-configuration,Deployment alibaba-log-controller等,以供後續Log Service下發採集配置到Logtail並執行日誌採集操作。
建立Logtail採集配置:Logtail組件會根據採集配置將增量日誌採集並處理後上傳到Logstore中。本文介紹CRD-AliyunPipelineConfig(推薦)、CRD-AliyunLogConfig、控制台和環境變數四種建立採集配置的方式。
查詢分析日誌:配置成功後會為您自動建立Logstore,您可以查看日誌資料。
步驟一:安裝Logtail組件
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在日誌與監控頁簽中,找到logtail-ds,然後單擊安裝。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
單擊建立叢集,在組件配置頁面,選中使用Log Service。
本文只描述Log Service相關配置,關於更多配置項說明,請參見建立ACK託管叢集。
當選中使用Log Service後,會出現建立專案(Project)的提示。
使用已有Project
您可以選擇一個已有的Project來管理採集到的容器日誌。
建立新Project
Log Service自動建立一個Project來管理採集到的容器日誌。其中
ClusterID
為您建立的Kubernetes叢集的唯一標識。
在組件配置頁中,預設開啟控制面組件日誌,開啟此配置會在Project中自動設定並採集叢集控制面組件日誌並遵循隨用隨付,因此請您根據自身情況選擇是否需要開啟,相關資訊請參考管理控制面組件日誌。
安裝完成後,自動產生名為k8s-log-<YOUR_CLUSTER_ID>
的Project,並在該Project下產生如下資源,您可登入Log Service控制台查看資源。
資源類型 | 資源名稱 | 作用 | 樣本 |
資源類型 | 資源名稱 | 作用 | 樣本 |
機器組 | k8s-group- | logtail-daemonset的機器組,主要用於日誌採集情境。 | k8s-group-my-cluster-123 |
k8s-group- | logtail-statefulset的機器組,主要用於指標採集情境。 | k8s-group-my-cluster-123-statefulset | |
k8s-group- | 單一實例機器組,主要用於部分單一實例採集配置。 | k8s-group-my-cluster-123-singleton | |
Logstore | config-operation-log | 用於儲存Logtail組件中的alibaba-log-controller日誌。建議不要在此Logstore下建立採集配置。該Logstore可以刪除,刪除後不會再採集alibaba-log-controller的作業記錄。該Logstore的收費標準和普通的Logstore收費標準是一致的,具體請參見按寫入資料量計費模式計費項目。 | 無 |
步驟二:建立Logtail採集配置
這裡為您介紹四種採集配置方式。建議您只使用一種方法管理Logtail採集配置:
配置方式 | 配置說明 | 情境適用 |
配置方式 | 配置說明 | 情境適用 |
(推薦)CRD-AliyunPipelineConfig | 通過K8s CRD管理日誌採集配置。 | 適用於需要複雜採集和處理需求以及在ACK叢集中確保日誌與應用版本一致性的情境。 需要ACK的logtail-ds組件版本高於1.8.10。升級詳情請參見升級Logtail latest版本。 |
Log Service控制台 | 圖形化介面直接管理,快速部署配置。 | 適合少量Logtail採集配置的建立和管理,部分進階功能和自訂需求無法通過實現。 |
環境變數 | 通過環境變數快速配置日誌參數。 | 進行簡單配置調整,不支援複雜處理邏輯,僅支援單行文本日誌。可滿足以下定製需求:
|
CRD-AliyunLogConfig | 舊版CRD管理方式。 | 支援已知情境的舊版管理方式。 需要逐漸遷移到新版本CRD-AliyunPipelineConfig以享受更好的擴充性和穩定性。兩類CRD採集方式對比請參見CRD類型。 |
您只需要建立AliyunPipelineConfig自訂資源即可建立Logtail採集配置,資源建立完成後自動生效。
對於通過自訂資源建立的Logtail採集配置,其修改只能通過更新相應的自訂資源來實現,在Log Service控制台上對Logtail採集配置的修改不會同步到自訂資源中。
在左側導覽列中,單擊叢集列表。
在叢集列表頁面中,單擊目的地組群操作列下的更多,然後單擊管理叢集。
建立名為example-k8s-file.yaml的檔案。
您可用採集配置產生器產生目標情境YAML指令碼,或參考如下樣本手動編寫。
以下樣本YAML檔案以多行文字模式採集default命名空間下,標籤為
app: ^(.*test.*)$
的Pod中/data/logs/app_1
路徑下的test.LOG
檔案內容,並將其發送到名為k8s-log-test
的Project中的名為k8s-file
(自動建立)的Logstore。您需根據實際情況修改YAML中的以下參數:project
,樣本:k8s-log-test
。登入Log Service控制台,確定您安裝的Logtail產生的Project的名稱,通常格式為
k8s-log-<YOUR_CLUSTER_ID>
。IncludeK8sLabel
,樣本:app: ^(.*test.*)$
。用於篩選目標Pod的標籤,當前條件指定標籤鍵為app,值中包含test的Pod會被採集。如果需要採集叢集中名稱包含test的所有Pod,可以將IncludeK8sLabel替換為K8sContainerRegex,並使用萬用字元配置值,如:
K8sContainerRegex: ^(.test.)$
。FilePaths
,樣本:/data/logs/app_1/**/test.LOG
。更多詳情請參見容器檔案路徑映射。Endpoint
和Region
,樣本:cn-hangzhou.log.aliyuncs.com
和cn-hangzhou
。
有關YAML檔案中
config
項的詳情,包括支援的輸入、輸出、處理外掛程式類型和容器過濾方式,請參見PipelineConfig。完整的YAML參數詳情請參見CR參數說明。apiVersion: telemetry.alibabacloud.com/v1alpha1 kind: ClusterAliyunPipelineConfig metadata: # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的Logtail採集配置名,如果名稱重複則不會生效。 name: example-k8s-file spec: # 指定目標Project project: name: k8s-log-test logstores: # 建立名為 k8s-file的Logstore - name: k8s-file # 定義Logtail採集配置 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 # 添加容器資訊過濾條件,多個選項之間為“且”的關係。 CollectingContainersMeta: true ContainerFilters: # 指定待採集容器所在 Pod 所屬的命名空間,支援正則匹配。 K8sNamespaceRegex: default # 指定待採集容器的名稱,支援正則匹配。 IncludeK8sLabel: app: ^(.*app.*)$ # 開啟多行日誌採集,單行日誌採集請刪除該配置 Multiline: # 選擇自訂行首Regex模式 Mode: custom # 配置行首Regex StartPattern: '\d+-\d+-\d+\s\d+:\d+:\d+' # 定義處理外掛程式 processors: # 使用正則解析外掛程式解析日誌 - Type: processor_parse_regex_native # 源欄位名 SourceKey: content # 解析用的Regex,用擷取的群組"()"捕獲待提取的欄位 Regex: (\d+-\d+-\d+\s\S+)(.*) # 提取的欄位列表 Keys: ["time", "detail"] # 定義輸出外掛程式 flushers: # 使用flusher_sls外掛程式輸出到指定Logstore。 - Type: flusher_sls # 需要確保該 Logstore 存在 Logstore: k8s-file # 需要確保 endpoint 正確 Endpoint: cn-beijing.log.aliyuncs.com Region: cn-beijing TelemetryType: logs
執行
kubectl apply -f example-k8s-file.yaml
,Logtail開始採集Pod中的文本日誌並發送到Log Service中。
您只需要建立AliyunLogConfig自訂資源即可建立Logtail採集配置,建立完成後自動生效。
對於通過自訂資源建立的Logtail採集配置,其修改只能通過更新相應的自訂資源來實現,在Log Service控制台上對Logtail採集配置的修改不會同步到自訂資源中。
在左側導覽列中,單擊叢集列表。
在叢集列表頁面中,單擊目的地組群操作列下的更多,然後單擊管理叢集。
建立名為example-k8s-file.yaml的檔案。
該YAML指令碼將建立名為
example-k8s-file
的Logtail採集配置,並對叢集內名稱開頭為app
的所有容器,以極簡文字模式採集/data/logs/app_1
路徑下的test.LOG
檔案內容,發送到名為k8s-log-<YOUR_CLUSTER_ID>
的Project中的名為k8s-file
(自動建立)的Logstore。您需根據實際情況修改樣本中容器內檔案路徑,更多詳情請參見容器檔案路徑映射。
logPath
:採集日誌路徑。樣本:/data/logs/app_1
。filePattern
:採集記錄檔名稱。樣本:test.LOG
。
有關YAML檔案中的logtailConfig項提供的Logtail的詳情,如支援的輸入,輸出,處理外掛程式類型與容器過濾方式等,請參見AliyunLogConfigDetail,完整的YAML參數詳情請參見CR參數說明。
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 # 設定Logtail採集配置。 logtailConfig: # 設定採集的資料來源類型。採集文本日誌時,需設定為file。 inputType: file # 設定Logtail採集配置的名稱,必須與metadata.name一致。 configName: example-k8s-file inputDetail: # 指定通過極簡模式採集文本日誌。 logType: common_reg_log # 設定記錄檔所在路徑。 logPath: /data/logs/app_1 # 設定記錄檔的名稱。支援萬用字元星號(*)和半形問號(?),例如log_*.log。 filePattern: test.LOG # 採集容器的文本日誌時,需設定dockerFile為true。 dockerFile: true # 開啟多行日誌採集 單行日誌採集刪除該配置 # 行首Regex,以該正則表示一行日誌的開始 logBeginRegex: \d+-\d+-\d+.* #設定容器過濾條件。 advanced: k8s: K8sPodRegex: '^(app.*)$'
執行
kubectl apply -f example-k8s-file.yaml
,Logtail開始採集Pod上的文本日誌,並發送到Log Service中。
此方式適合少量Logtail採集配置的建立和管理,無需登入Kubernetes叢集,操作步驟簡單但無法大量設定。
選擇Project列表中您在安裝Logtail組件時所使用的Project,如
k8s-log-<your_cluster_id>
。在Project頁面中單擊目標Logstore後,單擊Logstore下的Logtail配置,添加Logtail配置,並單擊Kubernetes-檔案的立即接入。在機器組配置頁面K8s情境的ACK Daemonset方式下勾選k8s-group-${your_k8s_cluster_id}機器組並單擊>添加到應用機器組,單擊下一步。
建立Logtail採集配置,按下文填寫必須配置後單擊下一步即可,Logtail採集配置生效大概需要1分鐘,請耐心等待。
此處僅介紹主要配置,詳細配置請參見Logtail採集配置。
全域配置
在全域配置中輸入配置名稱。
輸入配置
Logtail部署模式:選擇DaemonSet。
檔案路徑類型:選擇待採集的檔案路徑是容器內路徑或宿主機路徑。對於通過hostPath方式掛載資料卷的容器,如果您希望直接採集其在宿主機上映射的記錄檔,請選擇宿主機路徑,其餘情況請選擇容器內路徑。
檔案路徑:代表日誌採集的路徑,日誌路徑必須以正斜線(/)開頭,例如下圖
/data/wwwlogs/main/**/*.Log
表示/data/wwwlogs/main
目錄下尾碼名為.Log的檔案。如果需要設定日誌目錄被監控的最大深度,即檔案路徑中萬用字元**
匹配的最大目錄深度。可以修改最大目錄監控深度的取值,0代表只監控本層目錄。
建立索引和預覽資料:Log Service預設開啟全文索引,此時查詢會索引日誌中所有欄位。您也可以根據採集到的日誌,手動建立欄位索引,或者單擊自動產生索引,Log Service將產生欄位索引,通過此索引針對特定欄位進行精確查詢,從而減少索引費用並提高查詢效率。更多資訊請參見建立索引。
此方式僅支援單行文本,如果要配置多行文本或其他日誌格式,必須使用自訂資源方式或在Log Service控制台配置。
建立應用時配置Log Service。
通過容器控制台配置通過YAML模板登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面,單擊使用鏡像建立。
在應用基本資料頁簽,設定應用程式名稱,單擊下一步,進入容器配置頁面,設定鏡像名稱。
以下僅介紹Log Service相關的配置。關於其他的應用配置,請參見建立無狀態工作負載Deployment。
在日誌配置地區,配置日誌相關資訊。
設定採集配置。
單擊採集配置建立新的採集配置,每個採集配置由日誌庫和容器內日誌路徑兩項構成。
日誌庫:配置Logstore名稱,用於指定所採集的日誌儲存於該Logstore。如果該Logstore不存在,ACK將會自動為您在叢集關聯的Log ServiceProject下建立相應的Logstore。
新建立的Logstore中的日誌預設儲存時間為90天。
容器內日誌路徑:指定希望採集的日誌所在的路徑,例如使用/usr/local/tomcat/logs/catalina.*.log來採集Tomcat的文本日誌。
每一項採集配置都會被自動建立為對應Logstore的一個採集配置,預設採用極簡模式(按行)進行採集。
設定自訂Tag。
單擊自訂Tag建立新的自訂Tag,每一個自訂Tag都是一個索引值對,會拼接到所採集到的日誌中,您可以使用它來為容器的日誌資料進行標記,例如版本號碼。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面上方的命名空間下拉框中設定命名空間,然後單擊頁面右上方的使用YAML建立資源。
配置YAML檔案。
YAML模板的文法同Kubernetes文法,但是為了給容器指定採集配置,需要使用
env
來為容器增加採集配置和自訂Tag,並根據採集配置,建立對應的volumeMounts
和volumes
。以下是一個簡單的Pod樣本:apiVersion: v1 kind: Pod metadata: name: my-demo spec: containers: - name: my-demo-app image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest' env: # 配置環境變數 - name: aliyun_logs_log-varlog value: /var/log/*.log - name: aliyun_logs_mytag1_tags value: tag1=v1 # 配置volume mount volumeMounts: - name: volumn-sls-mydemo mountPath: /var/log # 如果Pod不斷重啟,啟動參數可以添加sleep command: ["sh", "-c"] # 使用 shell 來運行命令 args: ["sleep 3600"] # 設定休眠時間為 1 小時(3600 秒) volumes: - name: volumn-sls-mydemo emptyDir: {}
通過環境變數來建立您的採集配置和自訂Tag,所有與配置相關的環境變數都採用
aliyun_logs_
作為首碼。建立採集配置的規則如下:
- name: aliyun_logs_log-varlog value: /var/log/*.log
樣本中建立了一個採集配置,格式為
aliyun_logs_{key}
,對應的{key}
為log-varlog
。aliyun_logs_log-varlog
:該env表示建立一個Logstore
名為log-varlog
,日誌採集路徑為/var/log/*.log的配置,對應的Log Service採集配置名稱也是log-varlog
,目的是將容器的/var/log/*.log檔案內容採集到log-varlog
這個Logstore
中。
建立自訂Tag的規則如下:
- name: aliyun_logs_mytag1_tags value: tag1=v1
配置Tag後,當採集到該容器的日誌時,會自動附加對應的欄位到Log Service。其中
mytag1
為任意不包含'_'的名稱
。
如果您的採集配置中指定了非stdout的採集路徑,需要在此部分建立相應的
volumeMounts
。樣本中採集配置添加了對/var/log/*.log的採集,因此相應地添加了/var/log的
volumeMounts
。
當YAML編寫完成後,單擊建立,即可將相應的配置交由Kubernetes叢集執行。
配置環境變數的進階參數。
通過容器環境變數配置採集支援多種配置參數。您可以根據實際需求設定進階參數,以滿足日誌採集的特殊需求。
通過容器環境變數配置採集日誌的方式不適用於邊緣情境。
欄位
說明
樣本
注意事項
aliyun_logs_{key}
必選項。{key}只能包含小寫字母、數字和-。
若不存在aliyun_logs_{key}_logstore,則預設建立並採集到名為{key}的logstore。
當值為stdout時表示採集容器的標準輸出;其他值為容器內的日誌路徑。
-
- name: aliyun_logs_catalina value: stdout
-
- name: aliyun_logs_access-log value: /var/log/nginx/access.log
預設採集方式為極簡模式。如需解析日誌內容,建議使用Log Service控制台,或者CRD進行配置。
{key}表示Log Service中Logtail採集配置的名稱,需保持在K8s叢集內唯一。
aliyun_logs_{key}_tags
可選。值為{tag-key}={tag-value}類型,用於對日誌進行標識。
- name: aliyun_logs_catalina_tags value: app=catalina
不涉及。
aliyun_logs_{key}_project
可選。值為指定的Log ServiceProject。當不存在該環境變數時,為您安裝時所選的Project。
- name: aliyun_logs_catalina_project value: my-k8s-project
Project需與您的Logtail工作所在的Region一致。
aliyun_logs_{key}_logstore
可選。值為指定的Log ServiceLogstore。當不存在該環境變數時,Logstore和{key}一致。
- name: aliyun_logs_catalina_logstore value: my-logstore
不涉及。
aliyun_logs_{key}_shard
可選。值為建立Logstore時的shard數,取值範圍為[1 , 10]。當不存在該環境變數時,值為2。
若logstore已經存在,則該參數不生效。
- name: aliyun_logs_catalina_shard value: '4'
不涉及。
aliyun_logs_{key}_ttl
可選。值為指定的日誌儲存時間,取值範圍為[1 , 3650]。
當取值為3650時,指定日誌的儲存時間為永久儲存。
當不存在該環境變數時,預設指定日誌的儲存時間為90天。
若Logstore已經存在,則該參數不生效。
- name: aliyun_logs_catalina_ttl value: '3650'
不涉及。
aliyun_logs_{key}_machinegroup
可選。值為應用的機器組。當不存在該環境變數時與安裝Logtail的預設機器組一致。關於該參數的詳細使用方法,請參見下文的採集阿里雲ACK叢集文本日誌。
- name: aliyun_logs_catalina_machinegroup value: my-machine-group
不涉及。
aliyun_logs_{key}_logstoremode
可選。值為指定的Log ServiceLogstore的類型,不指定該參數的話,預設值為standard,取值:
若Logstore已經存在,則該參數不生效。
standard:支援Log Service一站式資料分析功能,適用於即時監控、互動式分析以及構建完整的可觀測性系統等情境。
query:支援高效能查詢,索引流量費用約為standard的一半,但不支援SQL分析,適用於資料量大、儲存周期長(周、月層級以上)、無日誌分析的情境。
-
- name: aliyun_logs_catalina_logstoremode value: standard
-
- name: aliyun_logs_catalina_logstoremode value: query
該參數需要logtail-ds鏡像版本>=1.3.1。
定製需求1:將多個應用資料擷取到同一Logstore
如果您需要將多個應用資料擷取到同一Logstore,可以設定 aliyun_logs_{key}_logstore參數,例如以下配置將2個應用的stdout採集到stdout-logstore中。
樣本中應用1的
{key}
為app1-stdout
,應用2的{key}
為app2-stdout
。應用1設定的環境變數為:
# 配置環境變數 - name: aliyun_logs_app1-stdout value: stdout - name: aliyun_logs_app1-stdout_logstore value: stdout-logstore
應用2設定的環境變數為:
# 配置環境變數 - name: aliyun_logs_app2-stdout value: stdout - name: aliyun_logs_app2-stdout_logstore value: stdout-logstore
定製需求2:將不同應用資料擷取到不同的Project
如果您需要將不同應用的資料擷取到多個Project中,您需要進行以下操作:
在每個Project中建立一個機器組,選擇自訂標識,標識名為
k8s-group-{cluster-id}
,其中{cluster-id}
為您的叢集ID,機器組名稱可以自訂配置。在每個應用的環境變數中配置project、logstore、machinegroup資訊,其中機器組名稱為您在上一步建立的機器組名稱。
如下樣本中應用1的
{key}
為app1-stdout
,應用2的{key}
為app2-stdout
。其中如果兩個應用在同一個K8s叢集中,對應的machinegroup可以使用同一個machinegroup。應用1設定的環境變數為:
# 配置環境變數 - name: aliyun_logs_app1-stdout value: stdout - name: aliyun_logs_app1-stdout_project value: app1-project - name: aliyun_logs_app1-stdout_logstore value: app1-logstore - name: aliyun_logs_app1-stdout_machinegroup value: app1-machine-group
應用2設定的環境變數為:
# 應用2 配置環境變數 - name: aliyun_logs_app2-stdout value: stdout - name: aliyun_logs_app2-stdout_project value: app2-project - name: aliyun_logs_app2-stdout_logstore value: app2-logstore - name: aliyun_logs_app2-stdout_machinegroup value: app1-machine-group
步驟三:查詢分析日誌
在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)。 |
相關文檔
當您完成日誌內容的採集後,您可以在Log Service中使用查詢與分析功能,來協助您瞭解日誌情況,請參考查詢與分析快速指引。
當您完成日誌內容的採集後,您可以在Log Service中使用可視化功能, 來協助您直觀地統計與瞭解日誌情況,請參考快速建立儀錶盤。
當您完成日誌內容的採集後,您可以在Log Service中使用警示功能, 來自動提醒您日誌中的異常情況,請參考快速設定日誌警示。
Log Service僅採集增量日誌,歷史記錄檔採集請參見匯入歷史記錄檔。
容器採集異常排查思路:
查看控制台是否有報錯資訊,具體操作,請參見如何查看Logtail採集錯誤資訊。
如果控制台無報錯資訊,排查機器組心跳、Logtail採集配置等內容。具體操作,請參見如何排查容器日誌採集異常。