日志收集架构

日志收集、分析的系统的特征

  • 收集 能够采集多种来源的日志数据(流式日志收集器)
  • 传输 能够稳定的把日志数据传输到中央系统(消息队列)
  • 存储 可以将日志以结构化数据的形式存储起来(搜索引擎)
  • 分析 支持方便的分析、检索方法,最好有GUI管理工具(前端)
  • 警告 能够提供错误报告,监控机制(监控工具)

此文将针对ELK系统架构进行叙述
E ElasticSearch
L LogStash
K Kibana

传统ELK模型
image.png
缺点:
a)LogStash使用Jruby语言开发,吃资源,大量部署消耗极高;
b)业务程序与LogStash耦合过松,不利于业务迁移;
c)LogStash与ES耦合过紧,易打爆,丢数据;
d)在容器云环境下,传统ELK模型难以完成工作。

本文所使用架构模型
image.png

容器日志环境实现

总体说明

要想ELK能够收集Pod日志,此文采用边车模式将filebeat和服务跑到同一个Pod里,filebeat采集日志输出到kfaka,再由其向后输出。
而要实现此环境,需要配置一些自定义镜像资源。
此文以tomcat为载体,将服务部署到tomcat下为示例进行说明。

Tomcat镜像底包制作

[root@master1 /luomurui/k8snew/dockerfile/tomcat8]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz

###配置tomcat
1、关闭ajp端口
# AJP是tomcat和apache通信的端口,现在都用nginx,故关闭。老版本没有注释,需要手动注释,此实验版本默认已注释。
[root@master1 /luomurui/k8snew/dockerfile/tomcat8]# vim apache-tomcat-8.5.55/conf/server.xml
image.png
2、配置日志
# 删除不要的日志(管理页面的日志,因为线上不需要tomcat的管理功能)
# 删除3manager,4host-manager的handlers
# 删除黄线部分
image.png
# 添加注释且将日志级别改为info
image.png

###制作镜像
#相关文件
[root@master1 /luomurui/gitee/K8sDockerfile/tomcat8]# ll
image.png

文件地址
https://gitee.com/crabluo/K8sDockerfile/tree/master/tomcat8

镜像制作
[root@master1 /luomurui/k8snew/dockerfile/tomcat8]# docker build . -t harbor.od.com/base/tomcat:v8.5.55
[root@master1 /luomurui/k8snew/dockerfile/tomcat8]# docker push harbor.od.com/base/tomcat:v8.5.55

filebeat镜像底包制作

文件地址
https://gitee.com/crabluo/K8sDockerfile/tree/master/filebeat

镜像制作
[root@master1 /luomurui/k8snew/dockerfile/filebeat]# chmod +x docker-entrypoint.sh
[root@master1 /luomurui/k8snew/dockerfile/filebeat]# docker build . -t harbor.od.com/infra/filebeat:v7.4.0
[root@master1 /luomurui/k8snew/dockerfile/filebeat]# docker push harbor.od.com/infra/filebeat:v7.4.0

说明
kafka.od.com已解析到对应的kafka服务器地址。

dubbo服务对底包的使用

jenkins项目配置

