k8s使用filebeat和ELK收集存储集群日志
一、 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和日期查看日志。