log-pilot介绍

github地址

log-pilot官方介绍

log-pilot镜像地址

log-pilot官方搭建

log-pilot解决问题:

  • 每个节点只要一个log收集POD

  • 能动态定制索引名称

  • 能收集容器里面的日志文件,不只是stdout

log-pilot安装

kubernetes1.15以上版本


apiVersion: apps/v1

kind: DaemonSet

metadata:

  name: log-pilot

  labels:

    app: log-pilot

  # 设置期望部署的namespace

  namespace: kube-system

spec:

  updateStrategy:

    type: RollingUpdate

  selector:

    matchLabels:

      app: log-pilot

  template:

    metadata:

      labels:

        app: log-pilot

      annotations:

        scheduler.alpha.kubernetes.io/critical-pod: ''

    spec:

      # 是否允许部署到Master节点上

      tolerations:

      - key: node-role.kubernetes.io/master

        effect: NoSchedule

      containers:

      - name: log-pilot

        # 版本请参考https://github.com/AliyunContainerService/log-pilot/releases

        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat

        resources:

          limits:

            memory: 500Mi

          requests:

            cpu: 200m

            memory: 200Mi

        env:

          - name: "NODE_NAME"

            valueFrom:

              fieldRef:

                fieldPath: spec.nodeName

          - name: "LOGGING_OUTPUT"

            value: "elasticsearch"

          # 请确保集群到ES网络可达

          - name: "ELASTICSEARCH_HOSTS"

            value: "10.10.203.152:9200"

          # 配置ES访问权限

          #- name: "ELASTICSEARCH_USER"

          # value: "{es_username}"

          #- name: "ELASTICSEARCH_PASSWORD"

          # value: "{es_password}"

        volumeMounts:

        - name: sock

          mountPath: /var/run/docker.sock

        - name: root

          mountPath: /host

          readOnly: true

        - name: varlib

          mountPath: /var/lib/filebeat

        - name: varlog

          mountPath: /var/log/filebeat

        - name: localtime

          mountPath: /etc/localtime

          readOnly: true

        livenessProbe:

          failureThreshold: 3

          exec:

            command:

            - /pilot/healthz

          initialDelaySeconds: 10

          periodSeconds: 10

          successThreshold: 1

          timeoutSeconds: 2

        securityContext:

          capabilities:

            add:

            - SYS_ADMIN

      terminationGracePeriodSeconds: 30

      volumes:

      - name: sock

        hostPath:

          path: /var/run/docker.sock

      - name: root

        hostPath:

          path: /

      - name: varlib

        hostPath:

          path: /var/lib/filebeat

          type: DirectoryOrCreate

      - name: varlog

        hostPath:

          path: /var/log/filebeat

          type: DirectoryOrCreate

      - name: localtime

        hostPath:

          path: /etc/localtime

说明 参数说明:

  • {es_endpoint}:ES 集群的访问地址。
  • 如果 Kubernetes 集群和部署的 ES 集群在同一个 VPC 下,则该地址为 ES 集群基本信息中的内网地址。
  • 如果 Kubernetes 集群和部署的 ES 集群在不同一个 VPC 下,则该地址为 ES 集群基本信息中的公网地址。

  • {es_port}:ES 集群的访问端口,一般是9200。

  • {es_username}:访问 ES 集群的用户名。默认用户名 elastic。

  • {es_password}:访问 ES 集群的用户密码。即为创建 ES 集群时,设置的用户密码。

日志收集

应用添加环境变量

官方tomcat实例


apiVersion: v1

kind: Pod

metadata:

  name: tomcat

spec:

  containers:

  - name: tomcat

    image: "tomcat:7.0"

    env:

    # 1、stdout为约定关键字,表示采集标准输出日志

    # 2、配置标准输出日志采集到ES的catalina索引下

    - name: aliyun_logs_catalina

      value: "stdout"

    # 1、配置采集容器内文件日志,支持通配符

    # 2、配置该日志采集到ES的access索引下

    - name: aliyun_logs_access

      value: "/usr/local/tomcat/logs/catalina.*.log"

    # 容器内文件日志路径需要配置emptyDir

    volumeMounts:

      - name: tomcat-log

        mountPath: /usr/local/tomcat/logs

  volumes:

    - name: tomcat-log

      emptyDir: {}

说明 在上面的编排中,通过在 Pod 中定义环境变量的方式,动态地生成日志采集配置文件,环境变量的具体说明如下:

  • aliyun_logs_catalina=stdout表示要收集容器的 stdout 日志。
  • aliyun_logs_access=/usr/local/tomcat/logs/catalina..log 表示要收集容器内 /usr/local/tomcat/logs/ 目录下所有名字匹配 catalina..log 的文件日志。

在本方案的 Elasticsearch 场景下,环境变量中的 name 表示 Index,本例中name即是 catalina 和 access 。

声明式日志配置

image.png

