为了账号安全,请及时绑定邮箱和手机立即绑定

k8s日志收集实战

标签:
Kubernetes

简介

本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,一般情况下都需要收集存储到一个集中的日志管理系统中,可以方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题,及时修复应用所存在的问题。

在k8s集群中应用一般有如下日志输出方式

  • 直接遵循docker官方建议把日志输出到标准输出或者标准错误输出

  • 输出日志到容器内指定目录中

  • 应用直接发送日志给日志收集系统

本文会综合部署上述日志收集方案。

日志收集组件说明

  • elastisearch 存储收集到的日志

  • kibana 可视化收集到的日志

  • logstash 汇总处理日志发送给elastisearch 存储

  • filebeat 读取容器或者应用日志文件处理发送给elastisearch或者logstash,也可用于汇总日志

  • fluentd 读取容器或者应用日志文件处理发送给elastisearch,也可用于汇总日志

  • fluent-bit 读取容器或者应用日志文件处理发送给elastisearch或者fluentd

部署

本次实验使用了3台虚拟机做k8s集群,每台虚拟机3G内存

部署前的准备

# 拉取文件git clone https://github.com/mgxian/k8s-log.gitcd k8s-log
git checkout v1# 创建 logging namespacekubectl apply -f logging-namespace.yaml

部署elastisearch

# 本次部署虽然使用 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

部署kibana

# 部署kubectl apply -f kibana.yaml# 查看状态kubectl get pods,svc -n logging -o wide# 访问测试# 浏览器访问下面输出的地址 看到 kibana 界面代表正常# 11.11.11.112 为集群中某个 node 节点ipKIBANA_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收集日志

# fluentd 以 daemoset 方式部署# 在每个节点上启动fluentd容器,收集k8s组件,docker以及容器的日志# 给每个需要启动fluentd的节点打相关label# kubectl label node lab1 beta.kubernetes.io/fluentd-ds-ready=truekubectl 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

kibana查看日志

创建index fluentd-k8s-*,由于需要拉取镜像启动容器,可能需要等待几分钟才能看到索引和数据

webp

image

webp

image

查看日志

webp

image

应用日志收集测试

应用日志输出到标准输出测试

# 启动测试日志输出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 查看是否有新日志进入

webp

image

应用日志输出到容器指定目录(filebeat收集)

# 部署kubectl apply -f log-contanier-file-filebeat.yaml# 查看kubectl get pods -o wide

添加index filebeat-k8s-* 查看日志

webp

image

应用日志输出到容器指定目录(fluent-bit收集)

# 部署kubectl apply -f log-contanier-file-fluentbit.yaml# 查看kubectl get pods -o wide

添加index fluentbit-k8s-* 查看日志

webp

image

应用直接发送日志到日志系统

# 本次测试应用直接输出日志到 elasticsearch# 部署kubectl apply -f log-contanier-es.yaml# 查看kubectl get pods -o wide

添加index k8s-app-* 查看日志

webp

image

清理

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替代logstashfluent-bitfilebeat性能和内存占用相差不大

k8s集群日志通用收集方案

  • 集群内相关组件日志使用fluentd/filebeat收集

  • 应用输出到标准输出或标准错误输出的日志使用fluentd/filebeat收集

  • 应用输出到容器中指定文件日志使用fluent-bit/filebeat收集

通用日志收集系统

通用日志收集系统架构

webp

image

架构说明

  • 日志收集与处理解耦

  • 由于收集和处理过程间加入了队列,当日志出现暴增时,可以避免分析处理节点被打垮,给分析处理节点足够时间消化日志数据

  • 日志分析处理节点可以动态伸缩

大流量日志收集系统

大流量日志收集系统架构图

webp

image

架构说明

  • 当日志流量过大时,如果每一个日志收集节点都直连队列写数据,由于有很多分散的连接及写请求,会给队列造成压力。如果日志都发送到logstash收集节点,再集中写入队列,会减轻队列压力。

应用日志收集实验(ELK技术栈)

以收集nginx日志为例,进行日志收集分析实验, 复用之前实验创建的elasticsearch,kibana应用。实验采用大流量日志收集架构

部署redis队列
# 部署kubectl apply -f redis.yaml# 查看kubectl get pods -n logging
部署indexer分析日志
# 部署kubectl apply -f logstash-indexer.yaml# 查看kubectl get pods -n logging
部署shipper集中日志
# 部署kubectl apply -f logstash-shipper.yaml# 查看kubectl get pods -n logging
部署nginx测试日志收集
# 部署kubectl apply -f nginx-log-filebeat.yaml# 查看kubectl get pods
持续访问nginx生成日志
# 部署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
访问kibana查看日志

添加index k8s-logging-elk-* 由于 logstash 启动较慢,可能需要等待数分钟才能看到数据

webp

image

清理
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

应用日志收集实验(EFK技术栈)

由于fluentd官方不提供redis队列的支持,本次实验移除了redis队列。

部署indexer分析日志
# 部署kubectl apply -f fluentd-indexer.yaml# 查看kubectl get pods -n logging
部署shipper集中日志
# 部署kubectl apply -f fluentd-shipper.yaml# 查看kubectl get pods -n logging
部署nginx测试日志收集
# 部署kubectl apply -f nginx-log-fluentbit.yaml# 查看kubectl get pods
持续访问nginx生成日志
# 部署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
访问kibana查看日志

添加index k8s-logging-efk-*

webp

image

清理
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 fluentbitkubectl apply -f fluentd-indexer.yamlkubectl apply -f fluentd-shipper.yamlkubectl apply -f nginx-log-fluentbit.yaml# 查看kubectl get podskubectl get pods -n logging

模拟用户访问

# 部署kubectl apply -f web-load-gen.yaml# 查看kubectl get pods

访问kibana查看日志

添加index k8s-logging-efk-*

webp

image

创建图表

创建 Search

制作 Visualize 的时候需要使用

按指定条件搜索日志

webp

image

保存 Search

webp

image

创建 Visualize

创建好的 Visualize 可以添加到 Dashboard 中

选择制作 Visualize

webp

image

选择 Visualize 类型

webp

image

选择使用上面步骤保存的 Search

webp

image

选择指定的 bucket

webp

image

选择 code 字段进行统计

webp

image

保存 Visualize

webp

image

使用如上的步骤创建多个 Visualize

webp

image

创建 Dashboard

选择创建 Dashboard

webp

image

把 Visualize 添加到 Dashboard

webp

image

保存 Dashboard

webp

image

编辑调整位置和大小

webp

image

最终图表展示

webp

image

如果快速体验可以在 菜单 Managerment 的 Saved Ojects 标签直接使用导入功能,导入本次实验下载目录k8s-log下的k8s-kibana-all.json文件

webp

image



作者:CountingStars_
链接:https://www.jianshu.com/p/604a7149a632


点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消