14

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】-李晓峰的博客

 4 years ago
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.
neoserver,ios ssh client

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

一般情况下我们都会在公司部署elk来收集服务的运行状态,可以直接让开发方便查看,不用登陆机器查看,另外也可以报警,方便快速问题定位。
如果想要部署可以看一下我之前的文档部署,有结合redis和kafka的部署

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

今天主要是针对k8s部署监控所有pod的

二、架构选型
存储层: Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。

展示层:Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 允许你通过 web 界面来浏览 Elasticsearch 日志数据。

缓存层: 需要收集大数据量的日志一般使用Redis、kafka做为中间缓存层来缓冲数据。

Fluentd:是一个流行的开源数据收集器, 具有众多插件,通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。
Fluentd-bit: 更适用于嵌入设备等资源受限的场景。占用系统资源较少,在插件可以满足需求的同时,无疑是更好的选择。另外Fluent Bit 提供了输出插件,可以把数据发给 Fluentd,因此他们可以在系统中作为独立服务互相协作。对比如下

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

【备注】:日志采集工具--Logstash、Filebeat、Fluentd、Logagent对比
https://developer.51cto.com/art/201904/595529.htm

三、部署Elasticsearch 集群
yaml文件我已经上传到了百度盘,可以直接下载使用,记得修改报警邮件的授权码

链接:https://pan.baidu.com/s/1MpOn-7PkIKdqrKOofLUQQw
提取码:ap6h

记得先部署,nfs的动态存储
StorageClass持久化存储
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

【注】这个参考 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)对应的端口:

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

部署Kibana服务
kubectl create -f kibana.yaml

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

访问一下kibana

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

五、部署Fluentd采集插件
由于我们使用的采集方案,只需要在每台节点上部署一个采集器即可,对资源没有过大的消耗,所以选择对插件支持更多,使用更加广泛的Fluentd 来作为日志收集工具。下面我们使用DasemonSet 控制器来部署 Fluentd 应用,以确保在集群中的每个节点上始终运行一个 Fluentd 收集容器。

  1. 编写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
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
  1. 使用Daemonset部署Fluentd Pod
    kubectl create -f fluentd-daemonset.yaml

kubectl get pods -n logging

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
  1. 测试应用日志收集

kubectl create -f dummylogs.yaml
kubectl get pod

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

因为存在了所以不能创建了

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

比如我们启动一个nginx看一下如何收集
我们指定了只收集具有logging=true标签的Pod日志

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

去kibana查看一下
按照条件查一下
kubernetes.pod_name is nignx

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

在比如部署一个jenkins容器看一下
记得添加标签logging=true标签

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

也收集过来了
接下来开始报警
六、实现基于日志的报警
在应用层面我们可以使用 Promethus 对应用的各项指标进行监控,但是在业务层面,应用的日志中也会产生一些错误日志,影响业务的正常运行,所以我们还需要对错误日志进行监控报警,可以使用 elastalert 组件来完成这个工作。

下面我们使用邮件方式报警,编写资源文件elastalert.yaml
使用邮件进行报警的时候,需要指定一个smtp_auth_file 的文件,文件中包含用户名和密码:(smtp_auth_file.yaml)
K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
kubectl create secret generic smtp-auth --from-file=smtp_auth_file.yaml -n logging
kubectl apply -f elastalert.yaml
我们的示例应用会隔一段时间就产生 ERROR 级别的错误日志,所以正常情况下我们就可以收到如下所示的邮件信息了:

K8S部署EFK收集pod日志,通过邮件报警ERROR【19】

好了今天就先到这里
欢迎留言评论


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK