关于kubernetes:日志系统设计和实践1Kubernetes下EFK日志系统搭建ECK方式
前言随着生产环境局部服务曾经切换至Kubernetes,最近的工作都围绕着周边基础设施来进行,最先思考到的就是架构可观测性的欠缺,包含了日志零碎和监控零碎,相比之下我感觉日志零碎更为迫切些。 对于日志这个事件其实可大可小,所有取决于利用的规模,日志的重要度以及复杂度会随着规模的变大而直线回升。日系零碎蕴含的货色其实很多,一方面蕴含日志根底设置的建设,更重要的在于日志的标准的制订和体系的建设。这次除了须要搭建Kubernetes下的日志平台,还想趁着这次机会梳理一下与日志相干的方方面面,来建设较为欠缺的日志体系。 基于开源的日志计划首选就是ELK,未引入容器化之前咱们采纳的也是ELK + Filebeat,全副基于文件采集的形式,那么这次日志环境搭建的思路就是正确的把这套日志计划移入Kubernetes环境,当然基于EFK(Elasticsearch、Fluentd、Kibana)的计划也是 Kubernetes 官网比拟举荐的一种计划。 包含: 利用FileBeats、Fluentd等采集Agent实现容器上的数据对立收集。(Fluentd因为性能、与Kubernetes的无缝集成以及是CNCF会员我的项目等起因代替了Logstash)。采集的数据能够对接ElasticSearch来做实时的查问检索。数据的可视化能够应用grafana、kibana等罕用的可视化组件。以咱们目前的日志要求以及量级,以上计划就足够了,至于定制化的数据荡涤,实时或者离线的数据分析,这些作为后续扩大的储备。 Kubernetes下日志特点在 Kubernetes 中,日志采集相比传统虚拟机、物理机形式要简单很多,最基本的起因是 Kubernetes 把底层异样屏蔽,提供更加细粒度的资源调度,向上提供稳固、动静的环境。因而日志采集面对的是更加丰盛、动静的环境,须要思考的点也更加的多。 日志的模式变得更加简单,不仅有物理机/虚拟机上的日志,还有容器的规范输入、容器内的文件、容器事件、Kubernetes 事件等等信息须要采集。环境的动态性变强,在 Kubernetes 中,机器的宕机、下线、上线、Pod销毁、扩容/缩容等都是常态,这种状况下日志的存在是刹时的(例如如果 Pod 销毁后该 Pod 日志就不可见了),所以日志数据必须实时采集到服务端。同时还须要保障日志的采集可能适应这种动态性极强的场景;日志的品种变多,一个申请从客户端须要通过 CDN、Ingress、Service Mesh、Pod 等多个组件,波及多种基础设施,其中的日志品种减少了很多,例如 K8s 各种零碎组件日志、审计日志、ServiceMesh 日志、Ingress 等;采集形式日志的采集形式次要分为被动和被动,被动推送包含业务直写和DockerEngine 推送两种形式,前者在利用中集成日志sdk,和利用强绑定,后者太依赖容器运行时,灵活性也不够,这里都不做思考。 至于被动形式,次要依附在节点上运行日志Agent,通过轮训形式(阿里的logtail貌似是事件告诉形式)采集节点日志。在Kubernetes环境下,也有两种形式: DaemonSet 形式在每个 node 节点上只运行一个日志 agent,采集这个节点上所有的日志。DaemonSet 绝对资源占用要小很多,但扩展性、租户隔离性受限,比拟实用于性能繁多或业务不是很多的集群;Sidecar 形式为每个 POD 独自部署日志 agent,这个 agent 只负责一个业务利用的日志采集。Sidecar 绝对资源占用较多,但灵活性以及多租户隔离性较强,倡议大型的 K8s 集群或作为 PaaS 平台为多个业务方服务的集群应用该形式。网上找的一个比照表格,在这贴一下: DockerEngine业务直写DaemonSet形式Sidecar形式 采集日志类型规范输入业务日志规范输入+局部文件文件部署运维低,原生反对低,只需保护好配置文件即可个别,需保护DaemonSet较高,每个须要采集日志的POD都须要部署sidecar容器日志分类存储无奈实现业务独立配置个别,可通过容器/门路等映射每个POD可独自配置,灵活性高多租户隔离弱弱,日志直写会和业务逻辑竞争资源个别,只能通过配置间隔离强,通过容器进行隔离,可独自分配资源反对集群规模本地存储无限度,若应用syslog、fluentd会有单点限度无限度取决于配置数无限度资源占用低,docker engine提供整体最低,省去采集开销较低,每个节点运行一个容器较高,每个POD运行一个容器 查问便捷性低,只能grep原始日志高,可依据业务特点进行定制较高,可进行自定义的查问、统计高,可依据业务特点进行定制可定制性低高,可自在扩大低高,每个POD独自配置耦合度高,与DockerEngine强绑定,批改须要重启DockerEngine高,采集模块批改/降级须要从新公布业务低,Agent可独立降级个别,默认采集Agent降级对应Sidecar业务也会重启(有一些扩大包能够反对Sidecar热降级)实用场景测试、POC等非生产场景对性能要求极高的场景日志分类明确、性能较繁多的集群大型、混合型、PAAS型集群通过比照后,DaemonSet形式最适宜目前的状况。 日志输入形式和虚拟机/物理机不同,K8s 的容器提供规范输入和文件两种形式。在容器中,规范输入将日志间接输入到 stdout 或 stderr,而 DockerEngine 接管 stdout 和 stderr 文件描述符,将日志接管后依照 DockerEngine 配置的 LogDriver 规定进行解决;日志打印到文件的形式和虚拟机/物理机根本相似,只是日志能够应用不同的存储形式,例如默认存储、EmptyDir、HostVolume、NFS 等。 ...