阿里云日志服务SLS支持通过Sidecar模式采集ECI日志。本文介绍如何部署Sidecar容器,以及创建Logtail配置,实现容器日志的采集。
前提条件
背景信息
阿里云日志服务SLS支持在ECI中通过Sidecar模式采集日志,即在每个ECI实例中,除业务容器外,运行一个Sidecar容器作为日志Agent,用于采集业务容器产生的日志。
Sidecar模式基于Logtail实现,Logtail必须和业务容器共享日志目录,业务容器将日志写入到共享目录中,Logtail通过监控共享目录中日志文件的变化并采集日志。
采集的日志可以分为以下两种:
-
标准输出
采集标准输出依赖于ECI的stdlog卷。创建Pod时可以将该卷挂载到Sidecar容器上,Sidecar可以直接以文件的方式访问ECI基础组件收集的标准输出日志。
-
文本文件
采集文本文件可以通过Pod内共享的Volume实现。Pod内同一个Volume可以挂载到多个容器,Sidecar可以直接收集业务容器输出到对应Volume内的文本文件。
步骤一:部署Sidecar容器
-
创建一个包含Sidecar容器的Deployment。
YAML内容示例如下,请根据实际情况将占位符变量替换为实际值。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-log-sidecar-demo name: nginx-log-sidecar-demo spec: replicas: 2 selector: matchLabels: app: nginx-log-sidecar-demo template: metadata: labels: app: nginx-log-sidecar-demo spec: containers: - name: nginx-log-demo image: registry-vpc.${RegionId}.aliyuncs.com/log-service/docker-log-test:latest command: - /bin/mock_log args: - '--log-type=nginx' - '--stdout=false' - '--stderr=true' - '--path=/var/log/nginx/access.log' - '--total-count=100000000' - '--logs-per-sec=100' imagePullPolicy: Always volumeMounts: - mountPath: /var/log/nginx name: nginx-log - name: logtail image: registry-vpc.${RegionId}.aliyuncs.com/log-service/logtail:latest env: - name: ALIYUN_LOGTAIL_USER_ID value: "${Aliuid}" - name: ALIYUN_LOGTAIL_USER_DEFINED_ID value: nginx-log-sidecar - name: ALIYUN_LOGTAIL_CONFIG value: /etc/ilogtail/conf/${RegionId}/ilogtail_config.json - name: aliyun_logs_machinegroup value: k8s-group-app-alpine imagePullPolicy: Always volumeMounts: - mountPath: /var/log/nginx name: nginx-log - mountPath: /stdlog name: stdlog volumes: - emptyDir: {} #文本文件日志存储到emptyDir卷 name: nginx-log - name: stdlog #标准输出日志存储到stdlog卷 flexVolume: driver: alicloud/pod-stdlog -
获取Pod信息。
kubectl get pods -l app=nginx-log-sidecar-demo预期返回结果如下:
NAME READY STATUS RESTARTS AGE nginx-log-sidecar-demo-84587d9796-krn5z 2/2 Running 0 32m nginx-log-sidecar-demo-84587d9796-vhnld 2/2 Running 0 32m -
查看日志。
-
通过kubectl命令查看日志
$ kubectl exec -it nginx-log-sidecar-demo-66d79c46dd-j2t4d -c logtail -- bash [root@nginx-log-sidecar-demo-66d79c46dd-j2t4d /]# ls /stdlog logtail nginx-log-demo [root@nginx-log-sidecar-demo-66d79c46dd-j2t4d /]# tail /stdlog/nginx-log-demo/0.log -n 5 2023-01-06T13:40:18.436783876+08:00 stdout F Fri Jan 6 05:40:18 UTC 2023 2023-01-06T13:40:19.437407161+08:00 stdout F hello world 2023-01-06T13:40:19.437880607+08:00 stdout F Fri Jan 6 05:40:19 UTC 2023 2023-01-06T13:40:20.439006882+08:00 stdout F hello world 2023-01-06T13:40:20.439023118+08:00 stdout F Fri Jan 6 05:40:20 UTC 2023 -
通过弹性容器实例控制台查看日志
单击日志页签,在容器名称下拉框中选择nginx-log-demo,可看到容器每秒循环输出
hello world及对应时间戳,表明 Sidecar 容器日志采集正常。
-
步骤二:配置Logtail采集日志
部署Sidecar容器后,需要在日志服务控制台创建Logtail配置来采集日志。
-
登录日志服务控制台。
-
在控制台右侧单击快速接入数据卡片,然后在接入数据页面,单击正则 - 文本日志 。
-
选择日志空间,然后单击下一步。
请选择Project和Logstore。如果没有,也可直接单击立即创建进行创建。
说明系统默认会为每个K8s集群生成一个名为
k8s-log-{K8s集群ID}的Project。 -
完成机器组配置,然后单击下一步。
-
使用场景:选择K8s场景。
-
部署方式:选择Sidecar。
-
选择机器组:在源机器组区域选择目标机器组,将该机器组移动到应用机器组区域。如果没有机器组,请单击创建机器组。
-
-
完成Logtail配置,然后单击下一步。
Logtail支持通过极简单行、正则解析、分隔符解析、JSON解析等模式采集文本日志。更多信息,请参见持续采集主机文本日志。
以下为配置示例:
-
标准输出示例
采集标准输出时,日志路径为stdlog卷在容器的挂载路径。示例参数配置如下:
配置区域
参数
示例
全局配置
配置名称
stdout
输入配置
Logtail部署模式
文本日志采集
文件路径
/stdlog/**/*.log
处理配置
处理模式
无
说明如需添加处理插件,请参见数据采集时处理(处理插件)。
-
文本文件示例
采集文本文件时,日志路径为共享Volume在容器的挂载路径。示例参数配置如下:
配置区域
参数
示例
全局配置
配置名称
file
输入配置
Logtail部署模式
文本日志采集
文件路径
/var/log/nginx/**/*.log
处理配置
处理模式
无
说明如需添加处理插件,请参见数据采集时处理(处理插件)。
-
-
查询分析配置。
默认已设置索引,您也可以根据业务需求,重新设置索引。具体操作,请参见配置索引。
-
查看采集的ECI日志。
完成上述配置后,日志服务SLS即可开始采集ECI日志。以下为标准输出日志采集到SLS日志库的效果示例。
日志条目显示容器
nginx-log-sidecar-demo的采集结果,日志路径包括/var/log/nginx/test.log和/stdlog/nginx-log-demo/0.log,content 字段内容为hello sls、hello world等,标签__tag__:__user_defined_id__值为nginx-log-sidecar,共采集到 5,376 条日志。