iLogtail社区版使用入门 - K8s环境采集业务日志到SLS

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
日志服务 SLS,月写入数据量 50GB 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文介绍建立集中式日志采集分析系统的常用架构,并使用iLogtail社区版采集K8s环境业务日志到SLS,完成构建可观测平台的第一步。 iLogtail已经完整开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。

iLogtail是阿里云日志服务(SLS)团队自研的可观测数据采集Agent,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和容器的可观测性采集工作,在阿里巴巴集团的核心产品线,如淘宝、天猫、支付宝、菜鸟、高德地图等也是默认的日志、监控、Trace等多种可观测数据的采集工具。目前iLogtail已有千万级的安装量,每天采集数十PB的可观测数据,广泛应用于线上监控、问题分析/定位、运营分析、安全分析等多种场景,在实战中验证了其强大的性能和稳定性。

在当今云原生的时代,我们坚信开源才是iLogtail最优的发展策略,也是释放其最大价值的方法。因此,我们决定将iLogtail开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。

背景

日志作为可观测性建设中的重要一环,可以记录详细的访问请求以及错误信息,在业务分析、问题定位等方面往往会发挥很大的作用。一般开发场景下,当需要进行日志分析时,往往是直接在日志文件中进行grep搜索对应的关键字;但在大规模分布式生产环境下,此方法效率低下,常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集、管理、分析。目前市面上比较主流的开源方案是基于ELK构建一套日志采集分析系统。

该架构中,Filebeat作为日志源的采集Agent部署在业务集群上进行原始日志采集,并采集到的日志发送到消息队列Kafka集群。之后,由LogstashKafka消费数据,并经过过滤、处理后,将标准化后的日志写入Elasticsearch集群进行存储。最后,由Kibana呈现给用户查询。虽然该架构可以提供比较完整的日志采集、分析功能,但是整体涉及的组件非常多,大规模生产环境部署复杂度高,且大流量下ES可能不稳定,运维成本都会很高。

阿里云提供的SLS服务是一个纯定位在日志/时序类可观测数据分析场景的云上托管服务,相对于ELK在日志领域内做了很多定制化开发,在易用性、功能完备性、性能、成本等方便,都有不错表现。iLogtail作为SLS官方标配的可观测数据采集器,在日志采集性能K8s支持上都有不错的体验;iLogtail有明显的性能优势,可以将部分数据处理前置,有效降低存储成本。

目前社区版iLogtail也对SLS提供了很好的支持,本文将会详细介绍如何使用社区版iLogtail,并结合SLS云服务快速构建出一套高可用、高性能的日志采集分析系统。

备注:iLogtail社区版相对于iLogtail企业版,核心采集能力上基本是一致的,但是管控、可观测能力上会有所弱化,这些能力需要配合SLS服务端才能发挥出来。欢迎使用iLogtail企业版体验,两个版本差异详见链接

SLS简介

日志服务SLS是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升您在研发、运维、运营、安全等场景的数字化能力。

通过SLS可以快速的搭建属于自己的可观测分析平台,可以快速享受到SLS提供的各种数据服务,包括不限于:查询与分析、可视化、告警等。

  • 查询分析
  • 支持精确查询、模糊查询、全文查询、字段查询。
  • 以SQL作为查询和分析框架,同时在框架中融入PromQL语法和机器学习函数。

  • 可视化
  • 基于SLS统一的查询分析引擎,以图表的形式将查询与分析结果呈现出来,清晰呈现全局态势。
  • 支持与第三方可视化工具对接。

  • 监控告警:提供一站式的告警监控、降噪、事务管理、通知分派的智能运维平台。

操作实战

以下介绍如何使用iLogtail社区版采集K8s环境业务日志到SLS。

场景

选择Label为app: nginx的容器,采集标准输出流stdout(访问日志)、标准错误流stderr(错误日志),并将采集到的日志写入SLS中。选择container name为json-log的容器,采集json.log文本日志写入SLS。

其中,stdout使用正则解析将日志解析为结构化日志;stdin为单行文本打印;json.log为JSON格式文件。

如果之前已经使用iLogtail将日志采集到Kafka,在迁移阶段可以保持双写,等稳定后删除Kafka Flusher配置即可。



