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

- 容器日志环境实现
- https://gitee.com/crabluo/K8sDockerfile/tree/master/tomcat8">文件地址
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 - https://gitee.com/crabluo/K8sDockerfile/tree/master/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服务器地址。
#Jenkinsfile">Jenkins
#Jenkinsfile- https://gitee.com/crabluo/K8sFiles/tree/master/yaml/dubbo-tomcat/dubbo-demo-consumer">资源清单
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 consudubbo-demo-consumer-7754cd7df6-v9r4w 2/2 Running 0 7m14s 10.244.4.168 node1 - 到node1节点查看Pod里有几个服务
[root@node1 ~]# docker ps -a |grep consume - 进入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 * - 日志系统组件服务部署
- 基建环境准备
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 - ">按需优化jvm,限制内存
[root@node1 /opt/elasticsearch]# vim config/jvm.options
- 创建普通用户
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 - http://10.2.3.13:9200/_template/k8s -d ‘{
“template” : “k8s“,
“index_patterns”: [“k8s“],
“settings”: {
“number_of_shards”: 5,
“number_of_replicas”: 0
}
}’">调整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
}
}’ - 基建资源准备
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 - 启动(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 - http://es.od.com:9200/_cat/indices?
">验证
]# curl http://es.od.com:9200/_cat/indices?
- 镜像资源
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">资源文件
https://gitee.com/crabluo/K8sFiles/tree/master/elk/kibana - 资源应用
kubectl apply -f . - https://www.yuque.com/crabluo/k8s/zdl28a#ouF85">地址解析
服务对应解析域名:kibana.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85 - ">页面效果

- Kibana生产实践用法
- ">时间选择器
选择指定时间段内产生的日志。
- ">环境选择器
根据不同的匹配规则创建了不同的索引,根据索引的不同以区分不同环境。
">项目选择器
根据项目名选择对应项目的日志。

- 关键字选择器
通过搜索指定关键字匹配内容。 - 匹配规则说明
日志收集架构
日志收集、分析的系统的特征
- 收集 能够采集多种来源的日志数据(流式日志收集器)
- 传输 能够稳定的把日志数据传输到中央系统(消息队列)
- 存储 可以将日志以结构化数据的形式存储起来(搜索引擎)
- 分析 支持方便的分析、检索方法,最好有GUI管理工具(前端)
- 警告 能够提供错误报告,监控机制(监控工具)
此文将针对ELK系统架构进行叙述
E ElasticSearch
L LogStash
K Kibana
传统ELK模型

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

容器日志环境实现
总体说明
要想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
2、配置日志
# 删除不要的日志(管理页面的日志,因为线上不需要tomcat的管理功能)
# 删除3manager,4host-manager的handlers
# 删除黄线部分
# 添加注释且将日志级别改为info
###制作镜像
#相关文件
[root@master1 /luomurui/gitee/K8sDockerfile/tomcat8]# ll
文件地址
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

#Jenkinsfile
pipeline {agent anystages {stage('pull') { //get project code from reposteps {sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"}}stage('build') { //exec mvn cmdsteps {sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"}}stage('unzip') { //unzip target/*.war -c target/project_dirsteps {sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && unzip *.war -d ./project_dir"}}stage('image') { //build image and push to registrysteps {writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}ADD ${params.target_dir}/project_dir /opt/tomcat/webapps/${params.root_url}"""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}"}}}}
资源清单应用
在基于原有的 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
34d2d006347c 39b994b6347b "/docker-entrypoint.…" 22 minutes ago Up 22 minutes k8s_filebeat_dubbo-demo-consumer-7754cd7df6-v9r4w_test_e35e8deb-70bc-4e40-9286-4f572e7f85ae_0c6e0769c169c c177ecc60e0d "/entrypoint.sh" 22 minutes ago Up 22 minutes k8s_dubbo-demo-consumer_dubbo-demo-consumer-7754cd7df6-v9r4w_test_e35e8deb-70bc-4e40-9286-4f572e7f85ae_094e4fd6e43e0 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 *
12K catalina.2020-06-28.log4.0K localhost.2020-06-28.log0 localhost_access_log.2020-06-28.txt16K 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
cluster.name: es.od.comnode.name: node1.host.compath.data: /data/elasticsearch/datapath.logs: /data/elasticsearch/logsbootstrap.memory_lock: truenetwork.host: 10.2.3.13http.port: 9200
说明:network.host是本机ip地址。
按需优化jvm,限制内存
[root@node1 /opt/elasticsearch]# vim config/jvm.options

创建普通用户
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
input {kafka {bootstrap_servers => "kafka.od.com:9092"client_id => "kafka.od.com"consumer_threads => 4group_id => "k8s_test"topics_pattern => "k8s-fb-test-.*"}}filter {json {source => "message"}}output {elasticsearch {hosts => ["es.od.com:9200"]index => "k8s-test-%{+YYYY.MM.DD}"}}
/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?

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
页面效果

Kibana生产实践用法
资源信息查看
点击左侧栏 Monitoring 选项,可看到相关资源信息。
创建不同环境的索引
依次点击 Management > Index Patterns 。

点击 Create index pattern 后,再点击左侧栏的 Discovery,可查看到页面已刷出日志。
开发使用培训
四个选择器
时间选择器
选择指定时间段内产生的日志。

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

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


关键字选择器
通过搜索指定关键字匹配内容。
以下将通过服务报错示例进行讲解!
将dubbo-demo-service的副本数调为0,则dubbo-demo-consumer将出现报错。
几分钟后在页面通过关键字搜索查看对应的报错信息。
常用的fields
timestamp
message
log.file.path
host.name
匹配规则说明
此处根据匹配规则,在配置文件中配置了报错的多行匹配为一行,即以时间戳为开头的内容匹配算为一行数据。此规则的好处是当服务出现报错时,看报错方便简洁,不需要看多行的大片日志。
