1. 首页 > KubeSphere教程 > 正文

KubeSphere教程FG016-KubeSphere日志收集、检索与告警实战

内容简介

本文档详细介绍KubeSphere日志收集、检索与告警的实战操作,包括日志收集的核心概念、KubeSphere日志系统架构、日志收集的配置与部署、日志检索与分析、日志告警机制等内容。风哥教程参考KubeSphere官方文档日志相关章节,将官方内容转化为生产实用指南。

通过本文的学习,读者将掌握如何在KubeSphere中配置和使用日志系统,实现对集群和应用的日志收集、检索和告警,及时发现和解决问题,提高系统的可靠性和稳定性。

目录大纲

Part01-基础概念与理论知识

1.1 日志收集核心概念

日志收集是可观测性平台的重要组成部分,核心概念包括:

  • 日志源:产生日志的系统或应用,如容器、应用程序、操作系统等
  • 日志收集器:负责从日志源采集日志的组件,如Fluent Bit、Filebeat等
  • 日志存储:存储日志数据的系统,如Elasticsearch、Kafka等
  • 日志检索:查询和分析日志的功能,如Kibana、OpenSearch Dashboards等
  • 日志告警:基于日志内容触发的告警机制
  • 日志聚合:将分散的日志集中管理和分析的过程

1.2 KubeSphere日志系统架构

KubeSphere日志系统架构包括以下组件:

  • Fluent Bit:轻量级的日志收集器,部署在每个节点上,负责收集容器日志
  • Elasticsearch:开源的搜索引擎,用于存储和索引日志数据
  • Kibana:开源的数据可视化平台,用于查询和分析日志
  • KubeSphere日志组件:提供统一的日志管理界面,集成Elasticsearch和Kibana

1.3 日志类型与级别

日志类型与级别是日志管理的重要概念:

  • 日志类型:
    • 容器日志:容器运行产生的标准输出和标准错误
    • 应用日志:应用程序产生的业务日志
    • 系统日志:操作系统和Kubernetes组件产生的日志
    • 审计日志:记录系统操作的日志
  • 日志级别:
    • DEBUG:调试信息,详细的系统运行信息
    • INFO:一般信息,系统正常运行的状态信息
    • WARN:警告信息,可能出现的问题
    • ERROR:错误信息,已经出现的问题
    • FATAL:致命错误,系统无法继续运行

Part02-生产环境规划与建议

2.1 日志系统架构规划

日志系统架构规划需要考虑以下因素: 风哥提示:

  • 部署模式:
    • 单节点部署:适合小型环境,部署简单
    • 高可用部署:适合生产环境,提供冗余和负载均衡
  • 组件选择:
    • 日志收集器:Fluent Bit、Filebeat等
    • 存储系统:Elasticsearch、Kafka、Loki等
    • 可视化工具:Kibana、Grafana等
  • 网络架构:
    • 内部网络:确保日志收集器与存储系统之间的网络连接
    • 安全策略:配置适当的网络策略,保护日志数据

2.2 存储方案规划

存储方案规划需要考虑以下因素:

  • 存储类型:
    • 本地存储:部署简单,但可靠性较低
    • 分布式存储:提供更高的可靠性和扩展性
    • 云存储:适合云环境,按需付费
  • 存储容量:
    • 根据日志量和保留时间计算存储需求
    • 预留一定的缓冲空间,应对突发日志量
  • 数据保留策略:
    • 短期数据:保留7-14天,用于日常排查
    • 长期数据:保留30-90天,用于趋势分析
    • 归档数据:保留更长时间,用于审计和合规

2.3 日志收集策略设计

日志收集策略设计需要考虑以下因素:

  • 收集范围:
    • 容器日志:所有容器的标准输出和标准错误
    • 应用日志:应用程序产生的业务日志
    • 系统日志:操作系统和Kubernetes组件产生的日志
  • 收集频率:
    • 实时收集:适合需要及时处理的日志
    • 批量收集:适合对实时性要求不高的日志
  • 过滤策略:
    • 按级别过滤:只收集特定级别的日志
    • 按内容过滤:过滤掉不需要的日志内容
    • 按来源过滤:只收集特定来源的日志

Part03-生产环境项目实施方案

3.1 日志系统部署

日志系统部署的步骤如下:

