当前位置: 首页 > news >正文

Kubernetes 日志收集

目录

简介

一、哪些日志需要收集?

二、主流日志采集工具对比

1. ELK 与 EFK:传统日志平台的容器化演进

2. Filebeat:轻量级日志采集器

3. Loki:Kubernetes 原生轻量日志方案

三、案例:EFK 收集控制台日志

1. 环境准备

2. 部署步骤

(1)下载部署文件

(2)创建专用命名空间

(3)部署 Elasticsearch 集群

(4)部署 Kibana

(5)部署 Fluentd(日志采集)

3. 验证日志采集

(1)部署测试应用

(2)生成日志并查看

四、案例:Filebeat 收集自定义文件日志

1. 环境准备

2. 部署步骤

(1)安装 Helm

(2)部署 Kafka 和 Logstash

(3)部署应用与 Filebeat Sidecar

(4)验证日志流程

五、案例:Loki 日志系统

1. 部署步骤

(1)添加 Helm 仓库并下载 Chart

(2)部署 Loki Stack

(3)访问 Grafana 并查看日志

六、总结


简介

在 Kubernetes 集群中,日志是系统运行状态的 “晴雨表”,无论是故障排查、性能监控还是安全审计,都离不开高效的日志收集与分析能力。本文将介绍 Kubernetes 环境下的日志收集方案,从日志类型、工具选型到实战部署,助你构建完善的日志管理体系。

一、哪些日志需要收集?

在 Kubernetes 集群中,需重点收集的日志包括以下几类:

  1. 服务器系统日志:记录服务器硬件、操作系统(如 CPU、内存、磁盘)的运行状态,是排查底层问题的基础。
  2. Kubernetes 组件日志:如 kube-apiserver、kube-controller-manager 等核心组件的日志,反映集群控制平面的运行状态。
  3. 应用程序日志:容器化应用输出的业务日志,包括访问记录、错误信息等,是业务问题排查的关键。

此外,网关日志、服务调用链日志等也可能根据业务需求纳入采集范围。

二、主流日志采集工具对比

日志采集工具众多,选择时需结合资源消耗、功能适配性和运维复杂度综合考量。以下是主流工具的核心特性:

1. ELK 与 EFK:传统日志平台的容器化演进

  • ELK(Elasticsearch+Logstash+Kibana)
  • 组成:Logstash 负责日志采集与解析,Elasticsearch 存储,Kibana 可视化。
  • 优势:成熟稳定,适用于传统架构。
  • 缺陷:Logstash 资源消耗高(CPU / 内存占用大),配置复杂,不适合容器化环境。
  • EFK(Elasticsearch+Fluentd+Kibana)
  • 改进:用 Fluentd 替代 Logstash,轻量且配置简单,可直接采集控制台日志并输出到 Elasticsearch。
  • 局限:仅支持控制台日志采集,无法直接处理容器内的文件日志(需通过 Sidecar 容器转发,操作繁琐)。

2. Filebeat:轻量级日志采集器

  • 特性:基于 Go 语言开发,资源消耗极低(CPU / 内存可忽略),支持多种部署模式。
  • 适用场景
  • 以 Sidecar 模式与应用部署在同一 Pod 中,通过 Volume 共享日志文件,采集自定义文件日志。
  • 以 DaemonSet 模式部署在集群节点,采集系统日志或控制台日志。
  • 架构优化:通常与 Kafka(缓冲日志)、Logstash(日志处理)配合,减轻 Elasticsearch 压力。

3. Loki:Kubernetes 原生轻量日志方案

  • 核心优势
  • 不做全文索引,仅索引日志元数据(如 Pod 标签、命名空间),大幅降低存储和资源消耗。
  • 与 Prometheus 类似的服务发现机制,天然适配 Kubernetes,支持水平扩展和多租户。
  • 组成
  • Loki:日志存储与查询服务。
  • Promtail:日志采集代理,自动添加 Kubernetes 元数据(如 Pod 名、命名空间)。
  • Grafana:日志可视化界面(与 Loki 深度集成)。

三、案例:EFK 收集控制台日志

EFK 是 Kubernetes 官方推荐的控制台日志解决方案,以下是部署步骤及命令解析。

1. 环境准备

  • 前提:已安装 Kubernetes 集群(1.23+),节点可访问互联网(或使用离线包)。
  • 目标:部署 Elasticsearch 集群、Fluentd(日志采集)、Kibana(可视化),并验证日志采集功能。

2. 部署步骤

(1)下载部署文件
# 克隆GitHub仓库获取部署清单(离线环境可跳过,直接使用本地文件)
[root@k8s-master ~]# git clone https://github.com/dotbalo/k8s.git

