kubernetes日志监控系统架构详解

Posted xuexinhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes日志监控系统架构详解相关的知识,希望对你有一定的参考价值。

1 背景

随着客户的不断增多,客户业务复杂程度不断加大,传统的服务器级别监控由于监控粒度过大,且当告警时需要进一步排查原因,已无法满足需求,为了深入客户业务,保证业务健康运行,我们需要收集服务器系统的日志、客户业务日志,并进行分析处理,做到故障发生时可以第一时间定位故障原因,通知相应的人员处理,那么怎么将日志文件归集,怎么将日志文件呈现,以及故障发生时第一时间通知给相应业务负责的人员,成了很多公司需要面对的问题,因此日志监控系统应运而生。

2 日志监控系统架构设计

2.1 架构组成

kubernetes日志监控系统架构详解_kafka

2.2 架构策略

在数据源端配置日志采集客户端,负责采集原始日志并汇总到MQ,MQ选择Kafka进行日志消息缓存与分发,后端部署LogStash,订阅Kafka topic内日志消息,并写入ES文件存储。

ElastAlert判断日志消息是否包含错误或异常等信息,通过邮件、短信等方式发送给相关联系人,ES提供数据给Grafana/Kibana进行数据展示,用户可通过web界面查询实时日志

3 日志监控系统介绍

3.1 数据采集

数据采集层位于业务服务器集群上,在每个业务服务器上面安装了数据采集工具,做日志采集,包括应用日志、系统日志、访问日志等,然后把采集到的原始日志通过发送至消息队列集群。

数据采集工具(Agent)的选型需考虑:

  • 部署方式
  • 部署难易度
  • 业务入侵程度
  • 资源消耗

目前主流的开源日志采集工具有:​​Logstash​​​,​​Filebeat​​​,​​Fluentd​​等

Logstash

Logstash 是一个开源数据收集引擎,具有实时管道功能。Logstash 可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地

  • 优点就是它的灵活性,它提供很多插件,详细的文档以及直白的配置格式让它可以在多种场景下应用。而且现在​​ELK​​整个技术栈在很多公司应用的比较多,所以基本上可以在往上找到很多相关的学习资源
  • 缺点是它的性能以及资源消耗。尽管它的性能在近几年已经有很大提升,与它的替代者们相比还是要慢很多的,它在大数据量的情况下会是个问题。另一个问题是它目前不支持缓存。

Filebeat

Filebeat是一个轻量级的日志传输工具,它的存在正弥补了​​Logstash​​​的缺点,​​Filebeat​​作为一个轻量级的日志传输工具可以将日志推送到 Kafka、Logstash、ElasticSearch、Redis

  • 优点是只是一个二进制文件没有任何依赖。它占用资源极少,尽管它还十分年轻,正式因为它简单,所以几乎没有什么可以出错的地方,所以它的可靠性还是很高的。
  • 缺点是​​Filebeat​​​的应用范围十分有限,所以在某些场景下我们会碰到问题。例如,如果使用​​Logstash​​​作为下游管道,我们同样会遇到性能问题。正因为如此​​Filebeat​​​的范围在扩大。开始时,它只能将日志发送到​​Logstash​​​和​​Elasticsearch​​​,而现在它可以将日志发送给​​Kafka​​​和​​Redis​​。

Fluentd

Fluentd创建的初衷主要是尽可能的使用​​JSON​​作为日志输出,所以传输工具及其下游的传输线不需要猜测子字符串里面各个字段的类型。这样它为几乎所有的语言都提供库,这也意味着可以将它插入到自定义的程序中。

  • 优点是​​Fluentd​​​插件是用​​Ruby​​​语言开发的非常易于编写维护。所以它数量很多,几乎所有的源和目标存储都有插件。这也意味这可以用​​Fluentd​​来串联所有的东西。
  • 缺点是​​Fluentd​​​的灵活性并不好。但是仍然可以通过正则表达式来解析非结构化的数据。尽管性能在大多数场景下都很好,但它并不是最好的,它的缓冲只存在与输出端,单线程核心以及​​Ruby GIL​​实现的插件意味着它大的节点下性能是受限的。

