一般情况下我们都会在公司部署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】

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