k8s日志收集实战

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 简介 本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,一般情况下都需要收集存储到一个集中的日志管理系统中,可以方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题,及时修复应用所存在的问题。

简介

本文主要介绍在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.git
cd k8s-log
git checkout v1

# 创建 logging namespace
kubectl 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 节点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收集日志

# 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
复制代码

kibana查看日志

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

查看日志

应用日志收集测试

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

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

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

# 部署
kubectl apply -f log-contanier-file-filebeat.yaml

# 查看
kubectl get pods -o wide
复制代码

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

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

# 部署
kubectl apply -f log-contanier-file-fluentbit.yaml

# 查看
kubectl get pods -o wide
复制代码

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

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

# 本次测试应用直接输出日志到 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替代logstashfluent-bitfilebeat性能和内存占用相差不大

k8s集群日志通用收集方案

  • 集群内相关组件日志使用fluentd/filebeat收集
  • 应用输出到标准输出或标准错误输出的日志使用fluentd/filebeat收集
  • 应用输出到容器中指定文件日志使用fluent-bit/filebeat收集

通用日志收集系统

通用日志收集系统架构

架构说明

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

大流量日志收集系统

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

架构说明

  • 当日志流量过大时,如果每一个日志收集节点都直连队列写数据,由于有很多分散的连接及写请求,会给队列造成压力。如果日志都发送到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 启动较慢,可能需要等待数分钟才能看到数据

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

清理
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
复制代码

访问kibana查看日志

添加index k8s-logging-efk-*

创建图表

创建 Search

制作 Visualize 的时候需要使用

按指定条件搜索日志

保存 Search

创建 Visualize

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

选择制作 Visualize

选择 Visualize 类型

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

选择指定的 bucket

选择 code 字段进行统计

保存 Visualize

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

创建 Dashboard

选择创建 Dashboard

把 Visualize 添加到 Dashboard

保存 Dashboard

编辑调整位置和大小

最终图表展示

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

本文转自掘金- k8s日志收集实战
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
10天前
|
Java Maven Spring
超实用的SpringAOP实战之日志记录
【11月更文挑战第11天】本文介绍了如何使用 Spring AOP 实现日志记录功能。首先概述了日志记录的重要性及 Spring AOP 的优势,然后详细讲解了搭建 Spring AOP 环境、定义日志切面、优化日志内容和格式的方法,最后通过测试验证日志记录功能的准确性和完整性。通过这些步骤,可以有效提升系统的可维护性和可追踪性。
|
1月前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
23 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
453 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
2月前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
105 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
3月前
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
123 2
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
1月前
|
Kubernetes 网络协议 Docker
Kubernetes入门到进阶实战
Kubernetes入门到进阶实战
83 0
|
2月前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
73 0
|
2月前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
182 2
|
2月前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
125 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
下一篇
无影云桌面