ELK采集k8s日志总结(二) Kibana 和 Logstash 部署

kibana 部署

kibana 是一个可视化界面,方便管理es

#逐级创建目录
mkdir /data/es/kibana/config
mkdir /data/es/kibana/plugins
#给目录授权
cd /data/es
chmod 777 kibana
cd /data/es/kibana/config
#制作配置文件
vim kibana.yml 
复制代码
server.name: kibana
server.host: "0.0.0.0" 
elasticsearch.hosts: ["http://10.90.x.x:9200","http://10.90.x.x:9200","http://10.90.x.x:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"

# 启用安全认证后,需要添加如下配置
elasticsearch.username: "kibana"
elasticsearch.password: "之前为kibana帐户创建的密码"
复制代码

docker pull kibana:7.5.0

启动服务:

docker run -d --name kibana -p 5601:5601 -v /data/es/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml -v /data/es/kibana/plugins:/usr/share/kibana/plugins:rw --name kibana kibana:7.5.0

这样kibana就启动成功了,界面的具体使用就不介绍了,自己多摸索一下,下面补充一下常用的内容

命令行工具使用

# 节点如果有未分片的,可以通过这个命令找到,一般是网络问题导致分片失败并一直无法恢复。关闭分片再开启可以解决问题
GET /_cluster/allocation/explain

# 解决索引某个shard无法恢复的问题
POST /_cluster/reroute?retry_failed=true
复制代码

创建索引生命周期策略

直接通过页面填写表单即可,一般会创建删除策略,在模板配置的时候和策略关联上

索引模板使用

创建索引模板k8s-template,设置索引匹配模式

索引设置

{
  "index": {
    "lifecycle": {
      "name": "k8s-logs-delete-policy" // 关联生命周期策略
    },
    "refresh_interval": "30s",
    "number_of_shards": "1",
    "number_of_replicas": "1"
  }
}
复制代码

映射设置

{
  "dynamic_templates": [
    {
      "message_field": {
        "path_match": "message",
        "mapping": {
          "norms": false,
          "type": "text"
        },
        "match_mapping_type": "string"
      }
    },
    {
      "string_fields": {
        "mapping": {
          "norms": false,
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "match_mapping_type": "string",
        "match": "*"
      }
    }
  ],
  "properties": {
    "@timestamp": {
      "type": "date"
    },
    "geoip": {
      "dynamic": true,
      "properties": {
        "ip": {
          "type": "ip"
        },
        "latitude": {
          "type": "half_float"
        },
        "location": {
          "type": "geo_point"
        },
        "longitude": {
          "type": "half_float"
        }
      }
    },
    "@version": {
      "type": "keyword"
    }
  }
}
复制代码

如果需要使用生命周期,滚动策略要创建别名

logstash 部署

logstash用来接收日志数据,处理后推送到es中,下面来部署logstash

docker pull logstash:7.5.0

启动命令:

docker run -d -p 5044:5044 -p 9600:9600 -it -v /data/logstash/config/:/usr/share/logstash/config/ --name logstash logstash:7.5.0

创建目录:mkdir -p /data/logstash/config

创建文件,共创建4个文件,分别是logstash.yml,log4j2.properties,pipelines.yml,es.conf,之后启动服务

logstash 最核心的能力还是对采集到的日志做过滤。大致是这样一个效果,比如一条日志经过filter,被格式化成json数据,通过grok过滤器处理数据,配置如下

es.conf

input {
   beats {
       port => 5044
        codec => plain{
           charset=>"UTF-8"
       }
  }
}
filter {
  grok {
     match => [
       "message", "\s{0,5}%{TIMESTAMP_ISO8601:logTime}.{0,10}\|.*\|%{LOGLEVEL:logLevel}\|\s{0,3}%{GREEDYDATA:logMessage}",
       "message", "\s{0,3}%{TIMESTAMP_ISO8601:logTime}.\s{0,10}%{LOGLEVEL:logLevel}\s{0,10}%{GREEDYDATA:logMessage}"
     ]
     #用上面提取的message覆盖原message字段,正则表达式根据自己业务日志格式做相应调整
     #overwrite => ["message"]
 }
}
output {
   elasticsearch {
      action => "index"
      hosts  => ["10.90.x.x:9200","10.90.x.x:9200","10.90.x.x:9200"]
      index  => "k8s-%{index}-%{+YYYY.MM.dd}"   #使用log-pilot给的索引名+年月日
      codec => plain {
            format => "%{message}"
            charset => "UTF-8"
        }
      user => "elastic"
      password => "填入设置的密码"
    }
}
复制代码

log4j2.properties

logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug
复制代码

logstash.yml

http.host: "0.0.0.0"
http.port: 9600
xpack.monitoring.elasticsearch.hosts: ["http://10.90.x.x:9200","http://10.90.x.x:9200","http://10.90.x.x:9200"]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "填入设置的密码"
复制代码

pipelines.yml

- pipeline.id: my-logstash
  path.config"/usr/share/logstash/config/*.conf"
  pipeline.workers: 3
复制代码

部署完成后,访问地址验证:

10.90.xx.xx:9600

其它内容总结:

监控配置

#是否集群
xpack.monitoring.enabled: true
#初始用户,必须是这个
xpack.monitoring.elasticsearch.username: "logstash_system"
#密码,es中为logstash_system设置的密码
xpack.monitoring.elasticsearch.password: "填入设置的密码"
#es的集群x
xpack.monitoring.elasticsearch.hosts: ["http://10.90.x.x:9200","http://10.90.x.x:9200","http://10.90.x.x:9200"]
复制代码

配置和概念

会自动生成一个字段@timestamp,默认该字段存储的是Logstash收到消息/事件(event)的时间,也就是说这个字段不是日志产生的真实时间

@timestamp 这个字段是logstash解析出来的,当成字段存储在es中,这个也可以自定义匹配规则

文件布局规划: https://segmentfault.com/a/1190000015242897 在容器映射的时候可能会用到

每个 logstash 过滤插件,都会有四个方法叫 add_tag, remove_tag, add_field 和 remove_field。它们在插件过滤匹配成功时生效

前端可视化工具cerebro

这个也是一个管理es的工具,看个人使用习惯,可以作为备用组件

docker run -d -p 9000:9000 -v /data/cerebro/application.conf:/opt/cerebro/conf/application.conf --name es-cerebro lmenezes/cerebro:latest

分类:
后端
标签: