前言
传统IDC的建设,需要投入大量的人力、物力和财力,而公有云几乎拥有一站式的建设、部署方案和完整的云生态,并且可以根据业务随时随地的弹性扩展,特别是一些中小型的公司,越来越多的选择将业务落地到公有云。而对于所有公司、所有业务来讲,日志是一个无法绕开的话题,如何建设一个稳健和高效的日志系统,是所有公司架构、运维人员都需要思考的一个问题。本文我们将介绍阿里云日志系统(以下简称SLS)以及信也科技海外业务场景实践。
SLS是什么
SLS是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升开发、运维、运营、安全等场景的数字化能力。
功能概览
SLS架构
SLS vs ELK
业务实践
海外业务SLS架构
应用日志
Kubernetes集群中以DaemonSet方式运行logtail-ds组件,应用只需要将Log输出模式调整为Console标准输出即可,logtail-ds组件自动采集数据并上报。
代码配置
实现原理
Logtail与Docker的Domain Socket进行通信,查询该Docker上运行的所有容器,并根据容器中的Label和环境变量定位需要被采集的容器。Logtail通过docker logs命令获取指定容器日志。Logtail在采集容器的标准输出时,会定期将采集的点位信息保存到checkpoint文件中。如果Logtail停止后再次启动,会从上一次保存的点位开始采集。
通过SLS Logstore控制台查询分析
系统组件日志
和应用日志一样,在集群中以DaemonSet方式运行logtail-ds组件,可通过CRD方式创建Logtail配置采集容器日志。目前使用这种方式的组件有Nginx-ingress和CoreDNS。
CRD配置(Nginx-ingress为例)
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
generation: 3
name: k8s-nginx-ingress
namespace: default
spec:
extenions: ""
lifeCycle: null
logstore: nginx-ingress
logtailConfig:
configName: k8s-nginx-ingress
inputDetail:
plugin:
inputs:
- detail:
IncludeLabel:
io.kubernetes.container.name: nginx-ingress-controller Stderr: false
Stdout: true
type: service_docker_stdout
processors:
- detail:
KeepSource: false
Keys:
- client_ip
- x_forward_for
- remote_user
- time
- method
- url
- version
- status
... ...
- request_length
- request_time
- proxy_upstream_name
- upstream_addr
- upstream_response_length
- upstream_response_time
- upstream_status
- req_id
- host
NoKeyError: true
NoMatchError: true
Regex: ^(\S+)\s-\s[([^]]+)]\s-\s(\S+)\s[(\S+)\s\S+\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s"([^"]*)"\s(\S+)\s(\S+)+\s[([^]]*)]\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s*(\S*).*
SourceKey: content
type: processor_regex
inputType: plugin
machineGroups: null
productCode: k8s-nginx-ingress
productLanguage: ""
project: ""
shardCount: null
status:
status: OK
statusCode: 200
实现原理
CRD的内部工作流程如下:
- 使用kubectl或其他工具应用AliyunLogConfig CRD。
- alibaba-log-controller监听到CRD配置更新。
- alibaba-log-controller根据CRD配置中的内容以及日志服务中Logtail配置的状态,自动向日志服务提交创建Logstore、创建Logtail配置以及应用机器组的请求。
- Logtail定期请求Logtail配置所在服务器,获取新的或已更新的Logtail配置并进行热加载。
- Logtail根据Logtail配置采集各个容器上的标准输出或文本日志。
Logtail将采集到的容器日志发送给日志服务。
通过SLS Logstore控制台查询分析
告警
告警系统整体架构
告警组
- 用户组;
- 值班组;
应急组。
关联表
在海外业务日志告警场景中,通过对接APPCenter、CAS、Kubernetes将站点和Owner等信息进行汇总并创建一个虚拟表最终上传至OSS,用户配置告警时增加固定关联SQL,将告警信息和人员关联并实现最终通知。
在查询SQL中进行关联
通知管理
通知(行动)管理系统负责管理告警的通知渠道和对象,由行动策略、内容模板、日历、用户、用户组、值班组和渠道额度等组成。通知(行动)管理系统通过行动策略将告警动态分派给特定的通知渠道,再通知给目标用户、用户组或值班组。
根据日历设置值班人员
告警示例
告警事务处理
企微告警内容中提供免登录处理方式,也可以通过控制台手动确认。
总结
SLS能有效降低运维维护和管理成本,运维人员无需额外关心日志系统的性能指标。Kubernetes Event持久化、RDS慢日志、阿里云成本分析等也都集成至SLS,对云产品也是一键式接入,极大的提高了运维工作效率。费用方面,SLS推出全新计费模式“按写入数据量计费”,目前海外业务SLS正在转换中,按照预估推测,转换后的SLS成本将降低30%左右。
作者介绍
矿泉,系统运维资深专家
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。