阿里云日志服務SLS(Log Service)是針對日志數據的一站式服務,讓您無需開發就能快捷完成日志數據采集、消費、投遞以及查詢分析等功能。ACK Serverless集群提供了日志服務托管功能。本文介紹如何在ACK Serverless集群中配置CRD并進行應用日志采集管理。
前提條件
已創建ACK Serverless集群。具體操作,請參見創建集群。
已安裝ACK Virtual Node組件,且版本≥2.7.0。關于ACK Virtual Node的更多信息,請參見ACK Virtual Node。
注意事項
通過SLS CRD開啟日志采集僅對后續創建的ECI Pod生效。如果想要采集存量Pod的日志,需要對存量Pod進行一次滾動發布。
配置日志采集
在集群內部署alibaba-log-controller組件后,您可以通過日志采集配置CRD(AliyunLogConfig CRD)來配置日志采集。
部署alibaba-log-controller組件
登錄容器服務管理控制臺。
在集群頁面,單擊目標集群名稱,進入集群管理頁面。
在集群中部署alibaba-log-controller組件。
在集群管理頁左側導航欄,選擇運維管理>組件管理。
單擊日志與監控頁簽,找到alibaba-log-controller卡片,然后單擊安裝。
在彈出的對話框中,單擊確定。
安裝完成后,alibaba-log-controller卡片右上角會顯示已安裝。
創建Logtail采集配置
連接ACK Serverless集群。
編寫日志采集配置CRD的YAML配置文件。
重要創建日志采集配置CRD后,您可以在日志服務控制臺查看生成的日志庫及logtail配置。通過CRD方式創建的配置,在控制臺上對其修改不會同步到CRD中。如果后續需要更新配置,請直接修改CRD資源,不要在控制臺操作,避免導致配置不一致。
apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: name: simple-stdout-example spec: project: k8s-my-project logstore: k8s-stdout logstoreMode: standard shardCount: 2 lifeCycle: 90 logtailConfig: inputType: plugin configName: simple-stdout-example inputDetail: ...
基本參數
參數
類型
是否必填
說明
project
string
否
Project名稱。默認為安裝Logtail組件時設置的Project。
如果要新建Project,可自定義輸入名稱,如果不存在該Project,系統會自動新建。
logstore
string
是
Logstore名稱。如果您所指定的Logstore不存在,系統會自動創建。
logstoreMode
string
否
Logstore類型。該參數值僅在新建Logstore時生效。取值范圍:
query:查詢型Logstore。
standard:標準型Logstore。
更多信息,請參見管理Logstore。
shardCount
int
否
Shard數量。默認值為2,取值范圍為1~10。
lifeCycle
int
否
Logstore中數據的存儲時間。默認值為90,取值范圍為1~3650。其中,3650天為永久存儲。該參數值僅在新建Logstore時生效。
machineGroups
array
否
機器組。安裝Logtail組件時,日志服務會自動創建名為
k8s-group-${your_k8s_cluster_id}
的機器組。logtailConfig
object
是
Logtail配置。包含以下參數:
configName:Logtail配置的名稱。必須與metadata.name相同。
inputType:日志輸入的方式。可選值如下:
plugin:通過Logtail插件采集MySQL Binlog等日志。
file:通過固定模式(正則模式、分隔符模式等)采集文本文件中的日志。
inputDetail:日志輸入的相關配置。
outputType:日志輸出的方式,只支持LogService,即只支持將數據上傳到日志服務。
outputDetail:日志輸出的相關配置。
logSample:日志樣例。
詳細的參數說明請參見Logtail配置。
容器過濾
Logtail 1.0.34以下版本,只支持通過環境變量、容器Label進行容器過濾。
Kubernetes中的命名空間名和容器名會映射到容器Label中,分別為
io.kubernetes.pod.namespace
和io.kubernetes.container.name
。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變量的黑白名單進行容器過濾。Logtail 1.0.34及以上版本,可以使用Kubernetes層級的信息(Pod名稱、Namespace、容器名稱、容器Label等)進行容器過濾。
容器過濾參數請配置在logtailConfig>inputDetail>advanced>k8s字段下。支持的參數如下:
IncludeK8sLabel:Kubernetes Label白名單,用于指定待采集的容器。
ExcludeK8sLabel:Kubernetes Label黑名單,用于排除不采集的容器。
K8sNamespaceRegex:指定Namespace。
K8sPodRegex:指定Pod名稱。
K8sContainerRegex:指定容器名稱。
更多信息,請參見通過DaemonSet方式采集Kubernetes容器文本日志和通過DaemonSet方式采集Kubernetes容器標準輸出。
文本日志CRD YAML示例
將以下內容保存為log-file.yaml。
apiVersion: log.alibabacloud.com/v1alpha1 # 使用默認值,無需修改。 kind: AliyunLogConfig # 使用默認值,無需修改。 metadata: name: test-file # 資源名,在當前Kubernetes集群內唯一。 spec: project: k8s-log-c326bc86**** # 可選配置,Project名稱,如果不存在該Project,系統會自動新建 logstore: test-file # 必選配置,Logstore名稱,如果不存在該Logstore,系統會自動創建 logtailConfig: # Logtail配置 inputType: file # 采集的數據源類型,file表示文本日志,plugin表示標準輸出 configName: test-file # Logtail配置的名稱,必須與資源名(metadata.name)相同 inputDetail: # Logtail配置的詳細信息 logType: common_reg_log # 通過極簡模式采集文本日志 logPath: /log/ # 日志文件所在路徑 filePattern: "*.log" # 日志文件的名稱,支持通配符星號(*)和半角問號(?),例如log_*.log。 dockerFile: true # 采集容器內的文件,dockerFile設置為true advanced: # 設置容器過濾條件 k8s: K8sNamespaceRegex: ^(default)$ K8sPodRegex: '^(eci-sls-demo.*)$'
標準輸出CRD YAML示例
將以下內容保存為log-stdout.yaml。
apiVersion: log.alibabacloud.com/v1alpha1 # 使用默認值,無需修改。 kind: AliyunLogConfig # 使用默認值,無需修改。 metadata: name: test-stdout # 資源名,在當前Kubernetes集群內唯一。 spec: project: k8s-log-c326bc86**** # 可選配置,Project名稱,如果不存在該Project,系統會自動新建 logstore: test-stdout # 必選配置,Logstore名稱,如果不存在該Logstore,系統會自動創建 shardCount: 2 # 可選配置,Shard數量,默認為2,取值范圍為1~10 lifeCycle: 90 # 可選配置,Logstore中日志保留時間,單位為天,該參數值僅在新建Logstore時生效。默認為90,取值范圍為1~3650。3650表示永久保留 logtailConfig: # Logtail配置 inputType: plugin # 采集的數據源類型,file表示文本日志,plugin表示標準輸出 configName: test-stdout # Logtail配置的名稱,必須與資源名(metadata.name)相同 inputDetail: # Logtail配置的詳細信息 plugin: inputs: - type: service_docker_stdout detail: Stdout: true Stderr: true # IncludeEnv: # aliyun_logs_test-stdout: "stdout"
創建日志采集配置CRD。
命令示例如下。Logtail配置生效后,Logtail開始采集各個容器上的標準輸出或文本日志,并發送到日志服務中。
kubectl apply -f log-file.yaml kubectl apply -f log-stdout.yaml
重要采集到日志后,您需要先創建索引,才能在Logstore中查詢和分析日志。具體操作,請參見創建索引。
測試日志采集
創建日志采集配置CRD后,日志服務會自動采集后續創建的Pod的日志。您可以創建以下應用來測試日志采集效果。
創建應用。
以Deployment為例,YAML內容示例如下,示例中容器啟動后會執行相關命令,不斷打印標準輸出和日志文件。
apiVersion: apps/v1 kind: Deployment metadata: name: eci-sls-demo labels: app: sls spec: replicas: 1 selector: matchLabels: app: sls template: metadata: name: sls-test labels: app: sls alibabacloud.com/eci: "true" spec: containers: - args: - -c - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;done command: - /bin/sh image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/busybox:1.30 imagePullPolicy: Always name: busybox
將以上YAML保存為test-sls-crd.yaml,執行以下命令創建應用。
kubectl create -f test-sls-crd.yaml
確認應用狀態。
kubetcl get pod
預期返回:
NAME READY STATUS RESTARTS AGE eci-sls-demo-7bf8849b9f-cgpbn 1/1 Running 0 2m14s
查看日志。
登錄日志服務控制臺。
單擊目標Project名稱。
找到目標日志庫,單擊日志庫名稱查看日志。
文本日志
標準輸出
關閉日志采集
創建日志采集配置CRD后,系統會自動采集所有符合條件的Pod的日志。對于一些不想要采集日志的Pod,您可以配置Annotation(k8s.aliyun.com/eci-sls-enable: "false"
)來關閉日志采集,避免系統自動創建Logtail而造成資源浪費。
Annotation請添加在Pod的metadata下,例如:創建Deployment時,Annotation需添加在spec>template>metadata下。
僅支持在創建ECI Pod時添加ECI相關Annotation來生效ECI功能,更新ECI Pod時添加或者修改ECI相關Annotation均不會生效。
配置示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-sls-demo2
labels:
app: sls
spec:
replicas: 1
selector:
matchLabels:
app: sls
template:
metadata:
name: sls-test
labels:
app: sls
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-sls-enable: "false" #關閉日志采集
spec:
containers:
- args:
- -c
- mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;
done
command:
- /bin/sh
image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
imagePullPolicy: Always
name: busybox