k8s使用filebeat和ELK收集存储日志

k8s使用filebeat和ELK收集存储集群日志

    • 一、 filebeat
        • 1.filebeat的configmap介绍
        • 2.k8s配置介绍
    • 二、 logstash
        • 1.配置pipeline
        • 2. 配置my.config
    • 三、elasticsearch
        • 1.配置
        • 3.设置用户名密码
    • 四、kibana
        • 1. 配置
        • 2.查看日志
        • 1.查看索引
        • 2.建立Index patterns
        • 3.查看日志

一、 filebeat

先放yaml配置文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: k8s-logs-filebeat-config
  namespace: my-namespace
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container
      enabled: true
      symlinks: true
      paths:
        - /var/log/containers/mylog-*.log
    multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}'
    multiline.negate: true
    multiline.match: after
    multiline.timeout: 10s
    processors:
      - drop_fields:
          fields: ["host", "ecs", "log", "agent", "input"]
          ignore_missing: false
    output.logstash:
      hosts: ["192.168.1.2:5044"]
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: k8s-logs
  namespace: my-namespace
spec:
  selector:
    matchLabels:
      project: k8s
      app: filebeat
  template:
    metadata:
      labels:
        project: k8s
        app: filebeat
    spec:
      containers:
      - name: filebeat
        imagePullPolicy: IfNotPresent
        image: elastic/filebeat:7.13.4
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: filebeat-config
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml
        - name: k8s-docker
          mountPath:  /var/lib/docker/containers
          readOnly: true
        - name: k8s-pods
          mountPath: /var/log/pods
          readOnly: true
        - name: k8s-logs
          mountPath: /var/log/containers
          readOnly: true
      volumes:
      - name: k8s-docker
        hostPath:
          path:  /var/lib/docker/containers
      - name: k8s-pods
        hostPath:
          path: /var/log/pods
      - name: k8s-logs
        hostPath:
          path: /var/log/containers
      - name: filebeat-config
        configMap:
          name: k8s-logs-filebeat-config
1.filebeat的configmap介绍
  • 由于/var/log/containers里面的文件都是软链接,所以需要filebeat.inputs定义symlinks: true。
  • filebeat.inputs中的paths是收集mylog开头的日志,这个可以根据实际情况配置
  • multiline的配置是把原来每行一个json对象合并成一个错误一个json对象,multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}'可以匹配每个错误开头的日期时间格式。例如:2021-08-02 20:30:30.451这样的。
  • processors配置了丢弃"host", “ecs”, “log”, “agent”, "input"这些字段。
  • output.logstash配置logstash的ip和端口。这样日志在处理后就可以发给logstash。
2.k8s配置介绍
  • DaemonSet
    DaemonSet可以让pod在每个node上都保留一个,当node增加或减少时k8s可以自动配置。
  • 使用root运行
    filebeat默认不是root用户运行的,这里需要增加配置
securityContext:
  runAsUser: 0
  • configmap的加载
    先在开头定义名为k8s-logs-filebeat-config的configmap,然后通过volumeMounts挂载为/etc/filebeat.yml,"-c", "/etc/filebeat.yml"加载配置文件
  • log文件的加载
    /var/log/containers里面的日志文件链接/var/log/pods文件夹,/var/log/pods文件夹里的配置文件链接/var/lib/docker/containers,所以我们需要挂载三个文件夹。

二、 logstash

1.配置pipeline
- pipeline.id: mypipeline
  pipeline.workers: 8
  pipeline.batch.size: 1000
  path.config: "/home/elk/app/logstash-7.13.4/config/my.config"

创建pipeline。workers线程数,batch.size一次处理事件数按照实际情况配置。pipeline的配置文件使用my.config。

2. 配置my.config
input {
  beats {
    codec => json
    ssl => false
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:datetime}\|%{WORD:loglevel}\|%{IPORHOST:ipaddress}\|%{DATA:appname}\|%{NUMBER:pid}\|%{DATA:method}\|%{GREEDYDATA:loginfo}" }
  }
  mutate {
    remove_field => ["message", "stream", "tags", "@timestamp", "time", "@version", "path", "host"]
  }
  #all
  if "_grokparsefailure" in [tags] {
    drop {}
  }
  date {
    match => [ "datetime", "ISO8601" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["http://192.168.1.2:9200"]
    index => "%{[appname]}-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "mypassword"
  }
}
  • input 配置beat输入,格式是json,监听端口5044
  • grok过滤器
    使用grok解析日志内容,logback的日志配置是
<conversionRule conversionWord="ip" converterClass="com.enjoy.common.log.LogIpConfig" />
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="myapp"/>
<property name="ELK_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%ip|${appName}|${PID:- }|%class:%method|%msg%n" />

所以对应使用"%{TIMESTAMP_ISO8601:datetime}|%{WORD:loglevel}|%{IPORHOST:ipaddress}|%{DATA:appname}|%{NUMBER:pid}|%{DATA:method}|%{GREEDYDATA:loginfo}"来解析。这样可以把日志内容解析为json。

  • mutate过滤器
    删除了多余的字段, “message”, “stream”, “tags”, “@timestamp”, “time”, “@version”, “path”, “host”,这些字段在filebeat中无法删除,需要在logstash中删除。
  • 无法解析json的日志抛弃
    if “_grokparsefailure” in [tags] {
    drop {}
    }
  • date 过滤器
    取日志中的datetime字段重新生成@timestamp,这样可以在后面定义索引。
  • output输出到elasticsearch,索引格式"%{[appname]}-%{+YYYY.MM.dd}"。其中%{+YYYY.MM.dd}是@timestamp的日期。这样可以在elasticsearch按照应用名称和日期来建立索引。

三、elasticsearch

1.配置
node.name: elk-1
network.host: 192.168.1.2
http.port: 9200
discovery.seed_hosts: ["192.168.1.2"]
cluster.initial_master_nodes: ["elk-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

配置一个带用户名密码的简单的单节点的elasticsearch。

3.设置用户名密码

elasticsearch-setup-passwords interactive

四、kibana

1. 配置
server.port: 7788
server.host: "192.168.1.2"
elasticsearch.hosts: ["http://192.168.1.2:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "mypassword"
2.查看日志
1.查看索引

左侧菜单->Stack Management->Index Management。日志会通过Logstash收集之后会建立对应的索引。

2.建立Index patterns

Index Management的下面选择Index patterns。然后选择Create index pattern,Index pattern name输入索引的通配符。本例使用appname开头的,这样可以模糊搜索应用下所有日期的日志,然后查询条件选择@timestamp,根据日期搜索。

3.查看日志

左侧菜单->Discover。根据appname和日期查看日志。

你可能感兴趣的:(持续集成,kubernetes,filebeat,logstash,elasticsearch,kibana)