kubernetes日志监控系统架构详解
Posted xuexinhuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes日志监控系统架构详解相关的知识,希望对你有一定的参考价值。
1 背景
随着客户的不断增多,客户业务复杂程度不断加大,传统的服务器级别监控由于监控粒度过大,且当告警时需要进一步排查原因,已无法满足需求,为了深入客户业务,保证业务健康运行,我们需要收集服务器系统的日志、客户业务日志,并进行分析处理,做到故障发生时可以第一时间定位故障原因,通知相应的人员处理,那么怎么将日志文件归集,怎么将日志文件呈现,以及故障发生时第一时间通知给相应业务负责的人员,成了很多公司需要面对的问题,因此日志监控系统应运而生。
2 日志监控系统架构设计
2.1 架构组成
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
version3.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_onlytrue
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_onlytrue
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_onlytrue
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集群的日志及监控-更新版容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络存储日志监控管理