K8S部署EFK收集pod日志,通过邮件报警ERROR【19】-李晓峰的博客
source link: https://blog.51cto.com/xiaorenwutest/2500036
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
一般情况下我们都会在公司部署elk来收集服务的运行状态,可以直接让开发方便查看,不用登陆机器查看,另外也可以报警,方便快速问题定位。
如果想要部署可以看一下我之前的文档部署,有结合redis和kafka的部署
今天主要是针对k8s部署监控所有pod的
二、架构选型
存储层: Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。
展示层:Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 允许你通过 web 界面来浏览 Elasticsearch 日志数据。
缓存层: 需要收集大数据量的日志一般使用Redis、kafka做为中间缓存层来缓冲数据。
Fluentd:是一个流行的开源数据收集器, 具有众多插件,通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。
Fluentd-bit: 更适用于嵌入设备等资源受限的场景。占用系统资源较少,在插件可以满足需求的同时,无疑是更好的选择。另外Fluent Bit 提供了输出插件,可以把数据发给 Fluentd,因此他们可以在系统中作为独立服务互相协作。对比如下
【备注】:日志采集工具--Logstash、Filebeat、Fluentd、Logagent对比
https://developer.51cto.com/art/201904/595529.htm
三、部署Elasticsearch 集群
yaml文件我已经上传到了百度盘,可以直接下载使用,记得修改报警邮件的授权码
链接:https://pan.baidu.com/s/1MpOn-7PkIKdqrKOofLUQQw
提取码:ap6h
记得先部署,nfs的动态存储
StorageClass持久化存储
【注】这个参考 prometheus当中的部署,包也在百度盘
使用3个 Elasticsearch Pod 来避免高可用下多节点集群中出现的“脑裂”问题
创建一个名为 logging 的 namespace:
kubectl create namespace logging
kubectl create -f elasticsearch-svc.yaml
kubectl create -f elasticsearch-statefulset.yaml
验证ES服务是否正常
将本地端口9200转发到 Elasticsearch 节点(如es-0)对应的端口:
部署Kibana服务
kubectl create -f kibana.yaml
访问一下kibana
五、部署Fluentd采集插件
由于我们使用的采集方案,只需要在每台节点上部署一个采集器即可,对资源没有过大的消耗,所以选择对插件支持更多,使用更加广泛的Fluentd 来作为日志收集工具。下面我们使用DasemonSet 控制器来部署 Fluentd 应用,以确保在集群中的每个节点上始终运行一个 Fluentd 收集容器。
- 编写fluentd的ConfigMap文件
kubectl create -f fluentd-configmap.yaml
刚才我们使用ConfigMap对象编写的Fluentd的配置文件,也已经通过volumes 挂载到了Fluentd 容器中。我们也可以通过给节点打标签的方式,灵活控制哪些节点的日志可以被收集。在上面文件中我们定义了nodeSelector字段,来收集集群中含有这个beta.kubernetes.io/fluentd-ds-ready: "true"标签的节点日志。
为需要收集日志的节点添加标签
kubectl label nodes k8s-node1 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes k8s-node3 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes k8s-master beta.kubernetes.io/fluentd-ds-ready=true
kubectl get nodes --show-labels
- 使用Daemonset部署Fluentd Pod
kubectl create -f fluentd-daemonset.yaml
kubectl get pods -n logging
- 测试应用日志收集
kubectl create -f dummylogs.yaml
kubectl get pod
因为存在了所以不能创建了
比如我们启动一个nginx看一下如何收集
我们指定了只收集具有logging=true标签的Pod日志
去kibana查看一下
按照条件查一下
kubernetes.pod_name is nignx
在比如部署一个jenkins容器看一下
记得添加标签logging=true标签
也收集过来了
接下来开始报警
六、实现基于日志的报警
在应用层面我们可以使用 Promethus 对应用的各项指标进行监控,但是在业务层面,应用的日志中也会产生一些错误日志,影响业务的正常运行,所以我们还需要对错误日志进行监控报警,可以使用 elastalert 组件来完成这个工作。
下面我们使用邮件方式报警,编写资源文件elastalert.yaml
使用邮件进行报警的时候,需要指定一个smtp_auth_file 的文件,文件中包含用户名和密码:(smtp_auth_file.yaml)
kubectl create secret generic smtp-auth --from-file=smtp_auth_file.yaml -n logging
kubectl apply -f elastalert.yaml
我们的示例应用会隔一段时间就产生 ERROR 级别的错误日志,所以正常情况下我们就可以收到如下所示的邮件信息了:
好了今天就先到这里
欢迎留言评论
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK