随着K8s和云的普及,越来越多的公司将业务系统部署到云上,并且使用K8s来部署应用。Logtail是SLS提供的日志采集Agent,能够非常好的适应K8s下各种场景的日志采集,支持通过DaemonSet方式和Sidecar方式采集Kubernetes集群的容器标准输出或者文件日志。Logtail作为一个K8s场景下非常重要一个组件,其自身运行状态需要有更好的可观测方案。
K8s场景下,除了控制台管控之外,Logtail还提供了环境变量和CRD两种配置方式,用来配置容器日志采集。
环境变量的配置方式,参考文档
环境变量方式管控原理:
CRD方式创建采集配置流程,参考文档。
CRD配置原理如上图所示:
无论是环境变量的配置方式,还是CRD的配置方式,Logtail的状态都是比较难观测的。
基于以上的问题,SLS针对Logtail本身以及Logtail的管控组件alibaba-log-controller,采用K8s事件的方式,将处理流程中的关键事件透出,从而让用户能够更清楚的感知其中发生的异常。
您需要在Kubernetes集群中配置eventer和node-problem-detector后才能正常使用K8s事件中心。
由于Logtail事件监控依赖了比较新的索引,因此可以在K8s事件中心页面,点击版本升级的选项,里面有一个索引更新的按钮,点击之后,即可以开启新的索引字段。
Logtail事件监控大盘将各个步骤的结果完整展示出来,并且以时间轴的方式,展示各个事件的先后顺序,同时支持用Project、Logstore、采集配置名参数进行过滤。
针对异常的事件,Logtail事件监控大盘会把异常事件的详情展示出来:
详情字段 | 含义 |
time | 事件发生的时间 |
source | 事件来源,主要有alibaba-log-controller和logtail |
resourceName | 主要针对CRD场景下,CRD的名字 |
configName | 采集配置的名字 |
project | 采集配置所属的project |
logstore | 采集配置所属的logstore |
reason | 事件产生的原因 |
message | 事件的详细信息 |
errorCode | 异常步骤的错误码 |
errorMessage | 异常步骤的报错信息 |
requestId | 异常步骤的请求标识 |
针对采集配置的创建、变更、删除操作,Logtail事件监控提供了相关的记录,用于进行操作审计
详情字段 | 含义 |
time | 事件发生的时间 |
source | 事件来源,主要有alibaba-log-controller和logtail |
action | 创建、变更或者删除 |
level | normal或者warning |
configName | 采集配置的名字 |
project | 采集配置所属的project |
logstore | 采集配置所属的logstore |
logtailconfig | 采集配置详情 |
一个CRD配置如下:
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: simple-index-crd-example-0909-no-1
spec:
logstore: logstore-quota-test-0909-no-1
logtailConfig:
inputType: plugin
configName: simple-index-crd-example-0909-no-1
inputDetail:
plugin:
inputs:
-
type: service_docker_stdout
detail:
Stdout: true
Stderr: true
IncludeEnv:
collect_crd_index_out: true
apply之后发现CRD已经创建成功,但是logstore没有创建出来。
通过限制Project、Logstore和采集配置名的条件
打开异常事件详情列表,可以清楚看到创建logstore步骤的异常情况,错误码是ProjectQuotaExceed,报错详情是:project k8s-log-c4551a67027d248bfb049765de783e647, shard count quota exceed。由此,可以直接找到SLS值班的同学,提升quota,从而解决这个问题
一个CRD配置如下:
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: simple-index-crd-example-0909-mock-4
spec:
logstore: logstore-quota-test-0909-mock-4
logtailConfig:
inputType: pluginss
configName: simple-index-crd-example-0909-mock-4
inputDetail:
plugin:
inputs:
-
type: service_docker_stdout
detail:
Stdout: true
Stderr: true
IncludeEnv:
collect_crd_index_out: true
apply之后发现CRD已经创建成功,但是logstore和采集配置也都是没有创建出来。
通过限制Project、Logstore和采集配置名的条件
打开异常事件详情列表,可以清楚看到创建采集配置步骤的异常情况,错误信息里提示:invalid input type : pluginss
由此可以知道原来是CRD里inputType字段的取值有问题,通过采集配置事件详情列表里的记录,也可以清楚看到通过CRD转换之后的采集配置数据。
在多人维护一个K8s集群的时候,有可能两个人针对同一份采集配置,通过不同的配置方式进行了修改,这样的问题排查起来往往很麻烦。
我们模拟这样一个场景:
可以看到logstore和采集配置已经创建成功
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: taiye-test-0707
spec:
logstore: taiye-test-0707
logtailConfig:
inputType: plugin
configName: taiye-test-0707
inputDetail:
plugin:
inputs:
-
type: service_docker_stdout
detail:
Stdout: true
Stderr: true
IncludeEnv:
conflict-test: true
apply之后发现CRD已经创建成功,采集配置也被覆盖掉了。
通过Logtail事件大盘里的事件时间轴,我们可以清楚的看到两次配置变更操作,一次是通过Logtail产生的,一次是通过alibaba-log-controller产生的。
通过事件详情,我们也可以看到两次变更的配置参数是不一样的,有了这样的监控数据,能够知道什么时间的配置变更导致了冲突。
K8s event在K8s中默认只保留一小时,在进行命令行操作的时候,可以通过kubectl命令直接查看实时的事件
kubectl get event -A
这样可以得到当前集群中实时的事件列表,如果想查看事件的详细信息,可以使用如下命令,输出json格式的事件,里面包含了详细的信息
kubectl get events -o json
原文链接
本文为阿里云原创内容,未经允许不得转载