本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,通常状况下都须要收集存储到一个集中的日志管理系统中,能够方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题,及时修复应用所存在的问题。html
在k8s集群中应用通常有以下日志输出方式node
本文会综合部署上述日志收集方案。nginx
日志收集组件说明git
本次实验使用了3台虚拟机作k8s集群,每台虚拟机3G内存github
# 拉取文件 git clone https://github.com/mgxian/k8s-log.git cd k8s-log git checkout v1 # 建立 logging namespace kubectl apply -f logging-namespace.yaml 复制代码
# 本次部署虽然使用 StatefulSet 可是没有使用pv进行持久化数据存储 # pod重启以后,数据会丢失,生产环境必定要使用pv持久化存储数据 # 部署 kubectl apply -f elasticsearch.yaml # 查看状态 kubectl get pods,svc -n logging -o wide # 等待全部pod变成running状态 # 访问测试 # 若是测试都有数据返回表明部署成功 kubectl run curl -n logging --image=radial/busyboxplus:curl -i --tty nslookup elasticsearch-logging curl 'http://elasticsearch-logging:9200/_cluster/health?pretty' curl 'http://elasticsearch-logging:9200/_cat/nodes' exit # 清理测试 kubectl delete deploy curl -n logging 复制代码
# 部署 kubectl apply -f kibana.yaml # 查看状态 kubectl get pods,svc -n logging -o wide # 访问测试 # 浏览器访问下面输出的地址 看到 kibana 界面表明正常 # 11.11.11.112 为集群中某个 node 节点ip KIBANA_NODEPORT=$(kubectl get svc -n logging | grep kibana-logging | awk '{print $(NF-1)}' | awk -F[:/] '{print $2}') echo "http://11.11.11.112:$KIBANA_NODEPORT/" 复制代码
# fluentd 以 daemoset 方式部署 # 在每一个节点上启动fluentd容器,收集k8s组件,docker以及容器的日志 # 给每一个须要启动fluentd的节点打相关label # kubectl label node lab1 beta.kubernetes.io/fluentd-ds-ready=true kubectl label nodes --all beta.kubernetes.io/fluentd-ds-ready=true # 部署 kubectl apply -f fluentd-es-configmap.yaml kubectl apply -f fluentd-es-ds.yaml # 查看状态 kubectl get pods,svc -n logging -o wide 复制代码
建立
index fluentd-k8s-*
,因为须要拉取镜像启动容器,可能须要等待几分钟才能看到索引和数据web
查看日志redis
# 启动测试日志输出 kubectl run echo-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do echo log to stdout $count;sleep 1;count=$(($count+1));done' # 查看状态 kubectl get pods -o wide # 命令行查看日志 ECHO_TEST_POD=$(kubectl get pods | grep echo-test | awk '{print $1}') kubectl logs -f $ECHO_TEST_POD # 刷新 kibana 查看是否有新日志进入 复制代码
# 部署 kubectl apply -f log-contanier-file-filebeat.yaml # 查看 kubectl get pods -o wide 复制代码
添加
index filebeat-k8s-*
查看日志docker
# 部署 kubectl apply -f log-contanier-file-fluentbit.yaml # 查看 kubectl get pods -o wide 复制代码
添加
index fluentbit-k8s-*
查看日志json
# 本次测试应用直接输出日志到 elasticsearch # 部署 kubectl apply -f log-contanier-es.yaml # 查看 kubectl get pods -o wide 复制代码
添加
index k8s-app-*
查看日志浏览器
kubectl delete -f log-contanier-es.yaml kubectl delete -f log-contanier-file-fluentbit.yaml kubectl delete -f log-contanier-file-filebeat.yaml kubectl delete deploy echo-test 复制代码
本小节的图表以ELK技术栈展现说明,实际使用过程当中可使用EFK技术栈,使用
fluentd
代替logstash
,使用fluent-bit
代替filebeat
。因为fluentd
在内存占用和性能上有更好的优点,推荐使用fluentd
替代logstash
,fluent-bit
和filebeat
性能和内存占用相差不大
fluentd/filebeat
收集fluentd/filebeat
收集fluent-bit/filebeat
收集通用日志收集系统架构
架构说明
大流量日志收集系统架构图
架构说明
以收集nginx
日志为例,进行日志收集分析实验, 复用以前实验建立的elasticsearch,kibana
应用。实验采用大流量日志收集架构
# 部署 kubectl apply -f redis.yaml # 查看 kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f logstash-indexer.yaml # 查看 kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f logstash-shipper.yaml # 查看 kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f nginx-log-filebeat.yaml # 查看 kubectl get pods 复制代码
# 部署 kubectl run curl-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 $count" http://nginx-log-filebeat/ >/dev/null;sleep 1;count=$(($count+1));done' # 查看 kubectl get pods 复制代码
添加
index k8s-logging-elk-*
因为 logstash 启动较慢,可能须要等待数分钟才能看到数据
kubectl delete -f redis.yaml kubectl delete -f logstash-indexer.yaml kubectl delete -f logstash-shipper.yaml kubectl delete -f nginx-log-filebeat.yaml kubectl delete deploy curl-test 复制代码
因为fluentd官方不提供redis队列的支持,本次实验移除了redis队列。
# 部署 kubectl apply -f fluentd-indexer.yaml # 查看 kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f fluentd-shipper.yaml # 查看 kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f nginx-log-fluentbit.yaml # 查看 kubectl get pods 复制代码
# 部署 kubectl run curl-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 $count" http://nginx-log-fluentbit/ >/dev/null;sleep 1;count=$(($count+1));done' # 查看 kubectl get pod 复制代码
添加
index k8s-logging-efk-*
kubectl delete -f fluentd-indexer.yaml kubectl delete -f fluentd-shipper.yaml kubectl delete -f nginx-log-fluentbit.yaml kubectl delete deploy curl-test 复制代码
# 部署 indexer shipper fluentbit kubectl apply -f fluentd-indexer.yaml kubectl apply -f fluentd-shipper.yaml kubectl apply -f nginx-log-fluentbit.yaml # 查看 kubectl get pods kubectl get pods -n logging 复制代码
# 部署 kubectl apply -f web-load-gen.yaml # 查看 kubectl get pods 复制代码
添加
index k8s-logging-efk-*
制做 Visualize 的时候须要使用
按指定条件搜索日志
保存 Search
建立好的 Visualize 能够添加到 Dashboard 中
选择制做 Visualize
选择 Visualize 类型
选择使用上面步骤保存的 Search
选择指定的 bucket
选择 code 字段进行统计
保存 Visualize
使用如上的步骤建立多个 Visualize
选择建立 Dashboard
把 Visualize 添加到 Dashboard
保存 Dashboard
编辑调整位置和大小
最终图表展现
若是快速体验能够在 菜单 Managerment 的 Saved Ojects 标签直接使用导入功能,导入本次实验下载目录k8s-log下的
k8s-kibana-all.json
文件