K8s场景下Logtail组件可观测方案升级-Logtail事件监控发布
简介: SLS针对Logtail本身以及Logtail的管控组件alibaba-log-controller,采用K8s事件的方式,将处理流程中的关键事件透出,从而让用户能够更清楚的感知其中发生的异常。
背景
随着K8s和云的普及,越来越多的公司将业务系统部署到云上,并且使用K8s来部署应用。Logtail是SLS提供的日志采集Agent,能够非常好的适应K8s下各种场景的日志采集,支持通过DaemonSet方式和Sidecar方式采集Kubernetes集群的容器标准输出或者文件日志。Logtail作为一个K8s场景下非常重要一个组件,其自身运行状态需要有更好的可观测方案。
K8s中Logtail管控原理
K8s场景下,除了控制台管控之外,Logtail还提供了环境变量和CRD两种配置方式,用来配置容器日志采集。
环境变量方式
环境变量的配置方式,参考文档
环境变量方式管控原理:
- Logtail会去扫描所有的容器信息,并获取容器中的环境变量信息
- 过滤其中包含aliyun_logs_前缀的字段,然后组合成采集配置信息,Logtail同时会用改环境变量作为采集配置中容器过滤的条件
- Logtail端收到采集配置的变化后,会调整本地的采集配置,从而实现整个控制流程的闭环。
CRD方式


CRD方式创建采集配置流程,参考文档。
CRD配置原理如上图所示:
- K8S内部会注册自定义资源(CRD,CustomResourceDefinition)AliyunLogConfig,并部署alibaba-log-controller
- CR对象创建/变化/删除之后,alibaba-log-controller会监听到CR对象的变化,从而对CR对象中指定的logstore、采集配置进行相应的操作
- Logtail端收到采集配置的变化后,会调整本地的采集配置,从而实现整个控制流程的闭环。
无论是环境变量的配置方式,还是CRD的配置方式,Logtail的状态都是比较难观测的。
- 环境变量配置之后,无论配置的是否正确,都不会影响业务容器的正常运行。但是logtail是否读到了环境变量里的配置并且进行了正确的处理,这个用户只能看到最终的结果。如果配置错了,用户也不能拿到及时的反馈,只能看到SLS控制台上,logstore没有创建出来或者采集配置没有创建出来,中间到底哪一个步骤报错了,用户也无法感知。
- 一个CR配置之后,从K8s的角度来看,只能看到CR对象创建成功了。但是CRD对象创建成功之后,alibaba-log-controller内的处理流程,对于用户来讲,就像黑盒一样。如果出现异常,用户并不清楚究竟是中间哪一步出了问题。
基于以上的问题,SLS针对Logtail本身以及Logtail的管控组件alibaba-log-controller,采用K8s事件的方式,将处理流程中的关键事件透出,从而让用户能够更清楚的感知其中发生的异常。
Logtail事件监控实战
限制说明
- alibaba-log-controller版本大于等于0.3.2
- logtail版本大于等于1.1.2
- logtail中目前涵盖的事件
- 创建project、创建logstore、创建采集配置
- alibaba-log-controller中涵盖的事件
- 创建project、创建logstore、创建采集配置、创建索引、创建ingress日志中心、checkpoint写入
开启Logtail事件监控
未开启过K8s事件中心
步骤一:创建K8s事件中心
- 登录日志服务控制台。

- 在日志应用区域的云产品Lens页签中,单击K8s事件中心。
- 在事件中心管理页面,单击添加。
- 在添加事件中心页面,配置相关参数。
- 如果选择已有Project,则从Project下拉框中选择已创建的Project,用于管理K8s事件中心相关资源(Logstore、仪表盘等)。
- 如果选择从容器服务选择K8s集群,则从K8s集群下拉框中选择已创建的K8s集群。通过此方式创建K8s事件中心,日志服务默认创建一个名为k8s-log-{cluster-id}的Project,用于管理K8s事件中心相关资源(Logstore、仪表盘等)。

- 单击下一步。

步骤二:部署eventer和node-problem-detector
您需要在Kubernetes集群中配置eventer和node-problem-detector后才能正常使用K8s事件中心。
- 阿里云Kubernetes配置方式阿里云Kubernetes应用市场中的ack-node-problem-detector已集成eventer和node-problem-detector功能,您只需要部署该组件即可,该组件详细部署请参见事件监控。
- 登录容器服务控制台。
- 在左侧导航栏中,选择运维管理 > 组件管理,日志与监控下,单击ack-node-problem-detector。

- 单击安装、确认。

- 自建Kubernetes配置方式
- 部署eventer。更多信息,请参见采集Kubernetes事件。
- 部署node-problem-detector。更多信息,请参见Github。
已开启过K8s事件中心
由于Logtail事件监控依赖了比较新的索引,因此可以在K8s事件中心页面,点击版本升级的选项,里面有一个索引更新的按钮,点击之后,即可以开启新的索引字段。

Logtail事件监控大盘

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 |
采集配置详情 |
应用案例
场景1: 通过CRD配置,logstore数量超过quota限制
一个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,从而解决这个问题

场景2: 通过CRD配置,关键参数填写错误
一个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转换之后的采集配置数据。

场景3: 通过环境变量和CRD方式针对同一个Project/Logstore采集配置进行变更,导致的配置冲突
在多人维护一个K8s集群的时候,有可能两个人针对同一份采集配置,通过不同的配置方式进行了修改,这样的问题排查起来往往很麻烦。
我们模拟这样一个场景:
- 部署一个测试的Pod,环境变量配置如下:


