1. 首页 > Linux教程 > 正文

Linux教程FG548-大规模K8s日志管理与分析

本文档风哥主要介绍Linux系统大规模Kubernetes日志管理与分析,包括K8s日志基础概念、日志类型介绍、日志处理流水线、Fluentd配置、Elasticsearch配置、Kibana配置以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档System administration等内容,适合系统管理员在生产环境中使用。

Part01-基础概念与理论知识

1.1 K8s日志基础概念

Kubernetes日志管理是确保集群可观测性的重要组成部分。Kubernetes日志主要包括:

  • 容器日志:容器的标准输出和标准错误输出
  • Pod日志:Pod中所有容器的日志集合
  • 节点日志:节点级别的系统日志,如kubelet、docker等
  • 集群组件日志:Kubernetes核心组件的日志,如API Server、etcd等
K8s日志核心概念:

  • 日志采集:从容器、Pod、节点等收集日志
  • 日志处理:对日志进行过滤、解析、转换
  • 日志存储:将处理后的日志存储到持久化存储中
  • 日志分析:对存储的日志进行查询、分析和可视化
  • 日志告警:基于日志内容触发告警

1.2 日志类型介绍

Kubernetes中的日志类型主要包括:

# 日志类型
– 应用日志:应用程序产生的业务日志
– 系统日志:操作系统和系统服务产生的日志
– 容器日志:容器运行时产生的日志
– K8s组件日志:Kubernetes核心组件产生的日志
– 网络日志:网络设备和服务产生的日志

# 日志格式
– 文本日志:普通文本格式,如Nginx、Apache日志
– JSON日志:结构化的JSON格式,便于解析和分析
– 二进制日志:二进制格式,需要特殊工具解析
– 结构化日志:具有固定格式的日志,如syslog

# 日志级别
– DEBUG:详细的调试信息
– INFO:一般信息
– WARN:警告信息
– ERROR:错误信息
– FATAL:致命错误信息

1.3 日志处理流水线

日志处理流水线是指从日志产生到日志分析的整个过程,主要包括:

  • 采集:使用日志采集器(如Fluentd、Fluent Bit)收集日志
  • 传输:将采集的日志传输到处理系统
  • 处理:对日志进行过滤、解析、转换等处理
  • 存储:将处理后的日志存储到存储系统(如Elasticsearch)
  • 分析:使用分析工具(如Kibana)对日志进行查询和分析
  • 告警:基于日志内容设置告警规则,触发告警

Part02-生产环境规划与建议

2.1 日志架构设计

生产环境日志架构设计要点:

# 日志架构
– 集中式日志:所有集群的日志集中到一个日志系统
– 分布式日志:每个集群有独立的日志系统,数据汇总到中心
– 混合式日志:核心集群集中日志,边缘集群分布式日志

# 日志层次
– 采集层:日志采集器,如Fluentd、Fluent Bit
– 传输层:日志传输系统,如Kafka、RabbitMQ
– 存储层:日志存储系统,如Elasticsearch、Splunk
– 分析层:日志分析工具,如Kibana、Grafana
– 告警层:日志告警系统,如AlertManager、Elastalert

# 日志数据流
– 容器日志 → 采集器 → 传输系统 → 存储系统 → 分析工具
– 节点日志 → 采集器 → 传输系统 → 存储系统 → 分析工具
– 集群组件日志 → 采集器 → 传输系统 → 存储系统 → 分析工具
学习交流加群风哥QQ113257174

2.2 日志策略制定

生产环境日志策略制定要点:

# 日志策略
– 全面采集:采集所有关键组件和应用的日志
– 重点采集:对核心业务和关键组件进行重点采集
– 分层采集:根据不同层次制定不同的采集策略
– 动态采集:根据业务负载调整采集频率

# 日志保留
– 热数据:最近7-30天的日志,存储在高性能存储中
– 温数据:30-90天的日志,存储在中等性能存储中
– 冷数据:90天以上的日志,存储在归档存储中
– 数据清理:定期清理过期日志,释放存储空间

# 日志安全
– 访问控制:对日志系统设置严格的访问控制
– 数据加密:对日志数据进行加密存储和传输
– 审计日志:记录日志系统的访问和操作日志
– 合规性:确保日志存储符合行业合规要求

2.3 日志存储规划

生产环境日志存储规划要点:

# 存储选择
– 小规模集群:Elasticsearch单机部署
– 中规模集群:Elasticsearch集群部署
– 大规模集群:Elasticsearch集群 + 冷存储

# 存储容量
– 预估每日日志量:根据应用数量和日志产生率
– 保留时间:根据业务需求和合规要求
– 冗余策略:使用副本提高可靠性
– 扩展策略:支持水平扩展存储容量

# 存储性能
– 写入性能:满足日志采集的写入需求
– 查询性能:满足日志分析的查询需求
– 索引优化:合理设置索引策略,提高查询性能
– 存储优化:使用压缩、分片等技术优化存储

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

3.1 Fluentd配置

3.1.1 安装Fluentd

# 使用Helm安装Fluentd
$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm install fluentd fluent/fluentd –namespace logging –create-namespace