# 步骤1:登录KubeSphere控制台
# 步骤2:进入集群管理页面
# 步骤3:选择可观测性选项卡
# 步骤4:点击启用日志系统
kubectl get pods -n kubesphere-logging-system
NAME READY STATUS RESTARTS AGE
elasticsearch-logging-data-0 1/1 Running 0 10m
elasticsearch-logging-data-1 1/1 Running 0 10m
elasticsearch-logging-master-0 1/1 Running 0 10m
elasticsearch-logging-master-1 1/1 Running 0 10m
kibana-logging-7f89b7c6d5-xyz 1/1 Running 0 10m
fluent-bit-xyz 1/1 Running 0 10m
fluent-bit-abc 1/1 Running 0 10m
fluent-bit-def 1/1 Running 0 10m

3.2 日志收集配置

日志收集配置的步骤如下: 学习交流加群风哥微信: itpux-com

# 步骤1:进入KubeSphere控制台
# 步骤2:进入项目
# 步骤3:选择日志管理
# 步骤4:配置日志收集规则
# 示例:配置应用日志收集
# 选择命名空间:fgedu-project
# 选择工作负载:fgedu-app
# 配置日志路径:/app/logs/*.log
# 点击保存

3.3 日志告警配置

日志告警配置的步骤如下:

# 步骤1:进入KubeSphere控制台
# 步骤2:进入项目
# 步骤3:选择监控与告警 -> 告警策略
# 步骤4:点击创建
# 示例:创建日志错误告警
# 告警名称:日志错误告警
# 监控目标:日志
# 条件:包含关键词 “ERROR”
# 持续时间:5分钟
# 通知方式:邮件、钉钉
# 点击确定

Part04-生产案例与实战讲解

4.1 容器日志收集实战

容器日志收集的实战案例:

