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

作者: 肖金光xjg | 来源:发表于2020-01-08 14:05 被阅读0次

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

    相关文章

      网友评论

        本文标题:kubernetes日志采集工具log-pilot使用

        本文链接:https://www.haomeiwen.com/subject/sfnjactx.html