综上所述,​​Filebeat​​​凭借占用资源极少、轻量化、可靠性高、部署简单,故数据采集层工具采用​​Filebeat​

3.2 消息队列

随着业务规模扩增,日质量不断增长,接入到日志服务的产品线不断增多,遇到流量高峰,写入到ES的性能就会降低,cpu打满,随时都有集群宕机的风险。因此,需要引入消息队列进行削峰填谷。原始日志发送到​​Kafka+Zookeeper​​​集群上后,会进行集中存储,此时,​​filebeat​​是消息的生产者,存储的消息可以随时被消费。

3.3 数据分析

​LogStash​​​作为消费者,会去​​Kafka+zookeeper​​​集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至​​Elasticsearch​​集群。

3.4 数据持久化存储

​Elasticsearch​​​集群在接收到​​Logstash​​​发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到​​Elasticsearch​​集群上

3.5 数据查询展示

​Kibana/Grafana​​​是一个可视化的数据展示平台,当有数据检索请求时,它从​​Elasticsearch​​集群上读取数据,然后进行可视化出图和多维度分析

4 安装部署

4.1 环境准备

服务器

运行软件

部署方式

10.1.1.11

nginx + Filebeat

二进制

10.1.1.12

Kafka + Zookeeper

docker-compose

10.1.1.13

ES + Logstash

docker-compose + 二进制

10.1.1.14

Kibana + Grafana

二进制

4.2 docker环境部署

在​​10.1.1.12​​​和​​10.1.1.13​​上部署

4.2.1 安装docker

[root@kaf_zoo ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@kaf_zoo ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@kaf_zoo ~]# yum -y install docker-ce
docker -v
[root@kaf_zoo ~]# docker -v
Docker version 20.10.6, build 370c289

4.2.2 配置加速器

[root@kaf_zoo ~]# sudo mkdir -p /etc/docker
[root@kaf_zoo ~]# sudo tee /etc/docker/daemon.json <<-EOF

"registry-mirrors": ["https://su9ppkb0.mirror.aliyuncs.com"]

EOF
[root@kaf_zoo ~]# systemctl daemon-reload
[root@kaf_zoo ~]# systemctl start docker
[root@kaf_zoo ~]# systemctl enable docker

4.2.3 安装docker-compose

[root@kaf_zoo ~]# yum install docker-compose -y
[root@kaf_zoo ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9

4.3 部署ES集群

4.3.1 环境配置

# 优化内核,对es支持
[root@es_logst es]# echo vm.max_map_count=262144 >> /etc/sysctl.conf
[root@es_logst es]# sysctl -p

# 配置变量
[root@es_logst es]# echo ELK_VERSION=7.5.1 > .env

# 开启IPv4转发
[root@es_logst es]# echo "net.ipv4.ip_forward = 1" /usr/lib/sysctl.d/00-system.conf
[root@es_logst es]# systemctl restart network
[root@es_logst es]# systemctl restart docker

4.3.2 准备目录

mkdir /data/es/data-es1,2,3
mkdir /data/es/config
mkdir /data/es/elasticsearch

4.3.3 准备配置文件

​cat /data/es/docker-compose.yml​

version: 3.3
services:
es01:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
container_name: es01
volumes:
- type: bind
source: /data/es/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: data-es1
target: /usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- elastic
es02:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
container_name: es02
volumes:
- type: bind
source: /data/es/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: data-es2
target: /usr/share/elasticsearch/data
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- elastic
es03:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
container_name: es03
volumes:
- type: bind
source: /data/es/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: data-es3
target: /usr/share/elasticsearch/data
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- elastic

volumes:
data-es1:
driver: local
driver_opts:
type: none
o: bind
device: /data/es/data-es1

data-es2:
driver: local
driver_opts:
type: none
o: bind
device: /data/es/data-es2

data-es3:
driver: local
driver_opts:
type: none
DEVOPS架构师 -- 04Kubernetes集群的日志及监控-更新版

阿里云原生 Kubernetes 日志监控的架构设计方案

银行全链路日志监控难点详解

容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络存储日志监控管理

kubernetes 日志采集方案 采用DaemonSet 还是 SideCar呢?

详解Kubernetes的价值