# 1. 查看容器日志
kubectl logs -n fgedu-project fgedu-app-xyz
2024-01-01 10:00:00.000 INFO [main] com.fgedu.Application – Starting Application v1.0.0 on fgedu-app-xyz with PID 1
2024-01-01 10:00:01.000 INFO [main] com.fgedu.Application – No active profile set, falling back to default profiles: default
2024-01-01 10:00:02.000 INFO [main] com.fgedu.Application – Started Application in 1.5 seconds (JVM running for 2.0)
2024-01-01 10:00:03.000 INFO [http-nio-8080-exec-1] com.fgedu.controller.HomeController – GET /home
2024-01-01 10:00:04.000 ERROR [http-nio-8080-exec-2] com.fgedu.controller.UserController – Failed to get user: 123
java.lang.NullPointerException: null
at com.fgedu.service.UserService.getUser(UserService.java:42)
at com.fgedu.controller.UserController.getUser(UserController.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

4.2 应用日志收集实战

应用日志收集的实战案例: 学习交流加群风哥QQ113257174

# 1. 配置应用日志挂载
cat > fgedu-app.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: fgedu-app
namespace: fgedu-project
spec:
replicas: 3
selector:
matchLabels:
app: fgedu-app
template:
metadata:
labels:
app: fgedu-app
spec:
containers:
– name: fgedu-app
image: fgedu/app:v1.0.0
volumeMounts:
– name: logs
mountPath: /app/logs
volumes:
– name: logs
emptyDir: {}
EOF

kubectl apply -f fgedu-app.yaml
deployment.apps/fgedu-app created

# 2. 配置日志收集规则
cat > fluent-bit-config.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: kubesphere-logging-system
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Daemon off
Log_Level info
[INPUT]
Name tail
Path /app/logs/*.log
Tag app.log
Read_From_Head true
[OUTPUT]
Name es
Match *
Host elasticsearch-logging-data.kubesphere-logging-system.svc.cluster.local
Port 9200
Index fgedu-app-logs
Type _doc
EOF

kubectl apply -f fluent-bit-config.yaml
configmap/fluent-bit-config created

4.3 日志检索与分析实战

日志检索与分析的实战案例: 更多视频教程www.fgedu.net.cn

# 1. 访问KubeSphere日志管理
# 步骤:登录KubeSphere控制台 -> 进入项目 -> 日志管理

# 2. 执行日志查询
# 示例1:查询包含ERROR的日志
# 关键词:ERROR
# 时间范围:最近1小时
# 命名空间:fgedu-project

# 示例2:查询特定Pod的日志
# Pod:fgedu-app-xyz
# 时间范围:最近24小时

# 示例3:查询特定级别为ERROR的日志
# 级别:ERROR
# 时间范围:最近7天

# 3. 导出日志
# 步骤:在日志查询结果页面 -> 点击导出按钮 -> 选择导出格式(CSV/JSON)

4.4 日志告警配置实战

日志告警配置的实战案例:

# 1. 创建日志告警规则
cat > log-alert-rule.yaml << EOF
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: log-alert-rules
namespace: monitoring
spec:
groups:
– name: log-alerts
rules:
– alert: LogErrorRate
expr: sum(rate(fluentbit_output_status_retries_total{tag=”app.log”}[5m])) by (tag) > 0
for: 5m
labels:
severity: warning
annotations:
summary: High log error rate
description: “High error rate in logs for tag {{ $labels.tag }}”
EOF

kubectl apply -f log-alert-rule.yaml
prometheusrule.monitoring.coreos.com/log-alert-rules created

# 2. 配置告警通知渠道
# 步骤:登录KubeSphere控制台 -> 进入集群管理 -> 监控告警 -> 告警通知设置
# 配置邮件通知:
# SMTP服务器:smtp.example.com
# 端口:587
# 发件人:alert@example.com
# 收件人:ops@example.com

4.5 KubeSphere数据库日志收集实战案例

KubeSphere数据库日志收集的实战案例: 更多学习教程公众号风哥教程itpux_com

# 1. 部署MySQL并配置日志
cat > mysql-deployment.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: fgedu-mysql
namespace: fgedu-db
spec:
replicas: 1
selector:
matchLabels:
app: fgedu-mysql
template:
metadata:
labels:
app: fgedu-mysql
spec:
containers:
– name: mysql
image: mysql:8.0
env:
– name: MYSQL_ROOT_PASSWORD
value: “root123”
– name: MYSQL_DATABASE
value: “fgedudb”
– name: MYSQL_USER
value: “fgedu”
– name: MYSQL_PASSWORD
value: “fgedu123”
volumeMounts:
– name: mysql-data
mountPath: /var/lib/mysql
– name: mysql-logs
mountPath: /var/log/mysql
volumes:
– name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-pvc
– name: mysql-logs
emptyDir: {}
EOF

kubectl apply -f mysql-deployment.yaml
deployment.apps/fgedu-mysql created

# 2. 配置MySQL日志收集
cat > mysql-log-config.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-log-config
namespace: kubesphere-logging-system
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Daemon off
Log_Level info
[INPUT]
Name tail
Path /var/log/mysql/*.log
Tag mysql.log
Read_From_Head true
[OUTPUT]
Name es
Match *
Host elasticsearch-logging-data.kubesphere-logging-system.svc.cluster.local
Port 9200
Index mysql-logs
Type _doc
EOF

kubectl apply -f mysql-log-config.yaml
configmap/mysql-log-config created

# 3. 验证日志收集
# 步骤:登录KubeSphere控制台 -> 进入项目 -> 日志管理 -> 查询关键词 “mysql”

Part05-风哥经验总结与分享

5.1 日志系统最佳实践

在部署和使用日志系统时,应根据实际需求选择合适的组件和配置,避免过度收集日志导致存储和性能问题。 from K8S+DB视频:www.itpux.com

  • 根据业务需求选择合适的日志收集策略
  • 合理配置日志级别,避免收集过多的调试信息
  • 使用结构化日志格式,便于后续分析和处理
  • 建立日志保留策略,平衡存储成本和历史数据需求
  • 定期清理过期日志,保持存储系统的健康状态
  • 使用日志聚合工具,集中管理和分析日志数据

5.2 日志收集与存储最佳实践

  • 日志收集:
    • 使用轻量级的日志收集器,如Fluent Bit
    • 配置适当的日志过滤规则,减少不必要的日志
    • 使用批量发送机制,减少网络传输开销
    • 配置日志收集器的健康检查,确保其正常运行
  • 日志存储:
    • 使用高可用的存储方案,如Elasticsearch集群
    • 配置适当的索引策略,提高查询性能
    • 使用冷热分离存储,降低存储成本
    • 定期备份日志数据,确保数据安全
  • 日志分析:
    • 使用可视化工具,如Kibana,便于日志分析
    • 创建自定义仪表盘,监控关键指标
    • 使用机器学习工具,发现异常日志模式
    • 建立日志分析流程,及时发现和解决问题

5.3 常见问题与解决方案

在日志系统的使用过程中,常见的问题包括日志丢失、存储不足、查询性能慢等,需要根据具体情况进行排查和解决。

  • 问题:日志丢失
    • 解决方案:检查日志收集器状态;检查网络连接;配置适当的缓冲区
  • 问题:存储不足
    • 解决方案:调整日志保留策略;增加存储容量;清理过期日志
  • 问题:查询性能慢
    • 解决方案:优化索引结构;增加存储节点;使用查询缓存
  • 问题:日志收集器CPU使用率高
    • 解决方案:调整日志收集频率;增加过滤器;优化配置
  • 问题:告警风暴
    • 解决方案:调整告警阈值;配置告警抑制;优化告警策略

,日志系统是可观测性平台的重要组成部分,建议在生产环境部署前进行充分的测试和评估,确保系统的稳定性和可靠性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息