Filebeat 监控 K8s 日志

前置条件
[root@k8s-master ~]# mkdir -p /home/elk/images
[root@k8s-master ~]# mkdir -p /home/elk/config
[root@k8s-master ~]# mkdir -p /home/elk/elk_data
下载 kibana插件 logtrail

Kibana要求插件版本与Kibana版本完全匹配。如果您找不到Kibana版本的logtrail插件版本,请按照此处的说明更新logtrail插件存档中的Kibana版本。

[root@k8s-master images]# wget https://github.com/sivasamyk/logtrail/releases/download/v0.1.31/logtrail-6.7.0-0.1.31.zip

kibana插件安装官方教程

elk-docker插件安装官方教程

扩展 ELK镜像 编写Dockerfile
[root@k8s-master ~]#
[root@k8s-master images]# cat > Dockerfile << eric
# 使用elk套件镜像 https://hub.docker.com/r/sebp/elk
FROM sebp/elk:670
# 添加kibana的sivasamyk/logtrail 插件
ADD ./logtrail-6.7.0-0.1.31.zip /opt/kibana/plugin/logtrail-6.7.0-0.1.31.zip
# 指定 kibana工作目录
WORKDIR \${KIBANA_HOME}
# 在容器内部为kibana安装插件
RUN gosu kibana bin/kibana-plugin install file:///opt/kibana/plugin/logtrail-6.7.0-0.1.31.zip
eric

[root@k8s-master images]#
构建 ELK镜像
[root@k8s-master images]# pwd
/home/elk/images
[root@k8s-master images]# ll
-rw-r--r--. 1 root root     469 7月   1 10:20 Dockerfile
-rw-r--r--. 1 root root 3878447 4月  28 13:45 logtrail-6.7.0-0.1.31.zip
[root@k8s-master images]#
[root@k8s-master images]# docker build -t k8s.dev-share.top/elk:v1.0 .


配置 logtrail的配置文件 logtrail.json
[root@k8s-master config]# pwd
/home/elk/config
[root@k8s-master config]# cat > logtrail.json << eric
{
    "version": 2,
    "index_patterns": [{
        "es": {
            "default_index": "st-*",
            "allow_url_parameter": false,
            "timezone": "UTC"
        },
        "tail_interval_in_seconds": 10,
        "es_index_time_offset_in_seconds": 0,
        "display_timezone": "local",
        "display_timestamp_format": "YYYY年MM月DD日 HH:mm:ss",
        "max_buckets": 500,
        "nested_objects": false,
        "default_time_range_in_days": 0,
        "max_hosts": 100,
        "max_events_to_keep_in_viewer": 5000,
        "default_search": "",
        "fields": {
            "mapping": {
                "timestamp": "@timestamp",
                "hostname": "hostname",
                "program": "tags",
                "message": "log"
            },
            "message_format": "{{{log}}}",
            "keyword_suffix": "keyword"
        }
    }, {
        "es": {
            "default_index": "uat-*",
            "allow_url_parameter": false,
            "timezone": "UTC"
        },
        "tail_interval_in_seconds": 10,
        "es_index_time_offset_in_seconds": 0,
        "display_timezone": "local",
        "display_timestamp_format": "YYYY年MM月DD日 HH:mm:ss",
        "max_buckets": 500,
        "nested_objects": false,
        "default_time_range_in_days": 0,
        "max_hosts": 100,
        "max_events_to_keep_in_viewer": 5000,
        "default_search": "",
        "fields": {
            "mapping": {
                "timestamp": "@timestamp",
                "hostname": "kubernetes.pod.name",
                "program": "tags",
                "message": "message"
            },
            "message_format": "{{{message}}}",
            "keyword_suffix": "keyword"
        }
    }]
}
eric

[root@k8s-master config]#
02-beats-input.conf Logstash从redis拉取日志数据的配置文件
[root@k8s-master config]# cat > 02-beats-input.conf << eric
# Beats -> Logstash -> Elasticsearch pipeline.
input {
  redis {
        host => "Redis 的IP地址"
        port => "6379"
        password => "Redis 的密码"
        key => "Redis 的key"
        data_type => "list"
        db => "Redis select 4"
    }
}
eric

[root@k8s-master config]#
30-output.conf Logstash向elasticsearch推送日志数据的配置文件
[root@k8s-master config]# cat > 30-output.conf << eric
filter {
    grok {
        match => { "log" => "%{LOGLEVEL:level}" }
    }

    if [level] == "DEBUG" {
        drop {}
    }

    if [level] == "WARN" {
        drop {}
    }
}

output {
    elasticsearch {
        hosts => ["192.168.180.6:9200"]
        index => "eric-%{tags}-%{+YYYY.MM.dd}"
    }
}
eric

