概述
当Logstash挂了之后就存在丢失日志问题,之前跨大版本升级Logstash失败就丢失了一段时间日志。
当Logstash后的消费程序挂了其一,例如ES挂了,会导致日志写文件和写InfluxDB都有问题并且由于Filebeat会不断推送日志给Logstash从而导致日志丢失。
在Filebeat和Logstash之间增加Kafka用于临时缓存日志,并用于解耦日志消费者。
启动多个Logstash实例分别处理写文件、连接ES、写InfluxDB从而解耦日志消费程序耦合。
因为业务迁移要求快、时间短,没有时间将日志都打在容器stdout输出,所以采用将容器日志映射到宿主机上,再通过Filebeat收集,实现Kubernetes中业务日志收集。
Prometheus Operator:Prometheus是主动去拉取监控数据的,在Kubernetes里Pod因为调度原因导致IP不断变化,人工不可能去维持,自动发现又是基于DNS的,但是新增还是有点麻烦。Prometheus Operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator这个controller有RBAC权限、负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。
Kube-state-metrics:能够采集绝大多数Kubernetes内置资源相关数据,例如Pod、Deploy、Service等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。例如我调度了多少个Replicas?现在可用的有几个?多少个Pod是running/stopped/terminated状态?Pod重启了多少次?等等这些状态值都可以通过添加Prometheus rule来产生报警,及时通知运维和开发人员。
Prometheus:用于收集集群组件Metric和集群中各类资源状态Metric以及自定义实现的监控Metric数据。
AlertManager:处理由Prometheus服务器等客户端发来的警报。它负责删除重复数据、分组,并将警报通过路由发送到正确的接收器,比如电子邮件、Webhook等。
集群组件:我们收集了API、Controller、Scheduler、Kubelet、CoreDNS五个组件的Metrics,由于我司集群采用二进制方式安装的,所以部分组件Metric(Controller、Scheduler)数据的获取需要自己配置Endpoints并配合Service和ServiceMonitor完成Metric的收集。下面给出Controller的Endpoints、Service、ServiceMonitor配置如下图6。
图6 Controller配置
Pod状态和资源状态:这两个方面的Metric由kube-state-metrics组件完成收集,至于kube-state-metrics的功能我就不多介绍了 网上和官方都有很好的介绍。
Event监控/收集:在Kubernetes中Pod的部署过程会产生一些事件,这些事件会记录Pod的生命周期以及调度情况。并且event在集群中不是永久保存的。如果你需要知道集群中Pod的调度情况,以及收集event作为审计或其他作用,并且当集群中业务越来越多,不太可能实时去集群中查看event,那么event的监控/收集就很重要了。最近在了解阿里的event收集工具kube-eventer,看上去还不错,有兴趣的同学可以一起讨论下如何搭建。
某些情况下Prometheus产生报警信息过多、过于频繁:虽然我们已经调整了部分Prometheus rule规则中并且修改了rule中报警产生频率,但是实际应用中我们偶尔会碰到例如一个节点故障时产生大量报警信息的问题。这些报警信息虽然有用,但是信息太多反而干扰了问题排查。
java -javaagent:/data/jmx_prometheus_javaagent-0.11.0.jar=57034:/data/jmx_exporter/jmx_exporter.yml -jar -DLOG_DIR=/日志路径/服务名/ -Xmx512m -Xms256m 服务名.jar
Prometheus中配置Consul如下图11, 当Prometheus收集到业务JVM Metrics数据后就可以在Grafana中做聚合展示、报警等功能。
图11 Prometheus Consul当服务迁移到Kubernetes集群中,我们变更了JMX Exporter的部署方式JMX Exporter通过initContainer方式共享jar包和配置给业务容器,方便jmx_exporter jar包升级和配置变更。这里就不具体展示配置YAML,而JVM采集我们抛弃了之前用Consul做自动注册的方法而采用ServiceMonitor配合Service来获取JVM Metrics数据,配置YAML如下图12,Grafana展示如下图13。
图12 JVM YAML
图13 JVM Grafana在Kubernetes中我们的JVM监控也碰到了一些问题,例如之前在业务机器直接部署程序,主机IP固定不变,当JVM挂了之后程序自动重启,我们可以在Grafana中看到程序挂掉那一刻的JVM状态,并且一台机器上的业务图像是连续的,而在集群中由于Pod IP和Pod名称都在变化这样就导致一个服务Pod挂了之后,在Grafana上查找之前消亡的Pod比较麻烦,而且图形在时间线上也不连续。之前有想过用StatfulSet模式来固定名称,最后觉得这有悖无状态原则就没有采纳, 这个问题还有待解决。Q&A
Q:为何采用JMX Exporter来监控JVM,而不是Actuator/Prometheus?A:公司最开始只考虑了链路追踪,用的是Zipkin,后来要求上JVM监控时,要求是完全不能有代码侵入,所以考虑了JMX Exporter。还有你说的这个工具我不是很了解,后期可以了解下。
Q:如何做到业务监控的报警,如某个接口响应时间增多,或调用频率多?A:我司的做法是程序自身记录接口响应时间,暴露成Metric数据之后通过Prometheus收集,配置对应的rule规则,超过设定的响应时间就推送报警消息给Alertmanager再发送给运维人员。
Q:kube-state在集群规模大的时候容易OOM,怎么解决?A:我们的集群节点还很少,到现在还未碰到kube-state-metric OOM的问题,既然你的集群规模大,由于kube-state收集的数据很多,那多给点内存总是没错的。
Q:内部应用http调用是怎么调的?直接使用service域名?还是有内网ingress controller?还是其他方案?A:我们用的是Eureka来做服务注册与发现,但是我更希望公司能用Kubernetes的servic,Eureka调用是有一丢丢问题的。
Q:Kubernetes日志系统做多租户模型有没有什么方案的建议?A:你的多租户是区分nanespace的话,可以考虑将namespace加入到日志路径中或kafka topic中,这样就能区分了。
Q:有没有考虑过监控跨集群,跨机房数据汇聚问题?A:之前我们用过Prometheus联邦方式,但是由于我们的业务跨了国家 在网络上有很多限制,就放弃了这种方法了。如果你的业务都在国内或者一个云服务商或者网络条件允许的话,可以搞一搞。Kubernetes管理员认证(CKA)培训
本次CKA培训课程,基于最新考纲,通过
线下授课、考题解读、模拟演练等方式,帮助学员快速掌握Kubernetes的理论知识和专业技能,并针对考试做特别强化训练,让学员能从容面对CKA认证考试,使学员既能掌握Kubernetes相关知识,又能通过CKA认证考试,
学员可多次参加培训,直到通过认证。点击下方图片或者阅读原文链接查看详情。
最后
以上就是愉快羽毛为你收集整理的es审计日志_Kubernetes业务日志收集与监控的全部内容,希望文章能够帮你解决es审计日志_Kubernetes业务日志收集与监控所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复