Log-Pilot 支持声明式日志配置,可以依据容器的 Label 或者 ENV 来动态地生成日志采集配置文件。这里重点说明两个变量:

  1. name:我们自定义的一个字符串,它在不同的场景下指代不同的含义。当我们将日志采集到 ElasticSearch 的时候, name 表示的是 Index;当我们将日志采集到 Kafka 的时候, name 表示的是 Topic;当我们将日志采集到阿里云日志服务的时候,name 表示的是 LogstoreName。
  2. path:它本身支持两种,一种是约定关键字 stdout,表示的是采集容器的标准输出日志,第二种是容器内部的具体文件日志路径,可以支持通配符的方式。比如我们要采集 tomcat 容器日志,那么我们通过配置标签 aliyun.logs.catalina=stdout 来采集 tomcat 标准输出日志,通过配置标签 aliyun.logs.access=/usr/local/tomcat/logs/*.log 来采集 tomcat 容器内部文件日志。

自定义tag

image.png

Log-Pilot 也支持自定义Tag,我们可以在容器的标签或者环境变量里配置 aliyun.logs.$name.tags: k=v,那么在采集日志的时候也会将k=v采集到容器的日志输出中。

比如我们有一种场景,有一个开发环境和测试环境,应用日志都会被采集到统一的一个日志存储后端,假设是一个 ElasticSearch 集群,但是我们在 ElasticSearch 中查询日志的时候又想区分出来,具体某条日志记录到底来源于生产环境,还是测试环境。

那么我们就可以通过给测试环境的容器打上 stage=dev 的 tag,给生产环境的容器打上 stage=pro的 tag,Log-Pilot 在采集容器日志的时候,同时会将这些 tag 随容器日志一同采集到日志存储后端中,那么当我们在查询日志的时候,就可以通过 stage=dev 或者 stage=pro 能明确地区分出某条日志是来源于生产环境的应用容器所产生,还是测试环境应用容器所产生的。另外通过自定义 tag 的方式我们还可以进行日志统计、日志路由和日志过滤。

支持自定义输出Target

image.png

这里假设一种场景,我们同时有一个生产环境和一个测试环境,应用日志都需要被采集到同一套 Kafka 中,然后由不同的 consumer 去消费。

但是我们同样希望区分出来,某条日志数据是由生产环境的应用容器产生的,还是测试环境的应用容器产生的,但我们在测试环境中的应用容器已经配置了 aliyun.logs.svc=stdout 标签,那么当这些应用容器的标准输出日志被采集到 kafka 中,它最终会被路由到 topic=svc 的消息队列中,那么订阅了 topic=svc 的 consumer 就能够接收测试环境的应用容器产生的日志。

但当我们将该应用发布到生产环境时,希望它产生的日志只能交由生产环境的 consumer 来接收处理,那么我们就可以通过 target 的方式,给生产环境的应用容器额外定义一个 target=pro-svc,那么生产环境的应用日志在被采集到 Kafka 中时,最终会被路由到 topic 为 pro-svc 的消息队列中,那么订阅了 topic =pro-svc 的 consumer 就可以正常地接收到来自于生产环境的容器产生的日志。

因此这里的 target 本身也有三种含义:

  • 当我们将日志对接到ElasticeSearch时,这个 target 字符串是 Index;
  • 当我们对接到Kafka时,它指代的是 topic;
  • 当我们将日志对接到日志服务时,它代表的是 Logstore Name。

支持多种日志解析格式

image.png

Log-Pilot 也支持多种日志解析格式,通过 aliyun.logs.$name.format: 标签就可以告诉 Log-Pilot 在采集日志的时候,同时以什么样的格式来解析日志记录。目前主要支持六种:

  1. none:默认格式,指不对日志记录做任何解析,整行采集出来直接输出到日志存储后端。
  2. json:Log-Pilot 在采集日志的时候同时会将每一行日志以 json 的方式进行解析,解析出多个 KV 对,然后输出到日志存储后端。
  3. csv:主要是针对csv格式的日志采集配置(需配置fluentd插件)。
  4. nginx:主要是针对Nginx的日志采集配置(需配置fluentd插件)。
  5. apache2:主要是针对Apache的日志采集配置(需配置fluentd插件)。
  6. regexp:用户可以通过 format 标签来自定义正则表达式,告诉 Log-Pilot 在解析日志记录的时候以什么样的拆分格式来进行解析拆分(需配置fluentd插件)。

支持多采集插件

image.png

目前 Log-Pilot 支持两种采集插件:一个是CNCF社区的Fluentd插件,一个是Elastic的Filebeat插件;其同时其支持对接多种存储后端,目前 Fluentd 和 Filebeat 都支持 Elasticsearch、Kafka、File、Console 作为日志存储后端,而 Fluentd 还支持 Graylog、阿里云日志服务 以及 Mongodb 作为存储后端。

使用注意事项

验证环境

kubernetes16.3

elk6.8.4

log-pilot0.9.6/0.9.7-filebeat

只有filebeat版本能用

其实是只有filebeat版本,加容器环境变量才能用。fluentd采集不到日志。

只有配置环境变量的方式才生效

用容器标签,日志根本没有方式出去

自定义tags不起作用

不管是标签还是环境变量,都不启作用,设置tags后就发送不出日志

文章来源于互联网,如有雷同请联系站长删除:kubernetes日志采集工具log-pilot使用

发表评论