解释:该仓库包含 EFK 部署所需的 YAML 配置文件,简化手动编写流程。

(2)创建专用命名空间
# 进入EFK配置目录
[root@k8s-master ~]# cd k8s/efk-7.10.2/
# 创建日志采集专用命名空间(隔离资源,便于管理)
[root@k8s-master efk-7.10.2]# kubectl create -f create-logging-namespace.yaml
namespace/logging created

解释:命名空间​​logging​​用于隔离日志相关组件(如 Elasticsearch、Fluentd),避免与业务资源冲突。

(3)部署 Elasticsearch 集群
# 创建Elasticsearch服务(暴露9200端口供Fluentd写入,9300端口供节点间通信)
[root@k8s-master efk-7.10.2]# kubectl create -f es-service.yaml
service/elasticsearch-logging created# 部署Elasticsearch StatefulSet(有状态应用,保证集群稳定性)
[root@k8s-master efk-7.10.2]# kubectl create -f es-statefulset.yaml
statefulset.apps/elasticsearch-logging created

验证:检查 Pod 状态(​​Running​​表示部署成功):

[root@k8s-master efk-7.10.2]# kubectl get pod -n logging
NAME                      READY  STATUS  RESTARTS  AGE
elasticsearch-logging-0   1/1    Running 0         5m

端口说明

  • 9200:HTTP API 端口,供 Fluentd、Kibana 访问。
  • 9300:节点间通信端口,用于集群选举、分片同步等。
(4)部署 Kibana
# 部署Kibana Deployment和Service(NodePort类型,便于外部访问)
[root@k8s-master efk-7.10.2]# kubectl create -f kibana-deployment.yaml -f kibana-service.yaml

验证:查看服务端口(Kibana 默认端口 5601,通过 NodePort 暴露):

[root@k8s-master efk-7.10.2]# kubectl get svc -n logging
NAME              TYPE       PORT(S)          AGE
kibana-logging   NodePort   5601:32734/TCP   34m

访问方式:通过节点 IP + 暴露的端口(如​​http://192.168.10.101:32734​​)访问 Kibana 界面。

(5)部署 Fluentd(日志采集)
# 修改Fluentd部署文件,通过NodeSelector指定采集节点
[root@k8s-master efk-7.10.2]# grep "nodeSelector" fluentd-es-ds.yaml -A3
nodeSelector:fluentd: "true"  # 仅部署在标记为fluentd=true的节点# 为目标节点添加标签
[root@k8s-master efk-7.10.2]# kubectl label node k8s-node01 fluentd=true
node/k8s-node01 labeled# 部署Fluentd DaemonSet(每个目标节点运行一个实例)
[root@k8s-master efk-7.10.2]# kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml

解释

  • NodeSelector 用于限制 Fluentd 部署范围,避免资源浪费。
  • ConfigMap 定义 Fluentd 配置,默认将日志输出到 Elasticsearch(通过​​elasticsearch-logging​​服务访问)。

3. 验证日志采集

(1)部署测试应用
# 创建Nginx Deployment和Service(生成访问日志)
[root@k8s-master efk-7.10.2]# cat <<EOF > nginx-service.yaml
apiVersion: v1
kind: Service
metadata:name: mynginxnamespace: default
spec:type: LoadBalancerports:- port: 80targetPort: 80selector:app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:name: mynginx-deployment
spec:replicas: 2selector:matchLabels:app: mynginxtemplate:metadata:labels:app: mynginxspec:containers:- name: mynginximage: nginx:1.15.2ports:- containerPort: 80
EOF# 部署应用
[root@k8s-master efk-7.10.2]# kubectl create -f nginx-service.yaml
(2)生成日志并查看
# 访问Nginx服务,触发日志输出
[root@k8s-master efk-7.10.2]# curl 192.168.10.101:32019  # 32019为Service暴露的端口

在 Kibana 中通过索引模式(如​​logstash-*​​)查看日志,验证采集结果。

四、案例:Filebeat 收集自定义文件日志

对于输出到文件的非云原生应用,需通过 Filebeat Sidecar 模式采集日志。以下是结合 Kafka 和 Logstash 的优化方案。

1. 环境准备

  • 工具:Helm(Kubernetes 包管理工具,简化 Zookeeper/Kafka 部署)。
  • 架构:Filebeat → Kafka(缓冲) → Logstash(处理) → Elasticsearch。

2. 部署步骤

(1)安装 Helm
# 下载并安装Helm客户端
[root@k8s-master ~]# wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/
(2)部署 Kafka 和 Logstash
# 部署Zookeeper(Kafka依赖)
[root@k8s-master ~]# cd /root/efk-7.10.2/filebeat/
[root@k8s-master filebeat]# helm install zookeeper zookeeper/ -n logging# 部署Kafka
[root@k8s-master filebeat]# helm install kafka kafka/ -n logging# 部署Logstash(从Kafka消费日志并转发到Elasticsearch)
[root@k8s-master filebeat]# kubectl create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging
(3)部署应用与 Filebeat Sidecar
# 创建应用和Filebeat配置(通过Volume共享日志目录)
[root@k8s-master filebeat]# kubectl create -f filebeat-cm.yaml -f app-filebeat.yaml -n logging

关键配置说明

  • 应用容器将日志写入​​/opt/date.log​​​,通过​​emptyDir​​与 Filebeat 共享该目录。
  • Filebeat 配置从​​/opt/date.log​​读取日志,并输出到 Kafka。
(4)验证日志流程
# 查看应用日志文件内容
[root@k8s-master filebeat]# kubectl exec -it <app-pod-name> -n logging -- tail /opt/date.log# 在Kibana中查看经过Logstash处理后的日志

五、案例:Loki 日志系统

Loki 适合追求轻量、低资源消耗的场景,以下是基于 Helm 的快速部署流程。

1. 部署步骤

(1)添加 Helm 仓库并下载 Chart
# 添加Grafana仓库(包含Loki相关Chart)
[root@k8s-master ~]# helm repo add grafana https://grafana.github.io/helm-charts
[root@k8s-master ~]# helm repo update# 下载Loki Stack Chart
[root@k8s-master ~]# helm pull grafana/loki-stack --version 2.8.3
(2)部署 Loki Stack
# 创建命名空间
[root@k8s-master ~]# kubectl create ns loki# 部署Loki、Promtail和Grafana(启用Grafana并暴露NodePort)
[root@k8s-master ~]# helm upgrade --install loki loki-stack \--set grafana.enabled=true \--set grafana.service.type=NodePort \-n loki
(3)访问 Grafana 并查看日志
# 查看Grafana服务端口
[root@k8s-master ~]# kubectl get svc -n loki
NAME           TYPE       PORT(S)          AGE
loki-grafana   NodePort   80:32734/TCP     2m40s# 获取Grafana管理员密码(base64解码)
[root@k8s-master ~]# kubectl get secret loki-grafana -n loki -o jsonpath="{.data.admin-password}" | base64 --decode && echo# 访问Grafana:http://<节点IP>:32734,登录后添加Loki数据源,使用查询语句过滤日志
# 示例:查询default命名空间下特定Pod的日志
{namespace="default", pod="mynginx-deployment-xxx"}

六、总结

Kubernetes 日志收集需根据场景选择工具:

  • 控制台日志优先选 EFK,配置简单但功能有限;
  • 文件日志推荐 Filebeat+Kafka+Logstash,兼顾轻量与扩展性;
  • 轻量、低成本需求首选 Loki,原生适配 Kubernetes 且资源消耗低。

日志系统的核心价值在于 “可观测性”,部署后需结合业务需求持续优化索引策略和存储方案,确保高效排查问题。

http://www.lryc.cn/news/597586.html

相关文章:

  • biji 1
  • 事务与索引:数据库核心机制详解
  • 解析云蝠智能 VoiceAgent 的技术架构与应用实践
  • Linux第三天Linux基础命令(二)
  • 不同地区的主要搜索引擎工具
  • 原创-基于 PHP 和 MySQL 的证书管理系统 第三版
  • Windows 用 Python3 快速搭建 HTTP 服务器
  • 网络基础DAY18-动态路由协议基础
  • 观影《长安的荔枝》有感:SwiftUI 中像“荔枝转运”的关键技术及启示
  • Linux文件fd
  • 架构师--缓存场景
  • vmware分配了ubuntu空间但是ubuntu没有获取
  • python---列表(List)
  • 龙虎榜——20250723
  • 【Linux系统】基础IO(上)
  • 数字化转型:概念性名词浅谈(第三十四讲)
  • Web前端开发:JavaScript遍历方法详解与对比
  • 文字识别接口-文档识别技术-手写文字识别
  • VRRP的概念及应用场景
  • 字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比
  • Python 程序设计讲义(8):Python 的基本数据类型——浮点数
  • day060-zabbix监控各种客户端
  • DPU 的基本运算单元是LUT吗?
  • 【笔记】wow-rag 第5课-流式部署
  • 进程间通信——POSIX 和 System V适用场景
  • c# sqlsuger 获取关联表中一个值
  • 插入的新节点非首节点
  • LLM 隐藏层特征增强技术
  • docker 离线安装postgres+postgis实践
  • Java TCP 通信详解:从基础到实战,彻底掌握面向连接的网络编程