[root@k8s-master config]#
查看所有创建好的 文件
[root@k8s-master config]# ll
total 12
-rw-r--r-- 1 root root  259 Jul  1 15:42 02-beats-input.conf
-rw-r--r-- 1 root root  219 Jul  1 15:42 30-output.conf
-rw-r--r-- 1 root root 1177 Jul  1 15:42 logtrail.json
[root@k8s-master config]#
使用docker-compose 部署镜像
[root@k8s-master elk]# pwd
/home/elk
[root@k8s-master elk]# cat > docker-compose.yml << eric
version: '2'
services:
  elk:
    image: k8s.dev-share.top/elk:v1.0
    build: images
    ports:
    - "5601:5601"
    - "9200:9200"
    - "5044:5044"
    volumes:
    # ES的日志记录文件目录
    - ./elk_data:/var/lib/elasticsearch
    # 修改logstash从redis拉取日志数据的配置文件
    - ./config/02-beats-input.conf:/etc/logstash/conf.d/02-beats-input.conf
    # 修改logtrail向elasticsearch推送日志数据的配置文件
    - ./config/30-output.conf:/etc/logstash/conf.d/30-output.conf
    # 修改logtrail插件配置文件
    - ./config/logtrail.json:/opt/kibana/plugins/logtrail/logtrail.json
    environment:
    - ES_MIN_MEM=512m
    # 官方要求最大内存不能小于 3GB, 这里加到 4GB防止因内存不足程序宕掉
    - ES_MAX_MEM=4096m
eric

[root@k8s-master elk]#
部署
[root@k8s-master elk]# ll
total 16
drwxr-xr-x 2 root root 4096 Jul  1 15:42 config
-rw-r--r-- 1 root root  681 Jul  1 15:44 docker-compose.yml
drwxr-xr-x 2 root root 4096 Jul  1 14:57 elk_data
drwxr-xr-x 2 root root 4096 Jul  1 15:13 images
[root@k8s-master elk]#
[root@k8s-master elk]# docker-compose up -d
Creating network "elk_default" with the default driver
Creating elk_elk_1 ... done
[root@k8s-master elk]#


logtrail.json 配置文件详解

这个配置文件会接收两种数据:
第一种是由 docker-compose 启动的项目返回的数据
第二种是同 k8s 启动的项目返回的数据

{
    "version": 2,
    "index_patterns": [{
        // 处理从 docker-compose 启动的项目抓取的日志数据
        "es": {
            "default_index": "st-*",
            "allow_url_parameter": false,
            "timezone": "UTC"
        },
        "tail_interval_in_seconds": 10,
        "es_index_time_offset_in_seconds": 0,
        "display_timezone": "local",
        "display_timestamp_format": "YYYY年MM月DD日 HH:mm:ss",
        "max_buckets": 500,
        "nested_objects": false,
        "default_time_range_in_days": 0,
        "max_hosts": 100,
        "max_events_to_keep_in_viewer": 5000,
        "default_search": "",
        "fields": {
            // mapping的key是logtrail控制台显示的属性,mapping的value是对应kibana的属性
            // 这个映射的意思就是,告诉logtrail我们要把kibana的哪些日志拿来展示
            // 这个配置展示的最终的结果是
            // 2019年07月01日 14:11:11 ["ST-k8s-master"]:  2019-07-01 14:11:07.664  INFO ......
            // mapping控制的是消息的前半部分  :  message_format控制的是消息的后半部分
            "mapping": {
                "timestamp": "@timestamp",
                "hostname": "hostname", // hostname 是指Dokcer容器的hostname因为每个容器都必须有一个唯一的hostname,所以我们获取 kibana属性的hostname,就是获取所有容器的hostname,这样即使扩展很多个Dokcer容器,我们抓取的日志都不会被影响
                "program": "tags", // tags 是kibana的属性
                "message": "log"
            },
            // logtrail 日志的格式
            "message_format": "{{{log}}}",
            "keyword_suffix": "keyword"
        }
    }, {
        // 处理从 k8s 启动的项目抓取的日志数据
        "es": {
            "default_index": "uat-*",
            "allow_url_parameter": false,
            "timezone": "UTC"
        },
        "tail_interval_in_seconds": 10,
        "es_index_time_offset_in_seconds": 0,
        "display_timezone": "local",
        "display_timestamp_format": "YYYY年MM月DD日 HH:mm:ss",
        "max_buckets": 500,
        "nested_objects": false,
        "default_time_range_in_days": 0,
        "max_hosts": 100,
        "max_events_to_keep_in_viewer": 5000,
        "default_search": "",
        "fields": {
            "mapping": {
                "timestamp": "@timestamp",
                "hostname": "kubernetes.pod.name",
                "program": "tags",
                "message": "message"
            },
            "message_format": "{{{message}}}",
            "keyword_suffix": "keyword"
        }
    }]
}
30-output.conf Logstash配置文件详解
filter {
    grok {
        // "log" 是filebeat消息体中的一个key,它对应的value就是我们抓取的日志
        // %{} 作用的是在字符串里面写变量
        // LOGLEVEL:level 目前还不清楚
        // 这段代码的作用是: 获取filebeat消息中我们抓取的日志,在使用箭头函数的方式对这个日志进行处理
        match => { "log" => "%{LOGLEVEL:level}" }
    }
    // [level] 它是match里面处理后返回的变量; 这个变量也可以在 output模块里面使用
    if [level] == "DEBUG" {
        drop {}
    }

    if [level] == "WARN" {
        drop {}
    }
}

output {
    elasticsearch {
        hosts => ["192.168.180.6:9200"]
        // %{tags} 是filebeat消息体中的一个key, 这里将tags的值做为我们的索引值,使用这种方试来实现动态索引
        index => "eric-%{tags}-%{+YYYY.MM.dd}"
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注