跳到主要内容

Linux 修行之路 · Blog

Linux修行之路 - 技术博客

分享Kubernetes、Linux、Python、网络安全等技术文章

文章数量169
技术分类9
查看分类
8

EFK Docker 版搭建

· 阅读需 3 分钟

测试环境EFK搭建

Elasticsearch

  • 在指定节点上安装ES
# 拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0

# 运行容器
docker run -d -e ES_JAVA_POTS="-Xms1024m -Xmx1024m" -e "discovery.type=single-node" \
-p 9200:9200 -p 9300:9300 \
-m 4096M \
--name es7.12.0 docker.elastic.co/elasticsearch/elasticsearch:7.12.0

# 验证
docker ps -a | grep ela
docker logs -f CONTAINER ID

# 访问http://localhost:9200/ ,出现如下信息说明ElasticSearch 启动成功

Kibana

  • 在指定节点上安装Kibana
# 拉取镜像
docker pull docker.elastic.co/kibana/kibana:7.12.0

# 运行容器
docker run --link CONTAINER ID:elasticsearch \
-p 5601:5601 \
-m 2048M \
-d --name kibana7.12.0 docker.elastic.co/kibana/kibana:7.12.0
  • 修改配置
# 这里启动不一样的是多了 --link 选项,作用是将两个容器关联到一起可以互相通信,因为kibana到时候需要从ElasticSearch中拿数据。当然也可以通过 --network 创建自己的局域网连接各个容器。

# 这里需要配置kibana.yml,不然kibana默认通过localhost是找不到ES的。

# 进入容器命令行模式
docker exec -it 8180d5fdcdcf /bin/bash

# 修改kibana.yml文件
vi config/kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ] # 修改为es地址
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN" # 修改为中文

# 重启kibana容器
docker restart xxxx

# 访问 http://localhost:5601/ 如果成功进入界面,就说明启动成功了。

FileBeat

  • k8s-node1、k8s-node2、k8s-node3都需要安装
# 拉取镜像
docker pull docker.elastic.co/beats/filebeat:7.12.0

# 运行容器
## 此处先不运行,先把下面一步的配置文件修改后再run
docker run -d -v /root/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml -v /data/logs/:/data/logs/ --name filebeat7.12.0 docker.elastic.co/beats/filebeat:7.12.0
  • 修改配置文件
#拉取完成之后,先不着急启动,在启动之前需要完成先建立一份映射的配置文件filebeat.docker.yml,选择目录创建filebeat.docker.yml
#=========================== Filebeat inputs ==============
filebeat.inputs:

- type: log

enabled: true
##配置你要收集的日志目录,可以配置多个目录
paths:
- /data/logs/*.log

##配置多行日志合并规则,已时间为准,一个时间发生的日志为一个事件
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after

#-------------------------- Kibana ---------

## 设置kibana的地址,开始filebeat的可视化
setup.kibana.host: "http://172.16.10.xxx:5601"
setup.dashboards.enabled: true

#-------------------------- Elasticsearch output ---------
output.elasticsearch:
hosts: ["http://172.16.10.xxx:9200"]
index: "filebeat-%{+yyyy.MM.dd}"

setup.template.name: "my-log"
setup.template.pattern: "my-log-*"
json.keys_under_root: false
json.overwrite_keys: true
##设置解析json格式日志的规则
processors:
- decode_json_fields:
fields: [""]
target: json

微信报警

· 阅读需 2 分钟

微信报警

启动容器

docker run -d -e"ELASTICSEARCH_HOST=192.168.2.101" -e"ELASTICSEARCH_PORT=30080INER_TIMEZONE=Asia/Shanghai" -e"TZ=Asia/Shanghai" --name ea anjia0532/elastalert-docker:v0.2.4

进入容器

docekr exec -it ea sh
cd rules

配置报警规则

配置规则文件

# vi app.yaml
name: test
type: frequency
index: logstash-*
num_events: 1
timeframe:
minutes: 1
filter:
- query:
query_string:
query: '"\[ERROR\]" NOT "发送邮件失败"'
alert:
- "elastalert_modules.wechat_qiye_alert.WeChatAlerter"
wechat_corp_id: ww9b9c823d77fe3
wechat_secret: fHI8_cNIrTiSfrN7DRfvW-G1mcVCDEOTpRzBcEA
wechat_agent_id: 1002
wechat_party_id: 1
alert_text_type: alert_text_only
alert_text: |
日志告警!
截止发邮件前匹配到的请求数:{}
截止发邮件前匹配到的次数:{}
时间: {}
内容: {}

alert_text_args:
- num_hits
- num_matches
- "@timestamp"
- message

index:要查询的索引的名称, ES中存在的索引。 num_events:此参数特定于frequency类型,并且是触发警报时的阈值。 filter:用于过滤结果的Elasticsearch过滤器列表,这里的规则定义是除了包含“发送邮件失败”的错误日志,其他所有ERROR的日志都会触发报警。 alert:定义报警方式,我们这里采用企业微信报警。 corp_id: 企业微信的接口认证信息

集成到pod中

apiVersion: apps/v1
kind: Deployment
metadata:
name: elastalert
namespace: monitoring
labels:
app: elastalert
spec:
selector:
matchLabels:
app: elastalert
template:
metadata:
labels:
app: elastalert
spec:
volumes:
- name: rule
hostPath:
path: /data/k8s/monitor/elastalert/applog.yaml
hostNetwork: true
containers:
- name: elastalert
image: anjia0532/elastalert-docker:v0.2.4
imagePullPolicy: IfNotPresent
volumeMounts:
- name: rule
mountPath: /opt/elastalert/rules/applog.yaml
env:
- name: TZ
value: Asia/Shanghai
- name: CONTAINER_TIMEZONE
value: Asia/Shanghai
- name: ELASTICSEARCH_HOST
value: '192.168.2.101'
- name: ELASTICSEARCH_PORT
value: '30080'

程序bug

rules.yaml的name值唯一的 如果程序重新加载了rules name值发生变化会报错 无法进行告警

ES 数据定期删除

· 阅读需 1 分钟

ES 数据定期删除

创建清理脚本

vim es-index-clear.sh

#/bin/bash
#只保留15天内的日志索引
LAST_DATA=`date -d "-15 days" "+%Y.%m.%d"`
#删除15天前的索引
curl -XDELETE 'http://ip:port/*-'${LAST_DATA}

添加定时任务

#编辑crontab文件,添加相应的任务
crontab -e

#设置每天的凌晨一点清除索引
0 1 * * * root sh /opt/elk/scripts/es-index-clear.sh