k8s中部署elartstart监控ES集群并发送报警
首先感谢ivankrizsan/elastalert:latest作者镜像,我在此基础上添加dingding报警模块(镜像里有,不过不是我们需要的方式报警,帮定制了下
dingding插件以下地址下载,并安装好相应模块编译好添加到elastalert镜像中/opt/elastalert目录中即可
https://github.com/xuyaoqiang/elastalert-dingtalk-plugin
原作者的钉钉插件中报警有一个小问题就是发出的钉钉报警多出两个空行,稍加改动去了这多余的空行,看着比较舒服点。
最后写一个rules的配置文件,这里是测试nginx访问一个不存在的接口看是否会触发报警
这里注意下:如果想让configmap热更 新的话,elastelart就不能支持了,因为它会检查rule name是否有一样的,我一开始就是用目录挂载的形式,它会在/opt/rules目录下新建一个隐藏文件,一个是以日期为隐藏的文件,一个是以..data开头的文件,然后你实际的文件名是软链到../data这个文件,程序就以为是有多个同名的rules 名称,就报错了。只能用我写的k8s文件中的形式部署了。
要想让configmap热更新,就必须挂载目录的形式,像subPath这样的形式是不会热更新的,只能重启pod才会更新的。用命令deploy/traefik-ingress-controller -n kube-system #重启指定pod
文件代码在最下面
最终报警截图
elastalert.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: elastalert
namespace: kube-system
labels:
app: elastalert
spec:
replicas: 1
selector:
matchLabels:
app: elastalert
template:
metadata:
labels:
app: elastalert
spec:
containers:
- name: elastalert
image: elastalert:v4
env:- name: ELASTICSEARCH_HOST
value: "elasticsearch" - name: ELASTICSEARCH_PORT
value: "9200" - name: CONTAINER_TIMEZONE
value: "Asia/Shanghai" - name: SET_CONTAINER_TIMEZONE
value: "true" - name: TZ
value: "Asia/Shanghai"
volumeMounts:- name: nginx
mountPath: /opt/rules/nginx.yaml
subPath: nginx.yaml
volumes:
- name: nginx
- name: ELASTICSEARCH_HOST
- name: nginx
configMap:
name: nginx
nginx-404.yaml文件:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx
namespace: kube-system
data:
nginx.yaml: |
es_host: elasticsearch
esport: 9200
name: nginx123456
type: any
index: abcd*
use_strftime_index: true
num_events: 1
filter:
- query:
query_string:
query: "http_status_code = 404"
alert_text: "
域 名: {}\n
匹配数量: {}\n
状 态 码: {}\n
请求链接: {}\n
ES索引名称: {}\n
远程调用地址: {}
"
alert_text_type: alert_text_only
alert_text_args: - domain
- num_hits
- http_status_code
- request
- _index
- remote_addr
alert: - "elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook: "xxxxxxxx"
dingtalk_msgtype: "text"
文件中的domain、http_status_code等是通过logstash字义的字段,还要更改nginx日志格式对应起来,我根据我司的日志格式再用logstash程序发到es中的,这里才会用到的,这里需要大家根据自己es中存取的字段来选择配置上,然后执行kubectl apply -f elastalert.yaml文件,查看是否安装成功,正常是可以的,我这里就是按照上面步骤正常安装好了无问题
更多k8s相关知识,请移步到http://www.wangshuying.cn 博客查看。