云原生技术
的宗旨是帮助企业组织在现代动态的环境下(公有云,私有云和混合云)高效管理应用的全生命周期, 围绕kubernetes
,用户可以灵活选择各个模块组件,搭建平台以满足多样需求。 云原生风景图完整地展示了企业实践云原生所需要处理的问题。 这张图很有参考意义。
图中将日志,监控和链路追踪
都放到了监控和分析
,这是一个趋势,背负着统一OpenTrace
和OpenCensue
的OpenTelemetry
就是为了实现Metrics
、Tracing
和Logging
的融合。 这三者的融合才是一个完整的用户故事。基于 Metrics 的告警及时发现异常,通过 Tracing 定位问题的模块,根据模块的日志找到问题的根源, 最后基于问题,调整 Metrics(增加或者调整告警的阀值等),以便下次可以更早发现或预防问题。
日志,监控和链路追踪
三中平台的基本架构是一致的:数据收集 -> 数据处理 -> 数据展示(告警),主要差异是数据源的不一致, 所以搭建三套平台显然很冗余,也不便于维护管理。但是很可惜,目前很没有一套成熟的方案,不过相信随着社区的发展,不会等太久。
结合最近的工作,本片博文,我将给大家简单介绍EFK Stack日志平台,并如何通过Helm快速部署一套EFK集群。 本文内容较为浅显,适合刚接触日志平台的人阅读🤣(因为笔者也没有EFK丰富的实践经验,splunk的使用经验不知道能不能算)。EFK涉及的组件文档十分完善, 还请以文档作为主要参考。
主流的方案
- Splunk Enterprise:Splunk 公司产品,生态丰富且成熟度较高,SPEL 查询语言功能强大,维护方便,缺点是收费;
- Elastic Stack(ELK Stack):由 Elasticsearch,Logstash,Kibana,Filebeats 组件组成,生态丰富,不完全开源, 需要订阅才能解锁一些高级(🤣不常用)功能;
- EFK Stack: 和Elastic Stack的组件类似,不过日志收集器使用的是fluented,fluented对容器应用的支持很完善,和kubernetes集群更加匹配;
- PLG Stack(Grafana Loki): 由 Promtail,Loki 和 Grafana 组成,Grafana 强大的可视化加成,借鉴了 Prometheus 的设计思路;
EFK 方案
kubernetes 官方中 Elasticsarch 插件包含 Elasticsearch,Fluented 和 kibana 三个,Elasticsearch 负责存储日志数据的存储和索引查询, Fluented 从集群收集数据并发送到 Elasticsearch,Kibana 提供数据的可视化功能。
组件介绍
Elasticsearch(es)
一般来说,根据集群的规模和日志量来部署 es 集群,数据存储在不同节点的碎片中,集群有多个类型节点组成,以提高可用性,有以下类型的节点:
- 主节点(Master node):集群控制器,最少需要 3 个,采用的主从模式
- 数据节点(Data node):保存索引数据并且执行数据查询任务
- 提取节点(Ingest node):通过 ingest pipeline 对文档执行预处理操作,以便在索引文档之前对文档进行转换或者增强。
- 协调节点(Coordinationg node):协调保存在不同节点数据的搜索请求,索引请求之类的操作,这种类型的节点需要足够的内存和 CPU 资源;
一个节点默认情况下可以同时是多个类型的节点,当集群增大时,最好将其分开配置。下图显示如何将数据存储在主碎片和副本碎片中, 以便在节点之间分散负载并提高数据的可用性。
每个碎片中的数据存储在一个反向索引中(inverted index),下图展示了数据如何存储在反向索引中:
Fluented
Fluented 是开源日志收集器,是 CNCF 的毕业项目,通过丰富的插件系统实现多种日志源的收集,处理和转发功能。
fluentd 既可以作为日志收集器安装到每一个结点上, 也可以作为一个服务端收集各个结点上报的日志流。 你甚至也可以在各个结点上都部署 fluentd 收集日志,然后上报到一个 fluentd 集群做统一处理, 然后再转发到最终的日志存储服务器。
fluented 的核心是各种命令块(directives),每种命令块完成一项功能,最终通过组合这些命令块以 pipline 的形式处理和分发日志。
主要命令有:
- source:收集日志源文件,如通过一下配置收集 kubernetes 所有容器日志,如果通过容器方式部署,需要将
/var/lib/docker/containers
(默认配置)目录挂在到容器中
1 | <source> |
- match: 指定动作,通过 tag 匹配 source,然后执行指定命令来分发日志,match 是从上往下依次匹配的,一旦一个日志流被匹配上, 就会停止配置,以下配置将日志数据发送到 es 集群中。
1 | <match **> # 唯一标识符,后面匹配一个日志源,**代表全部数据 |
- filter: 对数据进行过滤,其和 match 不同,可以通过 filter 串联成 pipeline,对数据进行窜行处理。比如我们只采集具有
logging=true
标签的 Pod 的日志, 以下是示例配置:
1 | # 删除无用的属性 |
fluented配置文件可能比较繁琐,不过通过部署fluented-elastic
版本,来简化配置,我们只需要在默认配置文件进行少量的修改即可。
kibana
Kibana是一个类似Grafana的数据可视化组件。
使用 Helm 部署
部署前,你需要准备好 kubernetes 集群并且安装 helm,建议创建新的 namespace 部署这些组件。
Step1:安装 es 集群 es以Statefulset的方式部署以保证稳定的,持久的存储。选择bitnami的chart,国内能够正常拉取默认镜像。 更具需求修改配置文件。
1 | helm install elasticsearch bitami/elasticsearch -f custom.yaml |
Step2:安装 fluented-elasticsearch 通过Daemonset方式部署,收集每个节点的数据,kiwigrid仓库默认中的镜像国内能够正常拉取。
1 | helm repo add kiwigrid https://kiwigrid.github.io |
Step3:安装 kibana 直接通过Deoplyment方式部署。
1 | helm install kibana bitnami/kibana -f custom.yaml |
step4:验证是否部署成功
下图是部署后Pod列表:
1 | ➜ Temp kubectl get pods |
这里创建一个简单的应用,定时往标准输出打印日志:
1 | apiVersion: v1 |
部署测试pod,通过log可以看到日志输出。
1 | ➜ Temp kubectl create -f counter.yaml |
在kibana中添加对应的索引,即可看到对应的数据:
everything-all-in 这里介绍一个比较方便的 chart stable/elastic-stack
,这个 chart 和并了以上上个 chart,同时还可以使用其他组件进行替换,如可以使用 Filebeats 替换 fluented。
1 | $ helm install efk-stack stable/elastic-stack --set logstash.enabled=false --set fluentd.enabled=true --set fluentd-elasticsearch.enabled=true |
总结
本文,给大家介绍了日志平台方案 EFK,并通过Helm部署了实验环境,不涉及到参数调优等介绍, 也不涉及到es的查询和kibnama如何使用,有splunk或类似平台使用经验的读者能够很快上手。