前提条件

  • K8s环境已部署nginx。
  • 使用官方镜像(https://hub.docker.com/_/nginx
  • 默认已将access.log和error.log重定向到标准输出和错误流
  • 创建Deployment时Pod层级配置了app: nginx的label
  • 使用默认日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

部署iLogtail

本章节所使用的配置可在GitHub下载,容器标准输出插件详细配置可移步iLogtail用户手册

  • 创建命名空间

推荐将iLogtail部署在独立的命名空间站以便管理。

ilogtail-ns.yaml

apiVersion: v1
kind: Namespace
metadata:  name: ilogtail
kubectl apply -f ilogtail-ns.yaml
  • 创建采集配置

ilogtail-user-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:  name: ilogtail-user-cm
  namespace: ilogtail
data:  nginx_stdout.yaml: |    enable: true    inputs:      - Type: service_docker_stdout        Stderr: false        Stdout: true        IncludeK8sLabel:          app: nginx    processors:      - Type: processor_regex        SourceKey: content        Regex: '([\d\.:]+) - (\S+) \[(\S+) \S+\] \"(\S+) (\S+) ([^\\"]+)\" (\d+) (\d+) \"([^\\"]*)\" \"([^\\"]*)\" \"([^\\"]*)\"'        Keys:          - remote_addr          - remote_user          - time_local          - method          - url          - protocol          - status          - body_bytes_sent          - http_referer          - http_user_agent          - http_x_forwarded_for    flushers:      - Type: flusher_sls        Endpoint: cn-hangzhou.log.aliyuncs.com        ProjectName: test-ilogtail        LogstoreName: access-log      - Type: flusher_kafka        Brokers:          - localhost:9092        Topic: access-log  nginx_stderr.yaml: |    enable: true    inputs:      - Type: service_docker_stdout        Stderr: true        Stdout: false        K8sNamespaceRegex: "^(default)$"        K8sPodRegex: "^(nginx-.*)$"        K8sContainerRegex: "nginx"    flushers:      - Type: flusher_sls        Endpoint: cn-hangzhou.log.aliyuncs.com        ProjectName: test-ilogtail        LogstoreName: error-log      - Type: flusher_kafka        Brokers:          - localhost:9092        Topic: error-log  json_log.yaml: |    enable: true    inputs:      - Type: file_log        LogPath: /root/log        FilePattern: "json.log"        DockerFile: true        DockerIncludeLabel:          io.kubernetes.container.name: json-log    processors:      - Type: processor_json        SourceKey: content        KeepSource: false        ExpandDepth: 1        ExpandConnector: ""    flushers:      - Type: flusher_sls        Endpoint: cn-hangzhou.log.aliyuncs.com        ProjectName: test-ilogtail        LogstoreName: json-log      - Type: flusher_kafka        Brokers:          - localhost:9092        Topic: json-log

将模版中的33-35、51-53、75-77行修改为实际SLS目标存储库,38、56、80行修改为实际Kafka broker地址。

kubectl apply -f ilogtail-user-configmap.yaml

这里的ConfigMap期望以文件夹的方式挂载到iLogtail容器中作为采集配置目录,因此可以包含多个iLogtail采集配置文件,第7-39行为一个采集配置,40-57为另一个采集配置,分别将nginx的标准输出流和标准错误流采集到SLS不同的logstoreKafka不同的Topic中。双写适用于从Kafka迁移到SLS的场景,如果迁移完成稳定后,可以删除flusher_kafka,只保留flusher_sls即可。

第13-14和46-48行展示了如何为日志采集筛选容器,前者使用Kubernetes Label作为筛选条件,后者则使用了Namespace、Pod和Container名称作筛选,所有支持的配置项可以参考iLogtail用户手册中的容器标准输出

第16-30行展示了如何使用插件对日志进行正则解析,配置项含义可以参考iLogtail用户手册中的正则

  • 获取阿里云AK,并创建密钥

ilogtail-secret.yaml

apiVersion: v1
kind: Secret
metadata:  name: ilogtail-secret
  namespace: ilogtail
type: Opaque
data:  access_key: <base64_access_key_secret>
  access_key_id: <base64_access_key_id>

获取阿里云AK,进行base64。

echo-n'<aliyun_access_key_secret>' | base64
echo-n'<aliyun_access_key_id>' | base64

在模版中修改8-9行。

kubectl apply -f ilogtail-secret.yaml
  • 部署iLogtail DaemonSet

ilogtail-deployment.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:  name: ilogtail-ds
  namespace: ilogtail
  labels:    k8s-app: logtail-ds
spec:  selector:    matchLabels:      k8s-app: logtail-ds
  template:    metadata:      labels:        k8s-app: logtail-ds
    spec:      tolerations:      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:      - name: logtail
        env:          - name: ALIYUN_LOG_ENV_TAGS # add log tags from env            value: _node_name_|_node_ip_
          - name: _node_name_
            valueFrom:              fieldRef:                apiVersion: v1
                fieldPath: spec.nodeName
          - name: _node_ip_
            valueFrom:              fieldRef:                apiVersion: v1
                fieldPath: status.hostIP
          - name: cpu_usage_limit
            value: "1"          - name: mem_usage_limit
            value: "512"          - name: default_access_key_id
            valueFrom:              secretKeyRef:                name: ilogtail-secret
                key: access_key_id
                optional: true          - name: default_access_key
            valueFrom:              secretKeyRef:                name: ilogtail-secret
                key: access_key
                optional: true        image: >-
          sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/ilogtail-community-edition/ilogtail:latest
        imagePullPolicy: IfNotPresent
        resources:          limits:            cpu: 1000m
            memory: 1Gi
          requests:            cpu: 400m
            memory: 384Mi
        volumeMounts:          - mountPath: /var/run
            name: run
          - mountPath: /logtail_host
            mountPropagation: HostToContainer
            name: root
            readOnly: true          - mountPath: /usr/local/ilogtail/checkpoint
            name: checkpoint
          - mountPath: /usr/local/ilogtail/user_yaml_config.d
            name: user-config
            readOnly: true      dnsPolicy: ClusterFirst
      hostNetwork: true      volumes:        - hostPath:            path: /var/run
            type: Directory
          name: run
        - hostPath:            path: /
            type: Directory
          name: root
        - hostPath:            path: /var/lib/ilogtail-ilogtail-ds/checkpoint
            type: DirectoryOrCreate
          name: checkpoint
        - configMap:            defaultMode: 420            name: ilogtail-user-cm
          name: user-config
kubectl apply -f ilogtail-deployment.yaml

配置文件的17-19行定义了部署节点的容忍性:不在master节点部署。

23-34行通过环境变量额外采集了iLogtail容器所在节点的ip和name(这两个值对于业务容器和iLogtail必然相同)。

35-38行通过容器环境变量对iLogtail进行了系统配置,这里配置了cpu和memory上限。完整的系统配置说明可以参考iLogtail用户手册中的系统参数

43-48行定义了采集Agent容器允许使用的资源范围。若需要采集的日志文件数量很多,则需要适当地放宽资源限制。

39-50行引用了secret中的AK作为环境变量,这对于将日志写入到SLS是必须的。

配置文件的62-72行挂载了一些目录,说明如下:

/var/run:iLogtail与容器运行时通信的socket

/logtail_host:iLogtail通过挂载主机目录获取节点上所有容器的日志

/usr/local/ilogtail/checkpoint:将状态持久化到主机磁盘,iLogtail容器重启不丢失

/usr/local/ilogtail/user_yaml_config.d:将configmap中的配置挂载到容器中

验证

  • 访问日志验证,查看logstore数据正常。

给nginx发送几条测试请求,如:

# 写入访问日志kubectl exec nginx-76d49876c7-r892w --curl localhost/hello/ilogtail

SLS控制台查询结果

  • 错误日志验证,查看logstore数据正常。

SLS控制台查询结果

  • JSON日志验证,查看logstore数据正常

SLS控制台查询结果

总结

以上,我们介绍了使用iLogtail社区版将K8s业务日志采集到SLS的方法。如果想体验企业版iLogtail与SLS更深度的集成能力,欢迎使用iLogtail企业版,并配合SLS构建可观测平台。

关于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

相关文章
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
136 3
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
46 3
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
158 9
|
3月前
|
消息中间件 Kubernetes API
在K8S中,如何收集k8s集群日志?
在K8S中,如何收集k8s集群日志?
|
2月前
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
309 0
|
3月前
|
JavaScript Serverless Linux
函数计算产品使用问题之遇到Node.js环境下的请求日志没有正常输出时,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
消息中间件 Kubernetes Kafka
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
|
3月前
|
Kubernetes Shell 网络安全
【Azure K8S】记录AKS VMSS实例日志收集方式
【Azure K8S】记录AKS VMSS实例日志收集方式
|
3月前
|
存储 Prometheus Kubernetes
在K8S中,如何收集K8S日志?有哪些方案?
在K8S中,如何收集K8S日志?有哪些方案?
下一篇
无影云桌面