头图

前言

传统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的内部工作流程如下:

  1. 使用kubectl或其他工具应用AliyunLogConfig CRD。
  2. alibaba-log-controller监听到CRD配置更新。
  3. alibaba-log-controller根据CRD配置中的内容以及日志服务中Logtail配置的状态,自动向日志服务提交创建Logstore、创建Logtail配置以及应用机器组的请求。
  4. Logtail定期请求Logtail配置所在服务器,获取新的或已更新的Logtail配置并进行热加载。
  5. Logtail根据Logtail配置采集各个容器上的标准输出或文本日志。
  6. Logtail将采集到的容器日志发送给日志服务。

    通过SLS Logstore控制台查询分析

    告警

    告警系统整体架构

    告警组

  7. 用户组;
  8. 值班组;
  9. 应急组。

    关联表

    在海外业务日志告警场景中,通过对接APPCenter、CAS、Kubernetes将站点和Owner等信息进行汇总并创建一个虚拟表最终上传至OSS,用户配置告警时增加固定关联SQL,将告警信息和人员关联并实现最终通知。

在查询SQL中进行关联

通知管理

通知(行动)管理系统负责管理告警的通知渠道和对象,由行动策略、内容模板、日历、用户、用户组、值班组和渠道额度等组成。通知(行动)管理系统通过行动策略将告警动态分派给特定的通知渠道,再通知给目标用户、用户组或值班组。
根据日历设置值班人员

告警示例

告警事务处理

企微告警内容中提供免登录处理方式,也可以通过控制台手动确认。

总结

SLS能有效降低运维维护和管理成本,运维人员无需额外关心日志系统的性能指标。Kubernetes Event持久化、RDS慢日志、阿里云成本分析等也都集成至SLS,对云产品也是一键式接入,极大的提高了运维工作效率。费用方面,SLS推出全新计费模式“按写入数据量计费”,目前海外业务SLS正在转换中,按照预估推测,转换后的SLS成本将降低30%左右。

作者介绍

矿泉,系统运维资深专家


信也科技布道师
12 声望10 粉丝