Jenkins
image.png
#Jenkinsfile

  1. pipeline {
  2. agent any
  3. stages {
  4. stage('pull') { //get project code from repo
  5. steps {
  6. sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
  7. }
  8. }
  9. stage('build') { //exec mvn cmd
  10. steps {
  11. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
  12. }
  13. }
  14. stage('unzip') { //unzip target/*.war -c target/project_dir
  15. steps {
  16. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && unzip *.war -d ./project_dir"
  17. }
  18. }
  19. stage('image') { //build image and push to registry
  20. steps {
  21. writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}
  22. ADD ${params.target_dir}/project_dir /opt/tomcat/webapps/${params.root_url}"""
  23. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && export DOCKER_API_VERSION=1.39 && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
  24. }
  25. }
  26. }
  27. }

资源清单应用

在基于原有的 apollo配置中心及dubbo-demo-service 服务正常的情况下,应用dubbo-demo-web资源,查看日志效果。
此处仅提供namespace为test的资源文件进行说明。

资源清单
https://gitee.com/crabluo/K8sFiles/tree/master/yaml/dubbo-tomcat/dubbo-demo-consumer

资源应用
kubectl apply -f .

日志效果查看

查看dubbo-demo-consumer容器运行在具体的节点
[root@master1 ~]# kubectl get pods -n test -o wide |grep consu
dubbo-demo-consumer-7754cd7df6-v9r4w 2/2 Running 0 7m14s 10.244.4.168 node1

到node1节点查看Pod里有几个服务
[root@node1 ~]# docker ps -a |grep consume

  1. 34d2d006347c 39b994b6347b "/docker-entrypoint.…" 22 minutes ago Up 22 minutes k8s_filebeat_dubbo-demo-consumer-7754cd7df6-v9r4w_test_e35e8deb-70bc-4e40-9286-4f572e7f85ae_0
  2. c6e0769c169c c177ecc60e0d "/entrypoint.sh" 22 minutes ago Up 22 minutes k8s_dubbo-demo-consumer_dubbo-demo-consumer-7754cd7df6-v9r4w_test_e35e8deb-70bc-4e40-9286-4f572e7f85ae_0
  3. 94e4fd6e43e0 k8s.gcr.io/pause:3.1 "/pause" 22 minutes ago Up 22 minutes k8s_POD_dubbo-demo-consumer-7754cd7df6-v9r4w_test_e35e8deb-70bc-4e40-9286-4f572e7f85ae_0

进入filebeat资源中,可查看到已将tomcat的日志收集到/logm下
[root@node1 ~]# docker exec -it 34d2d006347c /bin/bash
root@dubbo-demo-consumer-7754cd7df6-v9r4w:/# cd logm
root@dubbo-demo-consumer-7754cd7df6-v9r4w:/logm# du -sh *

  1. 12K catalina.2020-06-28.log
  2. 4.0K localhost.2020-06-28.log
  3. 0 localhost_access_log.2020-06-28.txt
  4. 16K stdout.log

日志系统组件服务部署

整体信息说明

a)因资源有限,服务将嵌套在集群节点上部署;
b)部分服务依赖JAVA环境,请自行解决JDK1.8前提环境;
c)相关服务的域名解析也不做赘述;
d)相关服务的软件包请自行官网下载,此处略。

服务信息如下:
node1 10.2.3.13 elasticsearch
master3 10.2.2.96 kfaka

服务对应域名解析,信息如下:
10.2.3.13 es.od.com

elasticsearch9200

因为es是有状态服务,故采用二进制方式部署。

基建环境准备
tar -axvf elasticsearch-6.8.3.tar.gz -C /opt/
ln -sv /opt/elasticsearch-6.8.3 /opt/elasticsearch
mkdir -p /data/elasticsearch/{data,logs}
mkdir -p /data/elasticsearch/{data,logs}

配置文件修改
[root@node1 /opt/elasticsearch]# cat config/elasticsearch.yml

  1. cluster.name: es.od.com
  2. node.name: node1.host.com
  3. path.data: /data/elasticsearch/data
  4. path.logs: /data/elasticsearch/logs
  5. bootstrap.memory_lock: true
  6. network.host: 10.2.3.13
  7. http.port: 9200

说明:network.host是本机ip地址。

按需优化jvm,限制内存
[root@node1 /opt/elasticsearch]# vim config/jvm.options
image.png

创建普通用户
useradd -s /bin/bash -M es
chown -R es.es /opt/elasticsearch-6.8.3/
chown -R es.es /data/elasticsearch/

配置文件描述符
]# vim /etc/security/limits.d/es.conf
es hard nofile 65536
es soft fsize unlimited
es hard memlock unlimited
es soft memlock unlimited

调整内核参数
sysctl -w vm.max_map_count=262144
or
echo “vm.max_map_count=262144” >> /etc/sysctl.conf
sysctl -p

启动及验证
su -c “/opt/elasticsearch/bin/elasticsearch -d” es
ss -atunpl|grep 9200

调整es日志模板
curl -H “Content-Type:application/json” -XPUT http://10.2.3.13:9200/_template/k8s -d ‘{
“template” : “k8s“,
“index_patterns”: [“k8s
“],
“settings”: {
“number_of_shards”: 5,
“number_of_replicas”: 0
}
}’

kfaka9092

kfaka依赖于zookeeper环境,部署请参考:https://www.yuque.com/crabluo/k8s/iahvix

基建资源准备
tar -axvf kafka_2.12-2.2.0.tgz -C /opt/
ln -sv /opt/kafka_2.12-2.2.0 /opt/kafka
mkdir -p /data/kafka/logs

配置文件
]# vim /opt/kafka/config/server.properties
log.dirs=/data/kafka/logs
zookeeper.connect=localhost:2181
log.flush.interval.messages=10000
log.flush.interval.ms=1000
delete.topic.enable=true
host.name=master3.host.com

启动及验证
[root@master3 /opt/kafka]# bin/kafka-server-start.sh -daemon config/server.properties
[root@master3 /opt/kafka]# ss -atunpl|grep 9092

查看topics信息
]# /opt/kafka/bin/kafka-topics.sh —list —zookeeper localhost:2181
__consumer_offsets
k8s-fb-test-logm-dubbo-demo-web

说明:默认只有第一行内容,第二行内容是因为前面跑了dubbo-demo-web服务,产生的信息。

logstash

[root@master2 ~]# docker pull logstash:6.8.3
[root@master2 ~]# docker tag 972bf55ad27b harbor.od.com/infra/logstash:v6.8.3
[root@master2 ~]# docker push harbor.od.com/infra/logstash:v6.8.3
[root@master2 ~]# mkdir -p /etc/logstash

/etc/logstash/logstash-test.conf

  1. input {
  2. kafka {
  3. bootstrap_servers => "kafka.od.com:9092"
  4. client_id => "kafka.od.com"
  5. consumer_threads => 4
  6. group_id => "k8s_test"
  7. topics_pattern => "k8s-fb-test-.*"
  8. }
  9. }
  10. filter {
  11. json {
  12. source => "message"
  13. }
  14. }
  15. output {
  16. elasticsearch {
  17. hosts => ["es.od.com:9200"]
  18. index => "k8s-test-%{+YYYY.MM.DD}"
  19. }
  20. }

/etc/logstash/logstash-prod.conf

input {
  kafka {
    bootstrap_servers => "kafka.od.com:9092"
    client_id => "kafka.od.com"
    consumer_threads => 4
    group_id => "k8s_prod"
    topics_pattern => "k8s-fb-prod-.*"
  }
}

filter {
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["es.od.com:9200"]
    index => "k8s-prod-%{+YYYY.MM.DD}"
  }
}

启动(test,prod分别跑一个logstash,分压)
docker run -d —name logstash-test -v /etc/logstash:/etc/logstash harbor.od.com/infra/logstash:v6.8.3 -f /etc/logstash/logstash-test.conf
docker run -d —name logstash-prod -v /etc/logstash:/etc/logstash harbor.od.com/infra/logstash:v6.8.3 -f /etc/logstash/logstash-prod.conf

验证
]# curl http://es.od.com:9200/_cat/indices?
image.png

kibana

镜像资源
docker pull kibana:6.8.3
docker tag 54db200915ee harbor.od.com/infra/kibana:v6.8.3

资源文件
https://gitee.com/crabluo/K8sFiles/tree/master/elk/kibana

资源应用
kubectl apply -f .

地址解析
服务对应解析域名:kibana.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85

页面效果
image.png

Kibana生产实践用法

资源信息查看

点击左侧栏 Monitoring 选项,可看到相关资源信息。
image.png

创建不同环境的索引

依次点击 Management > Index Patterns 。
image.png
image.png

点击 Create index pattern 后,再点击左侧栏的 Discovery,可查看到页面已刷出日志。
image.png

开发使用培训

四个选择器

时间选择器
选择指定时间段内产生的日志。
image.png

环境选择器
根据不同的匹配规则创建了不同的索引,根据索引的不同以区分不同环境。
image.png

项目选择器
根据项目名选择对应项目的日志。
image.png
image.png

关键字选择器
通过搜索指定关键字匹配内容。

以下将通过服务报错示例进行讲解!
将dubbo-demo-service的副本数调为0,则dubbo-demo-consumer将出现报错。
几分钟后在页面通过关键字搜索查看对应的报错信息。
image.png

常用的fields

timestamp
message
log.file.path
host.name

匹配规则说明

此处根据匹配规则,在配置文件中配置了报错的多行匹配为一行,即以时间戳为开头的内容匹配算为一行数据。此规则的好处是当服务出现报错时,看报错方便简洁,不需要看多行的大片日志。