可以看到logstore和采集配置已经创建成功
- CRD配置如下:
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

关于iLogtail
iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。
GitHub:https://github.com/alibaba/ilogtail
社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme
企业版官网:https://help.aliyun.com/document_detail/65018.html
哔哩哔哩:阿里云SLS
知乎:阿里云日志服务

K8s场景下Logtail组件可观测方案升级-Logtail事件监控发布的更多相关文章
- 超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
作者 | 张晓宇(衷源) 阿里云容器平台技术专家 关注『阿里巴巴云原生』公众号,回复关键词"1010",可获取本文 PPT. 导读:资源利用率一直是很多平台管理和研发人员关心的话 ...
- 难道主键除了自增就是GUID?支持k8s等分布式场景下的id生成器了解下
背景 主键(Primary Key),用于唯一标识表中的每一条数据.所以,一个合格的主键的最基本要求应该是唯一性. 那怎么保证唯一呢?相信绝大部分开发者在刚入行的时候选择的都是数据库的自增id,因为这 ...
- 浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
- 【Vue】浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
- Serverless 如何应对 K8s 在离线场景下的资源供给诉求
本文整理自腾讯云云原生产品团队的专家产品经理韩沛在 Techo 开发者大会云原生专题的分享内容--Kubernetes 混部与弹性容器.本次分享主要分为三部分:基于 K8s 的应用混部.提升应用混部效 ...
- 不同场景下 MySQL 的迁移方案
一 目录 一 目录 二 为什么要迁移 三 MySQL 迁移方案概览 四 MySQL 迁移实战 4.1 场景一 一主一从结构迁移从库 4.2 场景二 一主一从结构迁移指定库 4.3 场景三 一主一从结构 ...
- C++高并发场景下读多写少的优化方案
概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读 ...
- MySQL金融应用场景下跨数据中心的MGR架构方案(2)
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 如何在多个数据中心部署多套MGR集群,并实现故障快速切换. 上篇文章介绍了如何在多数据中心部署多套MGR集群,并构建集群间 ...
- MySQL金融应用场景下跨数据中心的MGR架构方案(1)
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0. 内容提纲 运行环境 部署MGR A&B 部署MGR A.B之间的复制通道 几个注意事项 如何在多个数据中心部 ...
- API 管理在云原生场景下的机遇与挑战
作者 | 张添翼 来源 | 尔达Erda公众号 云原生下的机遇和挑战 标准和生态的意义 自从 Kubernetes v1.0 于 2015 年 7 月 21 日发布,CNCF 组织随后建立以来,其 ...
随机推荐
- NVIDIA Jestson TX2 配置cuda以及cudnn的坑 ( JetPack-L4T 、Error: downloading update lock、TX2,TX1,TK1相关资源信息)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Performance Improvements in .NET 8 & 7 & 6 -- Thread【翻译】
线程 .NET 的最近版本在线程.并行.并发和异步等方面做出了巨大的改进,例如 ThreadPool 的完全重写(在 .NET 6 和 .NET 7 中),异步方法基础设施的完全重写(在 .NET C ...
- 检验实时3D像素流送平台好坏的七个标准!(下)
上篇文章我们介绍了<检验实时3D像素流送平台质量的七个标准>中的前四个标准,本文我们将继续给您介绍检验像素流送平台质量的其他三个标准. 您的平台是通过云还是仅通过渲染的图像传输数据? 您的 ...
- ts-对象数组reduce-数组转对象数组
将字符串数组转化成{name:xxx,count:xxx}[]数组的代码 #定义数据类型 interface CartInfo{ name:string, count:number } let raw ...
- springboot 在 yaml 文件中读取 pom 文件的 properties
如果没有其他配置,只能读取 yaml 文件所在模块下 和 父级模块的 pom 的 properties,以下是配置: <properties> <revision>1.0< ...
- 安全测试系列:《web安全深度剖析》读书笔记
一 基础 1.http请求流程: 请求.响应报文格式: 8种请求方式,get(长度有限制).head(用于测试资源是否存在,服务器不返回消息主体).post(传输大量数据).put(给服务器上传资源) ...
- LOTO任意波形发生器SIG82模拟输出继电器吸合断开的信号波形用于算法调试
LOTO任意波形发生器SIG82模拟输出继电器吸合断开的信号波形用于算法调试 继电器吸合的电流变化过程是如图这样的波形,0到2的时间大约为17毫秒,2到3的时间大约38毫秒. 批量继电器产品吸合是否满 ...
- APReLU:跨界应用,用于机器故障检测的自适应ReLU | IEEE TIE 2020
论文的工作属于深度学习在工业界的应用,借鉴计算机视觉的解决方法,针对机器故障检测的场景提出自适应的APReLU,对故障检测的准确率有很大的提升.论文整体思想应该也可以应用于计算机视觉,代码也开源了,大 ...
- ET介绍——C#更好的协程
更好的协程 上文讲了一串回调就是协程,显然这样写代码,增加逻辑,插入逻辑非常容易出错.我们需要利用异步语法把这个异步回调的形式改成同步的形式,幸好C#已经帮我们设计好了,看代码 // example2 ...
- 【LGR-069】洛谷 2 月月赛 II & EE Round 2
目录 前言 洛谷 6101 [EER2]出言不逊 分析 代码 洛谷 6102 [EER2]谔运算 分析 代码 洛谷 6103 [EER2] 直接自然溢出啥事没有 分析 代码 洛谷 6105 [Ynoi ...