# 查看Fluentd状态
$ kubectl get pods -n logging
NAME READY STATUS RESTARTS AGE
fluentd-2q4x2 1/1 Running 0 5m
fluentd-5b678 1/1 Running 0 5m
fluentd-7c89d 1/1 Running 0 5m

# 配置Fluentd
$ kubectl apply -f – << EOF apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: logging data: fluentd.conf: | @type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true @type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ


@type kubernetes_metadata


@type elasticsearch
host elasticsearch-master.logging
port 9200
logstash_format true
logstash_prefix kubernetes
include_tag_key true
tag_key @log_name
flush_interval 10s

EOF

# 更新Fluentd配置
$ kubectl patch daemonset fluentd -n logging –patch ‘{“spec”:{“template”:{“spec”:{“volumes”:[{“name”:”config-volume”,”configMap”:{“name”:”fluentd-config”}}]}}}’

3.2 Elasticsearch配置

3.2.1 安装Elasticsearch

# 使用Helm安装Elasticsearch
$ helm repo add elastic https://helm.elastic.co
$ helm install elasticsearch elastic/elasticsearch –namespace logging –create-namespace –set replicas=3

# 查看Elasticsearch状态
$ kubectl get pods -n logging
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 5m
elasticsearch-master-1 1/1 Running 0 5m
elasticsearch-master-2 1/1 Running 0 5m

# 查看Elasticsearch集群状态
$ kubectl exec -it elasticsearch-master-0 -n logging — curl -s http://localhost:9200/_cluster/health
{
“cluster_name” : “docker-cluster”,
“status” : “green”,
“timed_out” : false,
“number_of_nodes” : 3,
“number_of_data_nodes” : 3,
“active_primary_shards” : 0,
“active_shards” : 0,
“relocating_shards” : 0,
“initializing_shards” : 0,
“unassigned_shards” : 0,
“delayed_unassigned_shards” : 0,
“number_of_pending_tasks” : 0,
“number_of_in_flight_fetch” : 0,
“task_max_waiting_in_queue_millis” : 0,
“active_shards_percent_as_number” : 100.0
}

3.3 Kibana配置

3.3.1 安装Kibana

# 使用Helm安装Kibana
$ helm install kibana elastic/kibana –namespace logging –create-namespace

# 查看Kibana状态
$ kubectl get pods -n logging
NAME READY STATUS RESTARTS AGE
kibana-7d75c484b5-8x8x8 1/1 Running 0 5m

# 访问Kibana
$ kubectl port-forward svc/kibana 5601:5601 -n logging

# 配置Kibana索引模式
1. 访问 http://localhost:5601
2. 点击左侧菜单的”Management” -> “Stack Management”
3. 点击”Kibana” -> “Index Patterns”
4. 点击”Create index pattern”
5. 输入索引模式:kubernetes-*
6. 点击”Next step”
7. 选择时间字段:@timestamp
8. 点击”Create index pattern”

Part04-生产案例与实战讲解

4.1 ELK Stack日志系统案例

4.1.1 企业级ELK Stack部署

# 案例:企业级ELK Stack日志系统
# 环境:5节点K8s集群
# 目标:部署ELK Stack,实现日志集中管理和分析

# 1. 安装Elasticsearch
$ helm repo add elastic https://helm.elastic.co
$ helm install elasticsearch elastic/elasticsearch –namespace logging –create-namespace –set replicas=3

# 2. 安装Kibana
$ helm install kibana elastic/kibana –namespace logging

# 3. 安装Fluentd
$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm install fluentd fluent/fluentd –namespace logging

# 4. 配置Fluentd
$ kubectl apply -f – << EOF apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: logging data: fluentd.conf: | @type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true @type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ


@type kubernetes_metadata


@type elasticsearch
host elasticsearch-master.logging
port 9200
logstash_format true
logstash_prefix kubernetes
include_tag_key true
tag_key @log_name
flush_interval 10s

EOF

$ kubectl patch daemonset fluentd -n logging –patch ‘{“spec”:{“template”:{“spec”:{“volumes”:[{“name”:”config-volume”,”configMap”:{“name”:”fluentd-config”}}]}}}’

# 5. 部署应用
$ kubectl apply -f – << EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 EOF # 6. 查看日志 # 访问Kibana:http://localhost:5601 # 在Kibana中查看nginx的日志

4.2 Fluent Bit日志系统案例

4.2.1 企业级Fluent Bit部署

# 案例:企业级Fluent Bit日志系统
# 环境:3节点K8s集群
# 目标:部署Fluent Bit,实现轻量级日志采集

# 1. 安装Fluent Bit
$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm install fluent-bit fluent/fluent-bit –namespace logging –create-namespace

# 2. 配置Fluent Bit
$ kubectl apply -f – << EOF apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config namespace: logging data: fluent-bit.conf: | [SERVICE] Flush 1 Log_Level info [INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kubernetes.* Refresh_Interval 5 Mem_Buf_Limit 5MB [FILTER] Name kubernetes Match kubernetes.* Kube_URL https://kubernetes.default.svc:443 [OUTPUT] Name es Match * Host elasticsearch-master.logging Port 9200 Logstash_Format true Logstash_Prefix kubernetes Retry_Limit False EOF # 3. 更新Fluent Bit配置 $ kubectl patch daemonset fluent-bit -n logging --patch '{"spec":{"template":{"spec":{"volumes":[{"name":"config","configMap":{"name":"fluent-bit-config"}}]}}}' # 4. 查看Fluent Bit状态 $ kubectl get pods -n logging NAME READY STATUS RESTARTS AGE fluent-bit-2q4x2 1/1 Running 0 5m fluent-bit-5b678 1/1 Running 0 5m fluent-bit-7c89d 1/1 Running 0 5m # 5. 查看日志 # 访问Kibana:http://localhost:5601 # 在Kibana中查看应用日志

4.3 多集群日志管理案例

4.3.1 多集群日志管理系统部署

# 案例:多集群日志管理系统
# 环境:2个K8s集群
# 目标:部署多集群日志管理系统,集中管理所有集群的日志

# 1. 在中心集群部署Elasticsearch和Kibana
$ helm repo add elastic https://helm.elastic.co
$ helm install elasticsearch elastic/elasticsearch –namespace logging –create-namespace –set replicas=3
$ helm install kibana elastic/kibana –namespace logging

# 2. 在每个集群部署Fluentd,配置远程输出
$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm install fluentd fluent/fluentd –namespace logging –create-namespace

# 3. 配置Fluentd远程输出
$ kubectl apply -f – << EOF apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: logging data: fluentd.conf: | @type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true @type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ


@type kubernetes_metadata


@type elasticsearch
host elasticsearch-master.logging.fgedu.net.cn
port 9200
logstash_format true
logstash_prefix kubernetes-${CLUSTER_NAME}
include_tag_key true
tag_key @log_name
flush_interval 10s

EOF

# 4. 配置Kibana索引模式
# 访问Kibana:http://localhost:5601
# 创建索引模式:kubernetes-*

# 5. 查看多集群日志
# 在Kibana中查看所有集群的日志,统一管理和分析

Part05-风哥经验总结与分享

5.1 K8s日志管理最佳实践

Kubernetes日志管理最佳实践:

  • 选择合适的日志采集器:根据集群规模和性能需求选择Fluentd或Fluent Bit
  • 合理配置日志采集:只采集必要的日志,避免采集过多无用日志
  • 使用结构化日志:应用程序使用JSON等结构化格式输出日志,便于解析和分析
  • 设置合理的日志保留策略:根据业务需求和存储成本设置日志保留时间
  • 优化存储配置:使用Elasticsearch集群提高可靠性和性能
  • 建立日志分析流程:定期分析日志,发现问题和优化机会
  • 配置日志告警:基于日志内容设置告警规则,及时发现异常
  • 定期备份日志:对重要日志进行备份,确保可恢复性

5.2 常见问题与解决方案

# 常见问题与解决方案

## 1. 日志采集失败
– 原因:权限问题、路径错误、配置错误
– 解决方案:检查权限配置、确认日志路径、验证采集器配置

## 2. 日志丢失
– 原因:采集器故障、网络问题、存储容量不足
– 解决方案:监控采集器状态、检查网络连接、增加存储容量

## 3. 日志延迟
– 原因:采集频率过高、传输瓶颈、存储性能不足
– 解决方案:调整采集频率、优化传输配置、升级存储性能

## 4. 日志查询缓慢
– 原因:索引设计不当、查询语句复杂、存储性能不足
– 解决方案:优化索引设计、简化查询语句、升级存储性能

## 5. 存储容量不足
– 原因:日志产生量过大、保留时间过长、存储配置不当
– 解决方案:调整日志保留策略、增加存储容量、优化日志采集

5.3 性能调优建议

风哥针对

Ku

from PG视频:www.itpux.com

bernetes日志管理与分析性能调优建议:

  • 优化采集配置:调整采集频率、缓冲区大小等参数,提高采集性能
  • 使用Fluent Bit:对于大规模集群,使用Fluent Bit替代Fluentd,减少资源占用
  • 优化传输:使用Kafka等消息队列作为中间件,提高传输可靠性和性能
  • 优化存储:合理设置Elasticsearch分片、副本和索引策略,提高存储性能
  • 使用索引生命周期管理:自动管理索引的创建、滚动和删除,优化存储使用
  • 水平扩展:根据集群规模水平扩展Elasticsearch和采集器
  • 监控日志系统:监控日志系统本身的性能,确保其稳定运行
  • 定期维护:清理过期日志、优化索引、更新组件版本,保持系统性能

风哥提示:

Kubernetes日志管理与分析是确保集群可观测性的重要组成部分,合理的配置和优化可以提高系统的可靠性和可维护性。建议从日志架构设计开始,逐步优化日志采集、存储和分析配置。

持续优化:Kubernetes日志系统需要持续优化和调整,建议定期 review 日志配置和存储策略,确保日志系统能够满足业务需求。

风哥提示:

日志数据是系统运行状态的重要依据,一定要确保日志数据的完整性和准确性,以便及时发现和解决问题。from Linux:www.itpux.com

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

联系我们

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

微信号:itpux-com

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