kubernetes日志采集工具log-pilot使用

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: <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后就发送不出日志

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容